MediaConnection: Review format negotiation mechanism

This commit is contained in:
Barrett17
2018-03-01 17:09:24 +01:00
parent 182ec76b44
commit 6dc7d85423
8 changed files with 137 additions and 105 deletions
@@ -67,8 +67,12 @@ typedef struct media_connection {
BMessage* ToMessage() const;
private:
media_input _MediaInput() const;
media_output _MediaOutput() const;
// NOTE: We are doing this on purpose to avoid redundancy we
// want to build the input/output on the fly. In pratice, the
// only thing that can change is the format which is kept updated
// to reflect the current status of this connection.
media_input _BuildMediaInput() const;
media_output _BuildMediaOutput() const;
const media_source& _Source() const;
const media_destination& _Destination() const;
@@ -84,6 +88,9 @@ private:
media_source source;
media_destination destination;
// This format always reflect the most updated format depending
// on the connection phase.
media_format format;
char name[B_MEDIA_NAME_LENGTH];
@@ -43,12 +43,6 @@ public:
// return media_connection::null otherwise.
media_connection Endpoint();
// This allow to specify a format that will be used while
// connecting to another node.
void SetAcceptedFormat(
const media_format& format);
const media_format& AcceptedFormat() const;
// Represents the buffer size, implement it to return the buffer size
// you decided for this connection.
// TODO: Do we want this (and ChainSize) moved on the output side?
@@ -125,13 +119,14 @@ protected:
virtual ~BMediaInput();
// Callbacks
virtual status_t AcceptFormat(media_format* format) = 0;
virtual void HandleBuffer(BBuffer* buffer);
virtual void Connected(const media_format& format);
virtual void Disconnected();
private:
media_input _MediaInput() const;
virtual void _ReservedMediaInput0();
virtual void _ReservedMediaInput1();
@@ -156,8 +151,8 @@ protected:
virtual ~BMediaOutput();
// Callbacks
virtual status_t PrepareToConnect(media_format* format);
virtual status_t FormatProposal(media_format* format);
virtual status_t PrepareToConnect(media_format* format) = 0;
virtual status_t FormatProposal(media_format* format) = 0;
// When a connection is not binded with another, and you really don't want
// to use BMediaGraph it's your job to send the buffer to the connection
@@ -170,7 +165,6 @@ protected:
virtual void Disconnected();
private:
media_output _MediaOutput() const;
// TODO: possibly unneeded.
void _SetEnabled(bool enabled);
@@ -117,6 +117,12 @@ public:
virtual size_t BufferSize() const;
virtual void SetBufferSize(size_t bufferSize);
// This allow to specify a format that will be used while
// connecting to another node.
void SetAcceptedFormat(
const media_format& format);
const media_format& AcceptedFormat() const;
protected:
BSimpleMediaConnection(
media_connection_kinds kinds);
@@ -128,6 +134,8 @@ protected:
void* fBufferCookie;
size_t fBufferSize;
media_format fAcceptedFormat;
};
@@ -138,10 +146,12 @@ public:
protected:
virtual ~BSimpleMediaInput();
virtual void Connected(const media_format& format);
virtual void Disconnected();
virtual status_t AcceptFormat(media_format* format);
virtual void HandleBuffer(BBuffer* buffer);
virtual void Connected(const media_format& format);
virtual void Disconnected();
};
@@ -152,10 +162,11 @@ public:
protected:
virtual ~BSimpleMediaOutput();
virtual status_t PrepareToConnect(media_format* format);
virtual status_t FormatProposal(media_format* format);
virtual void Connected(const media_format& format);
virtual void Disconnected();
virtual status_t FormatProposal(media_format* format);
};