eo301@0: // eo301@0: // IM_AF Encoder.h eo301@0: // IM_AM Encoder eo301@0: // eo301@0: // Created by eugenio oƱate hospital on 14/06/12. eo301@0: // Copyright (c) 2012 SAE. All rights reserved. eo301@0: // eo301@0: eo301@0: #ifndef IM_AM_Encoder_IM_AF_Encoder_h eo301@0: #define IM_AM_Encoder_IM_AF_Encoder_h eo301@0: eo301@0: /* for FILE typedef, */ eo301@0: #include eo301@0: eo301@2: #define maxtracks 8 eo301@1: #define maxpreset 10 eo301@1: #define maxrules 10 eo301@1: eo301@0: typedef long long u64; eo301@0: typedef unsigned int u32; eo301@0: typedef unsigned short u16; eo301@0: eo301@2: typedef struct nametrack { // Stores the different titles of the tracks eo301@0: char title[20]; eo301@1: }nametrack[maxtracks]; eo301@0: eo301@1: typedef struct FileTypeBox eo301@0: { eo301@1: u32 size; eo301@1: u32 type; // ftyp eo301@0: u32 major_brand; // brand identifier eo301@0: u32 minor_version; // informative integer for the mirror version eo301@2: u32 compatible_brands[2]; //list of brands eo301@0: }FileTypeBox; eo301@0: eo301@0: typedef struct MoiveBox //extends Box('moov') eo301@0: { eo301@1: u32 size; eo301@1: u32 type; // moov eo301@1: eo301@1: struct MovieHeaderBox eo301@0: { eo301@1: u32 size; eo301@1: u32 type; // mvhd eo301@1: u32 version; // version + flag eo301@0: u32 creation_time; eo301@0: u32 modification_time; eo301@1: u32 timescale; // specifies the time-scale eo301@0: u32 duration; eo301@0: u32 rate; // typically 1.0 eo301@1: u16 volume; // typically full volume eo301@0: u16 reserved; // =0 eo301@1: u32 reserved2[2]; //=0 eo301@1: u32 matrix[9]; // information matrix for video (u,v,w) eo301@0: u32 pre_defined[6]; // =0 eo301@0: u32 next_track_ID; //non zero value for the next track ID eo301@1: }MovieHeaderBox; eo301@0: eo301@1: struct TrackBox eo301@0: { eo301@1: u32 size; eo301@1: u32 type; eo301@1: struct TrackHeaderBox eo301@0: { eo301@1: u32 size; eo301@1: u32 type; eo301@1: u32 version; // version + flag eo301@0: u32 creation_time; eo301@0: u32 modification_time; eo301@1: u32 track_ID; eo301@0: u32 reserved; // =0 eo301@0: u32 duration; eo301@0: u32 reserved2[2]; // =0 eo301@0: u16 layer; // =0 // for video eo301@0: u16 alternate_group; // =0 eo301@0: u16 volume; // full volume is 1 = 0x0100 eo301@0: u16 reserved3;// =0 eo301@0: u32 matrix[9]; // for video eo301@0: u32 width; // video eo301@0: u32 height; // video eo301@0: }TrackHeaderBox; eo301@1: eo301@0: struct MediaBox // extends Box('mdia') eo301@0: { eo301@1: u32 size; eo301@1: u32 type; eo301@0: struct MediaHeaderBox // extends FullBox('mdhd', version,0) eo301@0: { eo301@1: u32 size; eo301@1: u32 type; eo301@1: u32 version; // version + flag eo301@0: u32 creation_time; eo301@0: u32 modification_time; eo301@0: u32 timescale; eo301@0: u32 duration; eo301@1: u16 language; // [pad,5x3] = 16 bits and pad = 0 eo301@0: u16 pre_defined; // =0 eo301@0: }MediaHeaderBox; eo301@1: struct HandlerBox eo301@0: { eo301@1: u32 size; eo301@1: u32 type; eo301@1: u32 version; // version = 0 + flag eo301@0: u32 pre_defined; // =0 eo301@0: u32 handler_type; // = 'soun' for audio track, text or hint eo301@0: u32 reserved[3]; // =0 eo301@1: unsigned char data[5]; // Does not work! only 4 bytes eo301@1: eo301@1: }HandlerBox; eo301@1: struct MediaInformationBox //extends Box('minf') eo301@0: { eo301@1: u32 size; eo301@1: u32 type; eo301@0: // smhd in sound track only!! eo301@1: struct SoundMediaHeaderBox eo301@0: { eo301@1: u32 size; eo301@1: u32 type; eo301@1: u32 version; eo301@0: u16 balance; // =0 place mono tracks in stereo. 0 is center eo301@0: u16 reserved; // =0 eo301@0: }SoundMediaHeaderBox; eo301@1: eo301@1: struct DataInformationBox //extends Box('dinf') eo301@0: { eo301@1: u32 size; eo301@1: u32 type; eo301@1: struct DataReferenceBox eo301@0: { eo301@1: u32 size; eo301@1: u32 type; eo301@0: u32 flags; eo301@1: u32 entry_count; // counts the actual entries. eo301@1: struct DataEntryUrlBox //extends FullBox('url', version=0, flags) eo301@1: { eo301@1: u32 size; eo301@1: u32 type; eo301@1: u32 flags; eo301@1: }DataEntryUrlBox; eo301@1: }DataReferenceBox; eo301@0: }DataInformationBox; eo301@0: struct SampleTableBox // extends Box('stbl') eo301@0: { eo301@1: u32 size; eo301@1: u32 type; eo301@1: struct TimeToSampleBox{ eo301@1: u32 size; eo301@1: u32 type; eo301@1: u32 version; eo301@1: u32 entry_count; eo301@1: u32 sample_count[3000]; eo301@1: u32 sample_delta[3000]; eo301@1: }TimeToSampleBox; eo301@1: struct SampleDescriptionBox // stsd eo301@0: { eo301@1: u32 size; eo301@1: u32 type; eo301@1: u32 version; eo301@1: u32 entry_count; // = 1 number of entries eo301@1: // unsigned char esds[88]; eo301@1: struct AudioSampleEntry{ eo301@1: u32 size; eo301@1: u32 type; //mp4a eo301@1: char reserved[6]; eo301@1: u16 data_reference_index; // = 1 eo301@1: u32 reserved2[2]; eo301@1: u16 channelcount; // = 2 eo301@1: u16 samplesize; // = 16 eo301@1: u32 reserved3; eo301@1: u32 samplerate; // 44100 << 16 eo301@1: // unsigned char esds[81]; eo301@1: struct ESbox{ eo301@1: u32 size; eo301@1: u32 type; eo301@1: u32 version; eo301@1: struct ES_Descriptor{ eo301@1: unsigned char tag; eo301@1: unsigned char length; eo301@1: u16 ES_ID; eo301@1: unsigned char mix; eo301@1: struct DecoderConfigDescriptor{ eo301@1: unsigned char tag; eo301@1: unsigned char length; eo301@1: unsigned char objectProfileInd; eo301@1: u32 mix; eo301@1: u32 maxBitRate; eo301@1: u32 avgBitrate; eo301@1: /* struct DecoderSpecificInfo{ eo301@1: unsigned char tag; eo301@1: unsigned length; eo301@1: // unsigned char decSpecificInfosize; eo301@1: unsigned char decSpecificInfoData[2]; eo301@1: }DecoderSpecificInfo; eo301@1: */ }DecoderConfigDescriptor; eo301@1: struct SLConfigDescriptor{ eo301@1: unsigned char tag; eo301@1: unsigned char length; eo301@1: unsigned char predifined; eo301@1: }SLConfigDescriptor; eo301@1: }ES_Descriptor; eo301@1: }ESbox; eo301@1: }AudioSampleEntry; eo301@0: }SampleDescriptionBox; eo301@1: struct SampleSizeBox{ eo301@1: u32 size; eo301@1: u32 type; eo301@1: u32 version; eo301@1: u32 sample_size; // =0 eo301@1: u32 sample_count; eo301@2: u32 entry_size[9000]; eo301@1: }SampleSizeBox; eo301@1: struct SampleToChunk{ eo301@1: u32 size; eo301@1: u32 type; eo301@1: u32 version; eo301@0: u32 entry_count; eo301@1: u32 first_chunk; eo301@1: u32 samples_per_chunk; eo301@1: u32 sample_description_index; eo301@1: }SampleToChunk; eo301@1: struct ChunkOffsetBox{ eo301@1: u32 size; eo301@1: u32 type; eo301@1: u32 version; eo301@0: u32 entry_count; eo301@1: u32 chunk_offset[maxtracks]; eo301@0: }ChunkOffsetBox; eo301@0: }SampleTableBox; eo301@0: }MediaInformationBox; eo301@0: }MediaBox; eo301@0: }TrackBox[maxtracks]; // max 10 tracks eo301@0: struct PresetContainerBox // extends Box('prco') eo301@0: { eo301@1: u32 size; eo301@1: u32 type; eo301@1: unsigned char num_preset; eo301@1: unsigned char default_preset_ID; eo301@0: struct PresetBox //extends FullBox('prst',version=0,flags) eo301@0: { eo301@1: u32 size; eo301@1: u32 type; eo301@1: u32 flags; eo301@1: unsigned char preset_ID; eo301@1: unsigned char num_preset_elements; eo301@1: struct presElemId{ eo301@1: u32 preset_element_ID; eo301@1: }presElemId[maxtracks]; eo301@1: unsigned char preset_type; eo301@1: unsigned char preset_global_volume; eo301@0: //IF preset_type == 1 eo301@1: struct presVolumElem{ eo301@1: unsigned char preset_volume_element; eo301@1: }presVolumElem[maxtracks]; eo301@2: char preset_name[14]; eo301@1: }PresetBox[maxpreset]; eo301@0: }PresetContainerBox; eo301@1: eo301@1: struct RulesContainer{ eo301@1: u32 size; eo301@1: u32 type; eo301@1: u16 num_selection_rules; eo301@1: u16 num_mixing_rules; eo301@1: struct SelectionRules{ eo301@1: u32 size; eo301@1: u32 type; eo301@1: u32 version; eo301@1: u16 selection_rule_ID; eo301@1: unsigned char selection_rule_type; eo301@1: u32 element_ID; eo301@1: char rule_description[14]; eo301@1: }SelectionRules; eo301@1: struct MixingRules{ eo301@1: u32 size; eo301@1: u32 type; eo301@1: u32 version; eo301@1: u16 mixing_rule_ID; eo301@1: unsigned char mixing_type; eo301@1: u32 element_ID; eo301@1: u32 key_elem_ID; eo301@2: char mix_description[17]; eo301@1: }MixingRules; eo301@1: }RulesContainer; eo301@0: }MovieBox; eo301@0: eo301@0: typedef struct MediaDataBox // extends Box('mdat') eo301@0: { eo301@1: u32 size; eo301@1: u32 type; eo301@1: unsigned char data; eo301@1: }MediaDataBox; eo301@0: eo301@0: #endif eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: eo301@0: