183 lines
4.3 KiB
C
183 lines
4.3 KiB
C
|
#ifndef _mov_atom_h_
|
||
|
#define _mov_atom_h_
|
||
|
|
||
|
#include <stdint.h>
|
||
|
#include <stddef.h>
|
||
|
|
||
|
#define N_BRAND 8
|
||
|
|
||
|
struct mov_ftyp_t
|
||
|
{
|
||
|
uint32_t major_brand;
|
||
|
uint32_t minor_version;
|
||
|
|
||
|
uint32_t compatible_brands[N_BRAND];
|
||
|
int brands_count;
|
||
|
};
|
||
|
|
||
|
// A.4 Temporal structure of the media (p148)
|
||
|
// The movie, and each track, has a timescale.
|
||
|
// This defines a time axis which has a number of ticks per second
|
||
|
struct mov_mvhd_t
|
||
|
{
|
||
|
// FullBox
|
||
|
uint32_t version : 8;
|
||
|
uint32_t flags : 24;
|
||
|
|
||
|
uint32_t timescale; // time-scale for the entire presentation, the number of time units that pass in one second
|
||
|
uint64_t duration; // default UINT64_MAX(by timescale)
|
||
|
uint64_t creation_time; // seconds sine midnight, Jan. 1, 1904, UTC
|
||
|
uint64_t modification_time; // seconds sine midnight, Jan. 1, 1904, UTC
|
||
|
|
||
|
uint32_t rate;
|
||
|
uint16_t volume; // fixed point 8.8 number, 1.0 (0x0100) is full volume
|
||
|
//uint16_t reserved;
|
||
|
//uint32_t reserved2[2];
|
||
|
int32_t matrix[9]; // u,v,w
|
||
|
//int32_t pre_defined[6];
|
||
|
uint32_t next_track_ID;
|
||
|
};
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
MOV_TKHD_FLAG_TRACK_ENABLE = 0x01,
|
||
|
MOV_TKHD_FLAG_TRACK_IN_MOVIE = 0x02,
|
||
|
MOV_TKHD_FLAG_TRACK_IN_PREVIEW = 0x04,
|
||
|
};
|
||
|
|
||
|
struct mov_tkhd_t
|
||
|
{
|
||
|
// FullBox
|
||
|
uint32_t version : 8;
|
||
|
uint32_t flags : 24; // MOV_TKHD_FLAG_XXX
|
||
|
|
||
|
uint32_t track_ID; // cannot be zero
|
||
|
uint64_t creation_time; // seconds sine midnight, Jan. 1, 1904, UTC
|
||
|
uint64_t modification_time; // seconds sine midnight, Jan. 1, 1904, UTC
|
||
|
uint64_t duration; // default UINT64_MAX(by Movie Header Box timescale)
|
||
|
//uint32_t reserved;
|
||
|
|
||
|
//uint32_t reserved2[2];
|
||
|
int16_t layer;
|
||
|
int16_t alternate_group;
|
||
|
int16_t volume; // fixed point 8.8 number, 1.0 (0x0100) is full volume
|
||
|
//uint16_t reserved;
|
||
|
int32_t matrix[9]; // u,v,w
|
||
|
uint32_t width; // fixed-point 16.16 values
|
||
|
uint32_t height; // fixed-point 16.16 values
|
||
|
};
|
||
|
|
||
|
struct mov_mdhd_t
|
||
|
{
|
||
|
// FullBox
|
||
|
uint32_t version : 8;
|
||
|
uint32_t flags : 24;
|
||
|
|
||
|
uint32_t timescale; // second
|
||
|
uint64_t duration; // default UINT64_MAX(by timescale)
|
||
|
uint64_t creation_time; // seconds sine midnight, Jan. 1, 1904, UTC
|
||
|
uint64_t modification_time; // seconds sine midnight, Jan. 1, 1904, UTC
|
||
|
|
||
|
uint32_t pad : 1;
|
||
|
uint32_t language : 15;
|
||
|
uint32_t pre_defined : 16;
|
||
|
};
|
||
|
|
||
|
struct mov_sample_entry_t
|
||
|
{
|
||
|
uint16_t data_reference_index; // ref [dref] Data Reference Boxes
|
||
|
uint8_t object_type_indication; // H.264/AAC MOV_OBJECT_XXX (DecoderConfigDescriptor)
|
||
|
uint8_t stream_type; // MP4_STREAM_XXX
|
||
|
uint8_t* extra_data; // H.264 sps/pps
|
||
|
int extra_data_size;
|
||
|
|
||
|
union
|
||
|
{
|
||
|
struct mov_bitrate_t
|
||
|
{
|
||
|
uint32_t bufferSizeDB;
|
||
|
uint32_t maxBitrate;
|
||
|
uint32_t avgBitrate;
|
||
|
} bitrate;
|
||
|
|
||
|
//struct mov_uri_t
|
||
|
//{
|
||
|
// char uri[256];
|
||
|
//} uri;
|
||
|
|
||
|
// visual
|
||
|
struct mov_visual_sample_t
|
||
|
{
|
||
|
uint16_t width;
|
||
|
uint16_t height;
|
||
|
uint32_t horizresolution; // 0x00480000 - 72dpi
|
||
|
uint32_t vertresolution; // 0x00480000 - 72dpi
|
||
|
uint16_t frame_count; // default 1
|
||
|
uint16_t depth; // 0x0018
|
||
|
|
||
|
struct mov_pixel_aspect_ratio_t
|
||
|
{
|
||
|
uint32_t h_spacing;
|
||
|
uint32_t v_spacing;
|
||
|
} pasp;
|
||
|
} visual;
|
||
|
|
||
|
struct mov_audio_sample_t
|
||
|
{
|
||
|
uint16_t channelcount; // default 2
|
||
|
uint16_t samplesize; // default 16
|
||
|
uint32_t samplerate; // { default samplerate of media } << 16
|
||
|
} audio;
|
||
|
} u;
|
||
|
};
|
||
|
|
||
|
struct mov_stsd_t
|
||
|
{
|
||
|
struct mov_sample_entry_t *current; // current entry, read only
|
||
|
struct mov_sample_entry_t *entries;
|
||
|
uint32_t entry_count;
|
||
|
};
|
||
|
|
||
|
struct mov_stts_t
|
||
|
{
|
||
|
uint32_t sample_count;
|
||
|
uint32_t sample_delta; // in the time-scale of the media
|
||
|
};
|
||
|
|
||
|
struct mov_stsc_t
|
||
|
{
|
||
|
uint32_t first_chunk;
|
||
|
uint32_t samples_per_chunk;
|
||
|
uint32_t sample_description_index;
|
||
|
};
|
||
|
|
||
|
struct mov_elst_t
|
||
|
{
|
||
|
uint64_t segment_duration; // by Movie Header Box timescale
|
||
|
int64_t media_time;
|
||
|
int16_t media_rate_integer;
|
||
|
int16_t media_rate_fraction;
|
||
|
};
|
||
|
|
||
|
struct mov_trex_t
|
||
|
{
|
||
|
// uint32_t track_ID;
|
||
|
uint32_t default_sample_description_index;
|
||
|
uint32_t default_sample_duration;
|
||
|
uint32_t default_sample_size;
|
||
|
uint32_t default_sample_flags;
|
||
|
};
|
||
|
|
||
|
struct mov_tfhd_t
|
||
|
{
|
||
|
uint32_t flags;
|
||
|
// uint32_t track_ID;
|
||
|
uint64_t base_data_offset;
|
||
|
uint32_t sample_description_index;
|
||
|
uint32_t default_sample_duration;
|
||
|
uint32_t default_sample_size;
|
||
|
uint32_t default_sample_flags;
|
||
|
};
|
||
|
|
||
|
#endif /* !_mov_atom_h_ */
|