#ifndef _MEDIA_NODE_H
#define _MEDIA_NODE_H
#include <MediaDefs.h>
#include <Point.h>
#include <new>
class BBufferConsumer;
class BBufferProducer;
class BControllable;
class BFileInterface;
class BMediaAddOn;
class BTimeSource;
class media_node {
public:
media_node();
~media_node();
media_node_id node;
port_id port;
uint32 kind;
static const media_node null;
private:
uint32 _reserved_[3];
};
struct media_input {
media_input();
~media_input();
media_node node;
media_source source;
media_destination destination;
media_format format;
char name[B_MEDIA_NAME_LENGTH];
private:
uint32 _reserved_media_input_[4];
};
struct media_output {
media_output();
~media_output();
media_node node;
media_source source;
media_destination destination;
media_format format;
char name[B_MEDIA_NAME_LENGTH];
private:
uint32 _reserved_media_output_[4];
};
struct live_node_info {
live_node_info();
~live_node_info();
media_node node;
BPoint hint_point;
char name[B_MEDIA_NAME_LENGTH];
private:
char reserved[160];
};
struct media_request_info {
enum what_code {
B_SET_VIDEO_CLIPPING_FOR = 1,
B_REQUEST_FORMAT_CHANGE,
B_SET_OUTPUT_ENABLED,
B_SET_OUTPUT_BUFFERS_FOR,
B_FORMAT_CHANGED = 4097
};
what_code what;
int32 change_tag;
status_t status;
void* cookie;
void* user_data;
media_source source;
media_destination destination;
media_format format;
uint32 _reserved_[32];
};
struct media_node_attribute {
enum {
B_R40_COMPILED = 1,
B_USER_ATTRIBUTE_NAME = 0x1000000,
B_FIRST_USER_ATTRIBUTE
};
uint32 what;
uint32 flags;
int64 data;
};
namespace BPrivate {
namespace media {
class TimeSourceObject;
class SystemTimeSourceObject;
class BMediaRosterEx;
}
}
class BMediaNode {
protected:
virtual ~BMediaNode();
public:
enum run_mode {
B_OFFLINE = 1,
B_DECREASE_PRECISION,
B_INCREASE_LATENCY,
B_DROP_DATA,
B_RECORDING
};
BMediaNode* Acquire();
BMediaNode* Release();
const char* Name() const;
media_node_id ID() const;
uint64 Kinds() const;
media_node Node() const;
run_mode RunMode() const;
BTimeSource* TimeSource() const;
virtual port_id ControlPort() const;
virtual BMediaAddOn* AddOn(int32* internalID) const = 0;
enum node_error {
B_NODE_FAILED_START = 'TRI0',
B_NODE_FAILED_STOP = 'TRI1',
B_NODE_FAILED_SEEK = 'TRI2',
B_NODE_FAILED_SET_RUN_MODE = 'TRI3',
B_NODE_FAILED_TIME_WARP = 'TRI4',
B_NODE_FAILED_PREROLL = 'TRI5',
B_NODE_FAILED_SET_TIME_SOURCE_FOR = 'TRI6',
B_NODE_IN_DISTRESS = 'TRI7'
};
protected:
status_t ReportError(node_error what,
const BMessage* info = NULL);
status_t NodeStopped(bigtime_t performanceTime);
void TimerExpired(bigtime_t notifyPerformanceTime,
int32 cookie, status_t error = B_OK);
explicit BMediaNode(const char* name);
status_t WaitForMessage(bigtime_t waitUntil,
uint32 flags = 0, void* _reserved_ = 0);
virtual void Start(bigtime_t atPerformanceTime);
virtual void Stop(bigtime_t atPerformanceTime,
bool immediate);
virtual void Seek(bigtime_t toMediaTime,
bigtime_t atPerformanceTime);
virtual void SetRunMode(run_mode mode);
virtual void TimeWarp(bigtime_t atRealTime,
bigtime_t toPerformanceTime);
virtual void Preroll();
virtual void SetTimeSource(BTimeSource* timeSource);
public:
virtual status_t HandleMessage(int32 message, const void* data,
size_t size);
void HandleBadMessage(int32 code,
const void* buffer, size_t size);
void AddNodeKind(uint64 kind);
void* operator new(size_t size);
void* operator new(size_t size,
const std::nothrow_t&) throw();
void operator delete(void* ptr);
void operator delete(void* ptr,
const std::nothrow_t&) throw();
protected:
virtual status_t RequestCompleted(
const media_request_info & info);
virtual status_t DeleteHook(BMediaNode* node);
virtual void NodeRegistered();
public:
virtual status_t GetNodeAttributes(
media_node_attribute* _attributes,
size_t inMaxCount);
virtual status_t AddTimer(bigtime_t atPerformanceTime,
int32 cookie);
private:
friend class BTimeSource;
friend class BMediaRoster;
friend class BBufferProducer;
friend class BPrivate::media::TimeSourceObject;
friend class BPrivate::media::SystemTimeSourceObject;
friend class BPrivate::media::BMediaRosterEx;
int32 IncrementChangeTag();
int32 ChangeTag();
int32 MintChangeTag();
status_t ApplyChangeTag(int32 previouslyReserved);
private:
status_t _Reserved_MediaNode_0(void*);
status_t _Reserved_MediaNode_1(void*);
status_t _Reserved_MediaNode_2(void*);
status_t _Reserved_MediaNode_3(void*);
status_t _Reserved_MediaNode_4(void*);
virtual status_t _Reserved_MediaNode_5(void*);
virtual status_t _Reserved_MediaNode_6(void*);
virtual status_t _Reserved_MediaNode_7(void*);
virtual status_t _Reserved_MediaNode_8(void*);
virtual status_t _Reserved_MediaNode_9(void*);
virtual status_t _Reserved_MediaNode_10(void*);
virtual status_t _Reserved_MediaNode_11(void*);
virtual status_t _Reserved_MediaNode_12(void*);
virtual status_t _Reserved_MediaNode_13(void*);
virtual status_t _Reserved_MediaNode_14(void*);
virtual status_t _Reserved_MediaNode_15(void*);
BMediaNode();
BMediaNode(const BMediaNode& other);
BMediaNode& operator=(const BMediaNode& other);
private:
BMediaNode(const char* name,
media_node_id id, uint32 kinds);
void _InitObject(const char* name,
media_node_id id, uint64 kinds);
private:
media_node_id fNodeID;
BTimeSource* fTimeSource;
int32 fRefCount;
char fName[B_MEDIA_NAME_LENGTH];
run_mode fRunMode;
int32 _reserved[2];
uint64 fKinds;
media_node_id fTimeSourceID;
BBufferProducer* fProducerThis;
BBufferConsumer* fConsumerThis;
BFileInterface* fFileInterfaceThis;
BControllable* fControllableThis;
BTimeSource* fTimeSourceThis;
bool _reservedBool[4];
mutable port_id fControlPort;
uint32 _reserved_media_node_[8];
protected:
static int32 NewChangeTag();
private:
static int32 _m_changeTag;
};
#endif