#ifndef _MEDIA_DEFS_H
#define _MEDIA_DEFS_H
#include <OS.h>
#include <ByteOrder.h>
#if defined(__cplusplus)
# include <GraphicsDefs.h>
# include <Looper.h>
class media_node;
#else
struct media_node;
#endif
#define B_MEDIA_NAME_LENGTH 64
enum {
B_MEDIA_WILDCARD = 'TRWC',
B_MEDIA_NODE_CREATED = 'TRIA',
B_MEDIA_NODE_DELETED,
B_MEDIA_CONNECTION_MADE,
B_MEDIA_CONNECTION_BROKEN,
B_MEDIA_BUFFER_CREATED,
B_MEDIA_BUFFER_DELETED,
B_MEDIA_TRANSPORT_STATE,
B_MEDIA_PARAMETER_CHANGED,
B_MEDIA_FORMAT_CHANGED,
B_MEDIA_WEB_CHANGED,
B_MEDIA_DEFAULT_CHANGED,
B_MEDIA_NEW_PARAMETER_VALUE,
B_MEDIA_NODE_STOPPED,
B_MEDIA_FLAVORS_CHANGED,
B_MEDIA_SERVER_STARTED,
B_MEDIA_SERVER_QUIT
};
enum media_type {
B_MEDIA_NO_TYPE = -1,
B_MEDIA_UNKNOWN_TYPE = 0,
B_MEDIA_RAW_AUDIO = 1,
B_MEDIA_RAW_VIDEO,
B_MEDIA_VBL,
B_MEDIA_TIMECODE,
B_MEDIA_MIDI,
B_MEDIA_TEXT,
B_MEDIA_HTML,
B_MEDIA_MULTISTREAM,
B_MEDIA_PARAMETERS,
B_MEDIA_ENCODED_AUDIO,
B_MEDIA_ENCODED_VIDEO,
B_MEDIA_PRIVATE = 90000,
B_MEDIA_FIRST_USER_TYPE = 100000
};
enum node_kind {
B_BUFFER_PRODUCER = 0x1,
B_BUFFER_CONSUMER = 0x2,
B_TIME_SOURCE = 0x4,
B_CONTROLLABLE = 0x8,
B_FILE_INTERFACE = 0x10,
B_ENTITY_INTERFACE = 0x20,
B_PHYSICAL_INPUT = 0x10000,
B_PHYSICAL_OUTPUT = 0x20000,
B_SYSTEM_MIXER = 0x40000
};
enum video_orientation {
B_VIDEO_TOP_LEFT_RIGHT = 1,
B_VIDEO_BOTTOM_LEFT_RIGHT
};
enum media_flags
{
B_MEDIA_FLAGS_VERSION = 1,
B_MEDIA_FLAGS_PRIVATE = 0x40000000
};
enum media_producer_status {
B_DATA_NOT_AVAILABLE = 1,
B_DATA_AVAILABLE = 2,
B_PRODUCER_STOPPED = 3
};
enum media_realtime_flags {
B_MEDIA_REALTIME_ALLOCATOR = 0x1,
B_MEDIA_REALTIME_AUDIO = 0x2,
B_MEDIA_REALTIME_VIDEO = 0x4,
B_MEDIA_REALTIME_ANYKIND = 0xffff
};
enum media_frame_flags {
B_MEDIA_KEY_FRAME = 0x1
};
#define B_MEDIA_ANY_QUALITY 0.0f
#define B_MEDIA_LOW_QUALITY 0.1f
#define B_MEDIA_MEDIUM_QUALITY 0.5f
#define B_MEDIA_HIGH_QUALITY 1.0f
#ifndef _MULTI_AUDIO_H
enum media_multi_channels {
B_CHANNEL_LEFT = 0x00001,
B_CHANNEL_RIGHT = 0x00002,
B_CHANNEL_CENTER = 0x00004,
B_CHANNEL_SUB = 0x00008,
B_CHANNEL_REARLEFT = 0x00010,
B_CHANNEL_REARRIGHT = 0x00020,
B_CHANNEL_FRONT_LEFT_CENTER = 0x00040,
B_CHANNEL_FRONT_RIGHT_CENTER = 0x00080,
B_CHANNEL_BACK_CENTER = 0x00100,
B_CHANNEL_SIDE_LEFT = 0x00200,
B_CHANNEL_SIDE_RIGHT = 0x00400,
B_CHANNEL_TOP_CENTER = 0x00800,
B_CHANNEL_TOP_FRONT_LEFT = 0x01000,
B_CHANNEL_TOP_FRONT_CENTER = 0x02000,
B_CHANNEL_TOP_FRONT_RIGHT = 0x04000,
B_CHANNEL_TOP_BACK_LEFT = 0x08000,
B_CHANNEL_TOP_BACK_CENTER = 0x10000,
B_CHANNEL_TOP_BACK_RIGHT = 0x20000
};
enum media_multi_matrix {
B_MATRIX_PROLOGIC_LR = 0x1,
B_MATRIX_AMBISONIC_WXYZ = 0x4
};
#endif
typedef int32 media_node_id;
typedef int32 media_buffer_id;
typedef int32 media_addon_id;
#if defined(__cplusplus)
struct media_destination {
media_destination();
media_destination(port_id, int32);
media_destination(
const media_destination& other);
~media_destination();
media_destination& operator=(const media_destination& other);
port_id port;
int32 id;
static media_destination null;
private:
uint32 _reserved_media_destination_[2];
};
struct media_source {
media_source();
media_source(port_id, int32);
media_source(const media_source& other);
~media_source();
media_source& operator=(const media_source& other);
port_id port;
int32 id;
static media_source null;
private:
uint32 _reserved_media_source_[2];
};
bool operator==(const media_destination& a, const media_destination& b);
bool operator!=(const media_destination& a, const media_destination& b);
bool operator<(const media_destination& a, const media_destination& b);
bool operator==(const media_source& a, const media_source& b);
bool operator!=(const media_source& a, const media_source& b);
bool operator<(const media_source& a, const media_source& b);
bool operator==(const media_node& a, const media_node& b);
bool operator!=(const media_node& a, const media_node& b);
bool operator<(const media_node& a, const media_node& b);
enum {
B_MEDIA_BIG_ENDIAN = 1,
B_MEDIA_LITTLE_ENDIAN = 2,
#if B_HOST_IS_BENDIAN
B_MEDIA_HOST_ENDIAN = B_MEDIA_BIG_ENDIAN
#else
B_MEDIA_HOST_ENDIAN = B_MEDIA_LITTLE_ENDIAN
#endif
};
struct media_multi_audio_format;
struct media_raw_audio_format {
enum {
B_AUDIO_FLOAT = 0x24,
B_AUDIO_DOUBLE = 0x28,
B_AUDIO_INT = 0x4,
B_AUDIO_SHORT = 0x2,
B_AUDIO_UCHAR = 0x11,
B_AUDIO_CHAR = 0x1,
B_AUDIO_SIZE_MASK = 0xf
};
float frame_rate;
uint32 channel_count;
uint32 format;
uint32 byte_order;
size_t buffer_size;
static const media_multi_audio_format wildcard;
};
struct media_audio_header {
int32 _reserved_[14];
float frame_rate;
uint32 channel_count;
};
struct media_multi_audio_info {
uint32 channel_mask;
int16 valid_bits;
uint16 matrix_mask;
uint32 _reserved_b[3];
};
struct media_multi_audio_format : public media_raw_audio_format,
public media_multi_audio_info {
static const media_multi_audio_format wildcard;
};
struct media_encoded_audio_format {
enum audio_encoding {
B_ANY
};
media_raw_audio_format output;
audio_encoding encoding;
float bit_rate;
size_t frame_size;
media_multi_audio_info multi_info;
uint32 _reserved_[3];
static const media_encoded_audio_format wildcard;
};
struct media_encoded_audio_header {
int32 _reserved_0[14];
uint32 buffer_flags;
uchar unused_mask;
uchar _reserved_2[3];
};
enum media_display_flags {
B_F1_DOMINANT = 0x1,
B_F2_DOMINANT = 0x2,
B_TOP_SCANLINE_F1 = 0x4,
B_TOP_SCANLINE_F2 = 0x8
};
struct media_video_display_info {
color_space format;
uint32 line_width;
uint32 line_count;
uint32 bytes_per_row;
uint32 pixel_offset;
uint32 line_offset;
uint32 flags;
uint32 _reserved_[3];
static const media_video_display_info wildcard;
};
struct media_raw_video_format {
float field_rate;
uint32 interlace;
uint32 first_active;
uint32 last_active;
uint32 orientation;
uint16 pixel_width_aspect;
uint16 pixel_height_aspect;
media_video_display_info display;
static const media_raw_video_format wildcard;
};
struct media_video_header {
uint32 _reserved_[8];
uint32 display_line_width;
uint32 display_line_count;
uint32 bytes_per_row;
uint16 pixel_width_aspect;
uint16 pixel_height_aspect;
float field_gamma;
uint32 field_sequence;
uint16 field_number;
uint16 pulldown_number;
uint16 first_active_line;
uint16 line_count;
};
struct media_encoded_video_format {
enum video_encoding {
B_ANY
};
media_raw_video_format output;
float avg_bit_rate;
float max_bit_rate;
video_encoding encoding;
size_t frame_size;
int16 forward_history;
int16 backward_history;
uint32 _reserved_[3];
static const media_encoded_video_format wildcard;
};
struct media_encoded_video_header {
int32 _reserved_1[9];
uint32 field_flags;
int16 forward_history;
int16 backward_history;
uchar unused_mask;
uchar _reserved_2[3];
float field_gamma;
uint32 field_sequence;
uint16 field_number;
uint16 pulldown_number;
uint16 first_active_line;
uint16 line_count;
};
struct media_multistream_format {
enum {
B_ANY = 0,
B_VID = 1,
B_AVI,
B_MPEG1,
B_MPEG2,
B_QUICKTIME,
B_PRIVATE = 90000,
B_FIRST_USER_TYPE = 100000
};
float avg_bit_rate;
float max_bit_rate;
uint32 avg_chunk_size;
uint32 max_chunk_size;
enum {
B_HEADER_HAS_FLAGS = 0x1,
B_CLEAN_BUFFERS = 0x2,
B_HOMOGENOUS_BUFFERS = 0x4
};
uint32 flags;
int32 format;
uint32 _reserved_[2];
struct vid_info {
float frame_rate;
uint16 width;
uint16 height;
color_space space;
float sampling_rate;
uint32 sample_format;
uint16 byte_order;
uint16 channel_count;
};
struct avi_info {
uint32 us_per_frame;
uint16 width;
uint16 height;
uint16 _reserved_;
uint16 type_count;
media_type types[5];
};
union {
vid_info vid;
avi_info avi;
} u;
static const media_multistream_format wildcard;
};
struct media_multistream_header {
uint32 _reserved_[14];
uchar unused_mask;
uchar _reserved_2[3];
enum {
B_MASTER_HEADER = 0x1,
B_SUBSTREAM_HEADER = 0x2,
B_COMPLETE_BUFFER = 0x4
};
uint32 flags;
};
extern const type_code B_CODEC_TYPE_INFO;
enum media_format_flags {
B_MEDIA_RETAINED_DATA = 0x1,
B_MEDIA_MULTIPLE_BUFFERS = 0x2,
B_MEDIA_CONTIGUOUS_BUFFER = 0x4,
B_MEDIA_LINEAR_UPDATES = 0x8,
B_MEDIA_MAUI_UNDEFINED_FLAGS = ~0xf
};
struct media_format {
media_type type;
type_code user_data_type;
uchar user_data[48];
uint32 _reserved_[3];
uint16 require_flags;
uint16 deny_flags;
private:
void* meta_data;
int32 meta_data_size;
area_id meta_data_area;
area_id __unused_was_use_area;
team_id __unused_was_team;
void* __unused_was_thisPtr;
public:
union {
media_multi_audio_format raw_audio;
media_raw_video_format raw_video;
media_multistream_format multistream;
media_encoded_audio_format encoded_audio;
media_encoded_video_format encoded_video;
char _reserved_[96];
} u;
bool IsVideo() const;
uint32 Width() const;
uint32 Height() const;
color_space ColorSpace() const;
uint32& Width();
uint32& Height();
color_space& ColorSpace();
bool IsAudio() const;
uint32 AudioFormat() const;
uint32& AudioFormat();
uint32 AudioFrameSize() const;
uint32 Encoding() const;
bool Matches(const media_format* other) const;
void SpecializeTo(const media_format* other);
status_t SetMetaData(const void* data, size_t size);
const void* MetaData() const;
int32 MetaDataSize() const;
void Unflatten(const char *flatBuffer);
void Clear();
media_format();
media_format(const media_format& other);
~media_format();
media_format& operator=(const media_format& other);
};
bool operator==(const media_raw_audio_format& a,
const media_raw_audio_format& b);
bool operator==(const media_multi_audio_info& a,
const media_multi_audio_info& b);
bool operator==(const media_multi_audio_format& a,
const media_multi_audio_format& b);
bool operator==(const media_encoded_audio_format& a,
const media_encoded_audio_format& b);
bool operator==(const media_video_display_info& a,
const media_video_display_info& b);
bool operator==(const media_raw_video_format& a,
const media_raw_video_format& b);
bool operator==(const media_encoded_video_format& a,
const media_encoded_video_format& b);
bool operator==(const media_multistream_format::vid_info& a,
const media_multistream_format::vid_info& b);
bool operator==(const media_multistream_format::avi_info& a,
const media_multistream_format::avi_info & b);
bool operator==(const media_multistream_format& a,
const media_multistream_format& b);
bool operator==(const media_format& a, const media_format& b);
bool format_is_compatible(const media_format & a, const media_format & b);
bool string_for_format(const media_format & f, char * buf, size_t size);
struct media_seek_tag {
char data[16];
};
struct media_header_time_code {
int8 type;
int8 _reserved;
int8 hours;
int8 minutes;
int8 seconds;
int8 frames;
int16 subframes;
};
struct media_header {
media_type type;
media_buffer_id buffer;
int32 destination;
media_node_id time_source;
uint32 _deprecated_;
uint32 size_used;
bigtime_t start_time;
area_id owner;
enum {
B_SEEK_TAG = 'TRST',
B_TIME_CODE = 'TRTC'
};
type_code user_data_type;
uchar user_data[64];
int32 source;
port_id source_port;
off_t file_pos;
size_t orig_size;
uint32 data_offset;
union {
media_audio_header raw_audio;
media_video_header raw_video;
media_multistream_header multistream;
media_encoded_audio_header encoded_audio;
media_encoded_video_header encoded_video;
char _reserved_[64];
} u;
};
struct media_file_format_id {
ino_t node;
dev_t device;
uint32 internal_id;
};
bool operator==(const media_file_format_id& a, const media_file_format_id& b);
bool operator<(const media_file_format_id& a, const media_file_format_id& b);
typedef enum {
B_ANY_FORMAT_FAMILY = 0,
B_BEOS_FORMAT_FAMILY = 1,
B_QUICKTIME_FORMAT_FAMILY = 2,
B_AVI_FORMAT_FAMILY = 3,
B_ASF_FORMAT_FAMILY = 4,
B_MPEG_FORMAT_FAMILY = 5,
B_WAV_FORMAT_FAMILY = 6,
B_AIFF_FORMAT_FAMILY = 7,
B_AVR_FORMAT_FAMILY = 8,
B_MISC_FORMAT_FAMILY = 99999,
} media_format_family;
struct media_file_format {
enum {
B_READABLE = 0x1,
B_WRITABLE = 0x2,
B_PERFECTLY_SEEKABLE = 0x4,
B_IMPERFECTLY_SEEKABLE = 0x8,
B_KNOWS_RAW_VIDEO = 0x10,
B_KNOWS_RAW_AUDIO = 0x20,
B_KNOWS_MIDI = 0x40,
B_KNOWS_ENCODED_VIDEO = 0x80,
B_KNOWS_ENCODED_AUDIO = 0x100,
B_KNOWS_OTHER = 0x1000000,
B_KNOWS_ANYTHING = 0x2000000
};
uint32 capabilities;
media_file_format_id id;
media_format_family family;
int32 version;
uint32 _reserved_[25];
char mime_type[64];
char pretty_name[64];
char short_name[32];
char file_extension[8];
char reserved[88];
};
status_t get_next_file_format(int32* cookie, media_file_format* mfi);
const size_t B_MEDIA_MESSAGE_SIZE = 16384;
extern const char* B_MEDIA_SERVER_SIGNATURE;
class media_node;
struct media_input;
struct media_output;
struct live_node_info;
struct dormant_node_info;
struct buffer_clone_info;
status_t launch_media_server(bigtime_t timeout = B_INFINITE_TIMEOUT,
bool (*progress)(int stage, const char* message, void* cookie) = NULL,
void* cookie = NULL, uint32 flags = 0);
status_t shutdown_media_server(bigtime_t timeout = B_INFINITE_TIMEOUT,
bool (*progress)(int stage, const char* message, void* cookie) = NULL,
void* cookie = NULL);
enum {
B_BIG_ENDIAN,
B_LITTLE_ENDIAN
};
enum {
B_UNDEFINED_SAMPLES,
B_LINEAR_SAMPLES,
B_FLOAT_SAMPLES,
B_MULAW_SAMPLES
};
struct media_encode_info {
uint32 flags;
int32 used_data_size;
bigtime_t start_time;
bigtime_t time_to_encode;
int32 _pad[22];
void* file_format_data;
size_t file_format_data_size;
void* codec_data;
size_t codec_data_size;
media_encode_info();
};
struct encode_parameters {
float quality;
int32 avg_field_size;
int32 max_field_size;
int32 _pad[27];
void* user_data;
size_t user_data_size;
};
struct media_decode_info {
bigtime_t time_to_decode;
int32 _pad[26];
void* file_format_data;
size_t file_format_data_size;
void* codec_data;
size_t codec_data_size;
media_decode_info();
};
inline bool
media_format::IsVideo() const
{
return type == B_MEDIA_ENCODED_VIDEO || type == B_MEDIA_RAW_VIDEO;
}
inline uint32
media_format::Width() const
{
return type == B_MEDIA_ENCODED_VIDEO
? u.encoded_video.output.display.line_width
: u.raw_video.display.line_width;
}
inline uint32
media_format::Height() const
{
return type == B_MEDIA_ENCODED_VIDEO
? u.encoded_video.output.display.line_count
: u.raw_video.display.line_count;
}
inline color_space
media_format::ColorSpace() const
{
return type == B_MEDIA_ENCODED_VIDEO
? u.encoded_video.output.display.format
: u.raw_video.display.format;
}
inline uint32&
media_format::Width()
{
return type == B_MEDIA_ENCODED_VIDEO
? u.encoded_video.output.display.line_width
: u.raw_video.display.line_width;
}
inline uint32&
media_format::Height()
{
return type == B_MEDIA_ENCODED_VIDEO
? u.encoded_video.output.display.line_count
: u.raw_video.display.line_count;
}
inline color_space&
media_format::ColorSpace()
{
return type == B_MEDIA_ENCODED_VIDEO
? u.encoded_video.output.display.format
: u.raw_video.display.format;
}
inline bool
media_format::IsAudio() const
{
return type == B_MEDIA_ENCODED_AUDIO || type == B_MEDIA_RAW_AUDIO;
}
inline uint32
media_format::AudioFormat() const
{
return type == B_MEDIA_ENCODED_AUDIO
? u.encoded_audio.output.format : u.raw_audio.format;
}
inline uint32&
media_format::AudioFormat()
{
return type == B_MEDIA_ENCODED_AUDIO
? u.encoded_audio.output.format : u.raw_audio.format;
}
inline uint32
media_format::AudioFrameSize() const
{
return type == B_MEDIA_ENCODED_AUDIO
? (u.encoded_audio.output.format
& media_raw_audio_format::B_AUDIO_SIZE_MASK)
* u.encoded_audio.output.channel_count
: (u.raw_audio.format & media_raw_audio_format::B_AUDIO_SIZE_MASK)
* u.raw_audio.channel_count;
}
inline uint32
media_format::Encoding() const
{
return type == B_MEDIA_ENCODED_VIDEO
? u.encoded_video.encoding : type == B_MEDIA_ENCODED_AUDIO
? u.encoded_audio.encoding : type == B_MEDIA_MULTISTREAM
? u.multistream.format : 0UL;
}
#endif
#endif