#ifndef _BUFFER_PRODUCER_H
#define _BUFFER_PRODUCER_H
#include <MediaNode.h>
class BBuffer;
class BBufferGroup;
class BRegion;
namespace BPrivate {
namespace media {
class BMediaRosterEx;
}
}
class BBufferProducer : public virtual BMediaNode {
protected:
virtual ~BBufferProducer();
public:
enum {
B_CLIP_SHORT_RUNS = 1
};
static status_t ClipDataToRegion(int32 format, int32 size,
const void* data, BRegion* region);
media_type ProducerType();
protected:
explicit BBufferProducer(media_type producer_type
);
enum suggestion_quality {
B_ANY_QUALITY = 0,
B_LOW_QUALITY = 10,
B_MEDIUM_QUALITY = 50,
B_HIGH_QUALITY = 100
};
virtual status_t FormatSuggestionRequested(media_type type,
int32 quality, media_format* format) = 0;
virtual status_t FormatProposal(const media_source& output,
media_format* ioFormat) = 0;
virtual status_t FormatChangeRequested(
const media_source& source,
const media_destination& destination,
media_format* ioFormat,
int32* _deprecated_) = 0;
virtual status_t GetNextOutput(
int32* ioCookie,
media_output* _output) = 0;
virtual status_t DisposeOutputCookie(int32 cookie) = 0;
virtual status_t SetBufferGroup(const media_source& forSource,
BBufferGroup* group) = 0;
virtual status_t VideoClippingChanged(
const media_source& forSource,
int16 numShorts,
int16* clipData,
const media_video_display_info& display,
int32 * _deprecated_);
virtual status_t GetLatency(bigtime_t* _lantency);
virtual status_t PrepareToConnect(const media_source& what,
const media_destination& where,
media_format* format,
media_source* _source,
char* _name) = 0;
virtual void Connect(status_t error,
const media_source& source,
const media_destination& destination,
const media_format& format,
char* ioName) = 0;
virtual void Disconnect(const media_source& what,
const media_destination& where) = 0;
virtual void LateNoticeReceived(const media_source& what,
bigtime_t howMuch,
bigtime_t performanceTime) = 0;
virtual void EnableOutput(const media_source& what,
bool enabled, int32* _deprecated_) = 0;
virtual status_t SetPlayRate(int32 numer, int32 denom);
virtual status_t HandleMessage(int32 message, const void* data,
size_t size);
virtual void AdditionalBufferRequested(
const media_source& source,
media_buffer_id previousBuffer,
bigtime_t previousTime,
const media_seek_tag* previousTag
);
virtual void LatencyChanged(const media_source& source,
const media_destination& destination,
bigtime_t newLatency, uint32 flags);
status_t SendBuffer(BBuffer* buffer,
const media_source& source,
const media_destination& destination);
status_t SendDataStatus(int32 status,
const media_destination& destination,
bigtime_t atTime);
status_t ProposeFormatChange(media_format* format,
const media_destination& forDestination);
status_t ChangeFormat(const media_source& forSource,
const media_destination& forDestination,
media_format* format);
status_t FindLatencyFor(
const media_destination& forDestination,
bigtime_t* _latency,
media_node_id* _timesource);
status_t FindSeekTag(
const media_destination& forDestination,
bigtime_t inTargetTime,
media_seek_tag* _tag,
bigtime_t* _taggedTime, uint32* _flags = 0,
uint32 flags = 0);
void SetInitialLatency(bigtime_t inInitialLatency,
uint32 flags = 0);
private:
BBufferProducer();
BBufferProducer(const BBufferProducer& other);
BBufferProducer& operator=(const BBufferProducer& other);
status_t _Reserved_BufferProducer_0(void*);
status_t _Reserved_BufferProducer_1(void*);
virtual status_t _Reserved_BufferProducer_2(void*);
virtual status_t _Reserved_BufferProducer_3(void*);
virtual status_t _Reserved_BufferProducer_4(void*);
virtual status_t _Reserved_BufferProducer_5(void*);
virtual status_t _Reserved_BufferProducer_6(void*);
virtual status_t _Reserved_BufferProducer_7(void*);
virtual status_t _Reserved_BufferProducer_8(void*);
virtual status_t _Reserved_BufferProducer_9(void*);
virtual status_t _Reserved_BufferProducer_10(void*);
virtual status_t _Reserved_BufferProducer_11(void*);
virtual status_t _Reserved_BufferProducer_12(void*);
virtual status_t _Reserved_BufferProducer_13(void*);
virtual status_t _Reserved_BufferProducer_14(void*);
virtual status_t _Reserved_BufferProducer_15(void*);
status_t SendBuffer(BBuffer* buffer,
const media_destination& destination);
private:
friend class BBufferConsumer;
friend class BMediaNode;
friend class BMediaRoster;
friend class BPrivate::media::BMediaRosterEx;
static status_t clip_shorts_to_region(const int16* data,
int count, BRegion* output);
static status_t clip_region_to_shorts(const BRegion* input,
int16* data, int maxCount, int* _count);
private:
media_type fProducerType;
bigtime_t fInitialLatency;
uint32 fInitialFlags;
bigtime_t fDelay;
uint32 _reserved_buffer_producer_[12];
};
#endif