#if !defined(_MEDIA_DEMULTIPLEXER_NODE_H)
#define _MEDIA_DEMULTIPLEXER_NODE_H
#include <MediaDefs.h>
#include <MediaNode.h>
#include <BufferConsumer.h>
#include <BufferProducer.h>
#include <MediaEventLooper.h>
#include <BufferGroup.h>
#include <vector>
#include "MediaOutputInfo.h"
class MediaDemultiplexerNode :
public BBufferConsumer,
public BBufferProducer,
public BMediaEventLooper
{
protected:
virtual ~MediaDemultiplexerNode(void);
public:
explicit MediaDemultiplexerNode(
const flavor_info * info = 0,
BMessage * config = 0,
BMediaAddOn * addOn = 0);
virtual status_t InitCheck(void) const;
virtual status_t GetConfigurationFor(
BMessage * into_message);
public:
virtual BMediaAddOn* AddOn(
int32 * internal_id) const;
protected:
virtual void Start(
bigtime_t performance_time);
virtual void Stop(
bigtime_t performance_time,
bool immediate);
virtual void Seek(
bigtime_t media_time,
bigtime_t performance_time);
virtual void SetRunMode(
run_mode mode);
virtual void TimeWarp(
bigtime_t at_real_time,
bigtime_t to_performance_time);
virtual void Preroll(void);
virtual void SetTimeSource(
BTimeSource * time_source);
public:
virtual status_t HandleMessage(
int32 message,
const void * data,
size_t size);
protected:
virtual status_t RequestCompleted(
const media_request_info & info);
protected:
virtual status_t DeleteHook(BMediaNode * node);
virtual void NodeRegistered(void);
public:
virtual status_t GetNodeAttributes(
media_node_attribute * outAttributes,
size_t inMaxCount);
virtual status_t AddTimer(
bigtime_t at_performance_time,
int32 cookie);
virtual status_t AcceptFormat(
const media_destination & dest,
media_format * format);
virtual status_t GetNextInput(
int32 * cookie,
media_input * out_input);
virtual void DisposeInputCookie(
int32 cookie);
virtual void BufferReceived(
BBuffer * buffer);
virtual void ProducerDataStatus(
const media_destination & for_whom,
int32 status,
bigtime_t at_performance_time);
virtual status_t GetLatencyFor(
const media_destination & for_whom,
bigtime_t * out_latency,
media_node_id * out_timesource);
virtual status_t Connected(
const media_source & producer,
const media_destination & where,
const media_format & with_format,
media_input * out_input);
virtual void Disconnected(
const media_source & producer,
const media_destination & where);
virtual status_t FormatChanged(
const media_source & producer,
const media_destination & consumer,
int32 change_tag,
const media_format & format);
virtual status_t SeekTagRequested(
const media_destination & destination,
bigtime_t in_target_time,
uint32 in_flags,
media_seek_tag * out_seek_tag,
bigtime_t * out_tagged_time,
uint32 * out_flags);
protected:
virtual status_t FormatSuggestionRequested(
media_type type,
int32 quality,
media_format * format);
virtual status_t FormatProposal(
const media_source & output,
media_format * format);
virtual status_t FormatChangeRequested(
const media_source & source,
const media_destination & destination,
media_format * io_format,
int32 * _deprecated_);
virtual status_t GetNextOutput(
int32 * cookie,
media_output * out_output);
virtual status_t DisposeOutputCookie(
int32 cookie);
virtual status_t SetBufferGroup(
const media_source & for_source,
BBufferGroup * group);
virtual status_t VideoClippingChanged(
const media_source & for_source,
int16 num_shorts,
int16 * clip_data,
const media_video_display_info & display,
int32 * _deprecated_);
virtual status_t GetLatency(
bigtime_t * out_latency);
virtual status_t PrepareToConnect(
const media_source & what,
const media_destination & where,
media_format * format,
media_source * out_source,
char * out_name);
virtual void Connect(
status_t error,
const media_source & source,
const media_destination & destination,
const media_format & format,
char * io_name);
virtual void Disconnect(
const media_source & what,
const media_destination & where);
virtual void LateNoticeReceived(
const media_source & what,
bigtime_t how_much,
bigtime_t performance_time);
virtual void EnableOutput(
const media_source & what,
bool enabled,
int32 * _deprecated_);
virtual status_t SetPlayRate(
int32 numer,
int32 denom);
virtual void AdditionalBufferRequested(
const media_source & source,
media_buffer_id prev_buffer,
bigtime_t prev_time,
const media_seek_tag * prev_tag);
virtual void LatencyChanged(
const media_source & source,
const media_destination & destination,
bigtime_t new_latency,
uint32 flags);
protected:
virtual void HandleEvent( const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
virtual void CleanUpEvent(const media_timed_event *event);
virtual bigtime_t OfflineTime();
virtual void ControlLoop();
protected:
virtual status_t HandleStart(
const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
virtual status_t HandleSeek(
const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
virtual status_t HandleWarp(
const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
virtual status_t HandleStop(
const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
virtual status_t HandleBuffer(
const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
virtual status_t HandleDataStatus(
const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
virtual status_t HandleParameter(
const media_timed_event *event,
bigtime_t lateness,
bool realTimeEvent = false);
protected:
void CreateBufferGroup(MediaOutputInfo * output_info);
void ComputeInternalLatency();
public:
static void GetFlavor(flavor_info * outInfo, int32 id);
private:
static void GetInputFormat(media_format * outFormat);
static void GetOutputFormat(media_format * outFormat);
protected:
virtual status_t AddRequirements(media_format * format);
private:
MediaDemultiplexerNode(
const MediaDemultiplexerNode & clone);
MediaDemultiplexerNode & operator=(
const MediaDemultiplexerNode & clone);
status_t fInitCheckStatus;
BMediaAddOn * fAddOn;
media_input input;
vector<MediaOutputInfo> outputs;
bigtime_t fDownstreamLatency;
bigtime_t fInternalLatency;
virtual status_t _Reserved_MediaDemultiplexerNode_0(void *);
virtual status_t _Reserved_MediaDemultiplexerNode_1(void *);
virtual status_t _Reserved_MediaDemultiplexerNode_2(void *);
virtual status_t _Reserved_MediaDemultiplexerNode_3(void *);
virtual status_t _Reserved_MediaDemultiplexerNode_4(void *);
virtual status_t _Reserved_MediaDemultiplexerNode_5(void *);
virtual status_t _Reserved_MediaDemultiplexerNode_6(void *);
virtual status_t _Reserved_MediaDemultiplexerNode_7(void *);
virtual status_t _Reserved_MediaDemultiplexerNode_8(void *);
virtual status_t _Reserved_MediaDemultiplexerNode_9(void *);
virtual status_t _Reserved_MediaDemultiplexerNode_10(void *);
virtual status_t _Reserved_MediaDemultiplexerNode_11(void *);
virtual status_t _Reserved_MediaDemultiplexerNode_12(void *);
virtual status_t _Reserved_MediaDemultiplexerNode_13(void *);
virtual status_t _Reserved_MediaDemultiplexerNode_14(void *);
virtual status_t _Reserved_MediaDemultiplexerNode_15(void *);
uint32 _reserved_media_demultiplexer_node_[16];
};
#endif