Home | History | Annotate | Download | only in include
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 /*********************************************************************************/
     19 /*
     20     This PVA_FF_Atom Class is the base class for all other Atoms in the MPEG-4 File
     21     Format.
     22 */
     23 
     24 
     25 #ifndef __AtomDefs_H__
     26 #define __AtomDefs_H__
     27 
     28 #ifndef OSCL_BASE_H_INCLUDED
     29 #include "oscl_base.h"
     30 #endif
     31 
     32 #ifndef OSCL_BIN_STREAM_H_INCLUDED
     33 #include "oscl_bin_stream.h"
     34 #endif
     35 
     36 #include "pv_mp4ffcomposer_config.h"
     37 static const int32 MEDIA_DATA_IN_MEMORY = 0;
     38 static const int32 MEDIA_DATA_ON_DISK = 1;
     39 
     40 static const uint32 DEFAULT_PRESENTATION_TIMESCALE = 1000; // For milliseconds
     41 static const uint32 INITIAL_TRACK_ID = 1; // Initial track ID for first track added to this movie
     42 
     43 static const int32 MEDIA_TYPE_UNKNOWN = 10;
     44 
     45 // PVA_FF_MediaInformationHeaderAtom types
     46 static const int32 MEDIA_INFORMATION_HEADER_TYPE_AUDIO = 0;
     47 static const int32 MEDIA_INFORMATION_HEADER_TYPE_VISUAL = 1;
     48 static const int32 MEDIA_INFORMATION_HEADER_TYPE_HINT = 2;
     49 static const int32 MEDIA_INFORMATION_HEADER_TYPE_MPEG4 = 3;
     50 
     51 static const int32 UNKNOWN_ATOM = 0;
     52 static const int32 UNKNOWN_DESCRIPTOR = 1;
     53 static const int32 UNKNOWN_HANDLER = 2;
     54 
     55 static const int32 CODING_TYPE_I = 0;
     56 static const int32 CODING_TYPE_P = 1;
     57 static const int32 CODING_TYPE_B = 2;
     58 static const int32 CODING_TYPE_SPRITE = 3;
     59 
     60 // Mpeg-4 file types
     61 static const int32 FILE_TYPE_AUDIO = 1;
     62 static const int32 FILE_TYPE_VIDEO = 2;
     63 static const int32 FILE_TYPE_AUDIO_VIDEO = 3; // logical ORing of above
     64 static const int32 FILE_TYPE_STILL_IMAGE = 4;
     65 static const int32 FILE_TYPE_STILL_IMAGE_AUDIO = 5; // logical ORing of above
     66 static const int32 FILE_TYPE_TIMED_TEXT = 8;
     67 static const int32 FILE_TYPE_AUDIO_TEXT = 9;
     68 static const int32 FILE_TYPE_VIDEO_TEXT = 10;
     69 static const int32 FILE_TYPE_AUDIO_VIDEO_TEXT = 11;
     70 
     71 // Scalability settings on the Mpeg4 file
     72 static const int32 STREAM_SCALABILITY_NONE = 0;
     73 static const int32 STREAM_SCALABILITY_TEMPORAL = 1;
     74 static const int32 STREAM_SCALABILITY_SPATIAL = 2;
     75 static const int32 STREAM_SCALABILITY_BOTH = 3; // logical ORing of above
     76 
     77 static const uint32 INVALID_TRACK_ID = 0;
     78 
     79 // The following are the allowable protocols with respect to the hint tracks:
     80 // HINT_PROTOCOL_TEMPORAL_SCALABILITY - Video stream encoded with PacketVideo Temporal Scalability
     81 // HINT_PROTOCOL_SPATIAL_SCALABILITY - Video stream encoded with PacketVideo Spatial Scalability
     82 // 'pvst' - Video stream encoded with both PacketVideo Spatial and Temporal scalability
     83 // HINT_PROTOCOL_BASE_LAYER_ONLY - Video stream encoded with Base Layer only
     84 // *** Note that only HINT_PROTOCOL_TEMPORAL_SCALABILITY and HINT_PROTOCOL_BASE_LAYER_ONLY video protocols are supported in version 1.0 ***
     85 // 'pvau' - Audio encoding with simple hint track
     86 
     87 
     88 static const int32 OBJ_DESCR_TAG            = 0x1;
     89 static const int32 INITIAL_OBJ_DESCR_TAG    = 0x2;
     90 static const int32 ES_DESCR_TAG         = 0x3;
     91 static const int32 DEC_CONFIG_DESCR_TAG = 0x4;
     92 static const int32 DEC_SPEC_INFO_TAG        = 0x5;
     93 static const int32 SL_CONFIG_DESCR_TAG  = 0x6;
     94 //
     95 static const int32 IPMP_DESCR_PTR_TAG       = 0xa;
     96 static const int32 IPMP_DESCR_TAG           = 0xb;
     97 //
     98 static const int32 ES_ID_INC_DESCR_TAG  = 0xe;
     99 static const int32 ES_ID_REF_DESCR_TAG  = 0xf;
    100 //
    101 static const int32 MP4_IOD_TAG  = 0x10;
    102 static const int32 MP4_OD_TAG   = 0x11;
    103 
    104 
    105 
    106 #define FourCharConstToUint32(a, b, c, d) ( (uint32(a) << 24) | (uint32(b) << 16) | (uint32(c) << 8) | uint32(d) )
    107 
    108 const uint32 HINT_PROTOCOL_BASE_LAYER_ONLY = FourCharConstToUint32('p', 'v', 'b', 'l');
    109 const uint32 HINT_PROTOCOL_TEMPORAL_SCALABILITY = FourCharConstToUint32('p', 'v', 't', 's');
    110 const uint32 HINT_PROTOCOL_SPATIAL_SCALABILITY = FourCharConstToUint32('p', 'v', 's', 's');
    111 const uint32 HINT_PROTOCOL_SPATIAL_TEMPORAL = FourCharConstToUint32('p', 'v', 's', 't');
    112 const uint32 HINT_PROTOCOL_STILL_IMAGE = FourCharConstToUint32('p', 'v', 's', 'i');
    113 const uint32 HINT_PROTOCOL_AUDIO = FourCharConstToUint32('p', 'v', 'a', 'u');
    114 const uint32 PACKETVIDEO_FOURCC = FourCharConstToUint32('p', 'v', 'm', 'm');
    115 
    116 
    117 const uint32    MOVIE_ATOM = FourCharConstToUint32('m', 'o', 'o', 'v');
    118 const uint32    MOVIE_HEADER_ATOM = FourCharConstToUint32('m', 'v', 'h', 'd');
    119 const uint32    TRACK_ATOM = FourCharConstToUint32('t', 'r', 'a', 'k');
    120 const uint32    ESD_ATOM = FourCharConstToUint32('e', 's', 'd', 's');
    121 const uint32    TRACK_HEADER_ATOM = FourCharConstToUint32('t', 'k', 'h', 'd');
    122 const uint32    TRACK_REFERENCE_ATOM = FourCharConstToUint32('t', 'r', 'e', 'f');
    123 const uint32    MEDIA_ATOM = FourCharConstToUint32('m', 'd', 'i', 'a');
    124 const uint32    EDIT_ATOM = FourCharConstToUint32('e', 'd', 't', 's');
    125 const uint32    EDIT_LIST_ATOM = FourCharConstToUint32('e', 'l', 's', 't');
    126 const uint32    MEDIA_HEADER_ATOM = FourCharConstToUint32('m', 'd', 'h', 'd');
    127 const uint32    HANDLER_ATOM = FourCharConstToUint32('h', 'd', 'l', 'r');
    128 const uint32    MEDIA_INFORMATION_ATOM = FourCharConstToUint32('m', 'i', 'n', 'f');
    129 const uint32    VIDEO_MEDIA_HEADER_ATOM = FourCharConstToUint32('v', 'm', 'h', 'd');
    130 const uint32    SOUND_MEDIA_HEADER_ATOM = FourCharConstToUint32('s', 'm', 'h', 'd');
    131 const uint32    HINT_MEDIA_HEADER_ATOM = FourCharConstToUint32('h', 'm', 'h', 'd');
    132 const uint32    MPEG4_MEDIA_HEADER_ATOM = FourCharConstToUint32('n', 'm', 'h', 'd');
    133 const uint32    DATA_INFORMATION_ATOM = FourCharConstToUint32('d', 'i', 'n', 'f');
    134 const uint32    DATA_REFERENCE_ATOM = FourCharConstToUint32('d', 'r', 'e', 'f');
    135 const uint32    DATA_ENTRY_URL_ATOM = FourCharConstToUint32('u', 'r', 'l', ' ');
    136 const uint32    DATA_ENTRY_URN_ATOM = FourCharConstToUint32('u', 'r', 'n', ' ');
    137 const uint32    SAMPLE_TABLE_ATOM = FourCharConstToUint32('s', 't', 'b', 'l');
    138 const uint32    TIME_TO_SAMPLE_ATOM = FourCharConstToUint32('s', 't', 't', 's');
    139 const uint32    COMPOSITION_OFFSET_ATOM = FourCharConstToUint32('c', 't', 't', 's');
    140 const uint32    SAMPLE_DESCRIPTION_ATOM = FourCharConstToUint32('s', 't', 's', 'd');
    141 const uint32    SAMPLE_SIZE_ATOM = FourCharConstToUint32('s', 't', 's', 'z');
    142 const uint32    SAMPLE_TO_CHUNK_ATOM = FourCharConstToUint32('s', 't', 's', 'c');
    143 const uint32    CHUNK_OFFSET_ATOM = FourCharConstToUint32('s', 'r', 'c', 'o');
    144 const uint32    SYNC_SAMPLE_ATOM = FourCharConstToUint32('s', 't', 's', 's');
    145 const uint32    SHADOW_SYNC_SAMPLE_ATOM = FourCharConstToUint32('s', 't', 's', 'h');
    146 const uint32    DEGRADATION_PRIORITY_ATOM = FourCharConstToUint32('s', 't', 'd', 'p');
    147 const uint32    OBJECT_DESCRIPTOR_ATOM = FourCharConstToUint32('i', 'o', 'd', 's');
    148 const uint32    MEDIA_DATA_ATOM = FourCharConstToUint32('m', 'd', 'a', 't');
    149 const uint32    SKIP_ATOM = FourCharConstToUint32('f', 'r', 'e', 'e');
    150 const uint32    FREE_SPACE_ATOM = FourCharConstToUint32('s', 'k', 'i', 'p');
    151 const uint32    USER_DATA_ATOM = FourCharConstToUint32('u', 'd', 't', 'a');
    152 const uint32    MEDIA_TYPE_AUDIO = FourCharConstToUint32('s', 'o', 'u', 'n');
    153 const uint32    MEDIA_TYPE_VISUAL = FourCharConstToUint32('v', 'i', 'd', 'e');
    154 const uint32    MEDIA_TYPE_TEXT = FourCharConstToUint32('t', 'e', 'x', 't');
    155 
    156 const uint32    MPEG_SAMPLE_ENTRY = FourCharConstToUint32('m', 'p', '4', 's');
    157 const uint32    AUDIO_SAMPLE_ENTRY = FourCharConstToUint32('m', 'p', '4', 'a');
    158 const uint32    VIDEO_SAMPLE_ENTRY = FourCharConstToUint32('m', 'p', '4', 'v');
    159 
    160 const uint32    FILE_TYPE_ATOM = FourCharConstToUint32('f', 't', 'y', 'p');
    161 const uint32    PVMM_BRAND = FourCharConstToUint32('p', 'v', 'm', 'm');
    162 const uint32    BRAND_3GPP4 = FourCharConstToUint32('3', 'g', 'p', '4');
    163 const uint32    BRAND_3GPP5 = FourCharConstToUint32('3', 'g', 'p', '5');
    164 const uint32    BRAND_3GPP6 = FourCharConstToUint32('3', 'g', 'p', '6');
    165 const uint32    BRAND_MPEG4 = FourCharConstToUint32('m', 'p', '4', '1');
    166 
    167 const uint32    TREF_TYPE_OD = FourCharConstToUint32('m', 'p', 'o', 'd');
    168 const uint32    TREF_TYPE_DEPEND = FourCharConstToUint32('d', 'p', 'n', 'd');
    169 
    170 const uint32    TEXT_SAMPLE_ENTRY = FourCharConstToUint32('t', 'x', '3', 'g');
    171 const uint32    AMR_SAMPLE_ENTRY = FourCharConstToUint32('s', 'a', 'm', 'r');
    172 const uint32    AMR_WB_SAMPLE_ENTRY = FourCharConstToUint32('s', 'a', 'w', 'b');
    173 const uint32    H263_SAMPLE_ENTRY = FourCharConstToUint32('s', '2', '6', '3');
    174 const uint32    AMR_SPECIFIC_ATOM = FourCharConstToUint32('d', 'a', 'm', 'r');
    175 const uint32    H263_SPECIFIC_ATOM = FourCharConstToUint32('d', '2', '6', '3');
    176 const uint32    AVC_SAMPLE_ENTRY = FourCharConstToUint32('a', 'v', 'c', '1');
    177 const uint32    AVC_CONFIGURATION_BOX = FourCharConstToUint32('a', 'v', 'c', 'C');
    178 const uint32    MPEG4_BITRATE_BOX = FourCharConstToUint32('b', 't', 'r', 't');
    179 
    180 const uint32    BRAND_MMP4 = FourCharConstToUint32('m', 'm', 'p', '4');
    181 
    182 
    183 const uint32    ASSET_INFO_TITLE_ATOM = FourCharConstToUint32('t', 'i', 't', 'l');
    184 const uint32    ASSET_INFO_DESCP_ATOM = FourCharConstToUint32('d', 's', 'c', 'p');
    185 const uint32    ASSET_INFO_PERF_ATOM = FourCharConstToUint32('p', 'e', 'r', 'f');
    186 const uint32    ASSET_INFO_AUTHOR_ATOM = FourCharConstToUint32('a', 'u', 't', 'h');
    187 const uint32    ASSET_INFO_GENRE_ATOM = FourCharConstToUint32('g', 'n', 'r', 'e');
    188 const uint32    ASSET_INFO_RATING_ATOM = FourCharConstToUint32('r', 't', 'n', 'g');
    189 const uint32    ASSET_INFO_CLSF_ATOM = FourCharConstToUint32('c', 'l', 's', 'f');
    190 const uint32    ASSET_INFO_KEYWORD_ATOM = FourCharConstToUint32('k', 'y', 'w', 'd');
    191 const uint32    ASSET_INFO_LOCINFO_ATOM = FourCharConstToUint32('l', 'o', 'c', 'i');
    192 const uint32    ASSET_INFO_CPRT_ATOM =  FourCharConstToUint32('c', 'p', 'r', 't');
    193 const uint32    ASSET_INFO_ALBUM_TITLE_ATOM =  FourCharConstToUint32('a', 'l', 'b', 'm');
    194 const uint32    ASSET_INFO_RECORDING_YEAR_ATOM =  FourCharConstToUint32('y', 'r', 'r', 'c');
    195 
    196 // Movie fragment atoms
    197 const uint32    MOVIE_EXTENDS_ATOM = FourCharConstToUint32('m', 'v', 'e', 'x');
    198 const uint32    MOVIE_EXTENDS_HEADER_ATOM = FourCharConstToUint32('m', 'e', 'h', 'd');
    199 const uint32    TRACK_EXTENDS_ATOM = FourCharConstToUint32('t', 'r', 'e', 'x');
    200 const uint32    MOVIE_FRAGMENT_ATOM = FourCharConstToUint32('m', 'o', 'o', 'f');
    201 const uint32    MOVIE_FRAGMENT_HEADER_ATOM = FourCharConstToUint32('m', 'f', 'h', 'd');
    202 const uint32    TRACK_FRAGMENT_ATOM = FourCharConstToUint32('t', 'r', 'a', 'f');
    203 const uint32    TRACK_FRAGMENT_HEADER_ATOM = FourCharConstToUint32('t', 'f', 'h', 'd');
    204 const uint32    TRACK_RUN_ATOM = FourCharConstToUint32('t', 'r', 'u', 'n');
    205 const uint32    MOVIE_FRAGMENT_RANDOM_ACCESS_ATOM = FourCharConstToUint32('m', 'f', 'r', 'a');
    206 const uint32    TRACK_FRAGMENT_RANDOM_ACCESS_ATOM = FourCharConstToUint32('t', 'f', 'r', 'a');
    207 const uint32    MOVIE_FRAGMENT_RANDOM_ACCESS_OFFSET_ATOM = FourCharConstToUint32('m', 'f', 'r', 'o');
    208 
    209 // MORE TBA - add specific protocols into type value
    210 
    211 #define PVMM_VERSION  0x00010000
    212 #define WMF_VERSION   0x00010001
    213 #define VERSION_3GPP4 0x00000300
    214 #define VERSION_MPEG4 0x00000000
    215 #define VERSION_MMP4  0x00000001
    216 #define VERSION_3GPP5 0x00000100
    217 #define VERSION_3GPP6 0x00000600
    218 
    219 typedef enum
    220 {
    221     CODEC_TYPE_AMR_AUDIO = 1,
    222     CODEC_TYPE_AAC_AUDIO = 2,
    223     CODEC_TYPE_AMR_WB_AUDIO = 3
    224 } AUDIO_CODEC_TYPES;
    225 
    226 typedef enum
    227 {
    228     CODEC_TYPE_MPEG4_VIDEO = 4,
    229     CODEC_TYPE_BASELINE_H263_VIDEO = 5,
    230     CODEC_TYPE_AVC_VIDEO = 6
    231 } VIDEO_CODEC_TYPES;
    232 
    233 typedef enum
    234 {
    235     CODEC_TYPE_TIMED_TEXT = 7
    236 
    237 } TEXT_CODEC_TYPES;
    238 
    239 #define MPEG4_SP_L0    0x08
    240 #define MPEG4_SP_L1    0x01
    241 #define MPEG4_SP_L2    0x02
    242 #define MPEG4_SP_L3    0x03
    243 #define MPEG4_SSP_L0   0x10
    244 #define MPEG4_SSP_L1   0x11
    245 #define MPEG4_SSP_L2   0x12
    246 
    247 #define MIN_NUM_MEDIA_TRACKS 0
    248 
    249 #define AMR_INTERLEAVE_BUFFER_SIZE    2048
    250 #define AMR_WB_INTERLEAVE_BUFFER_SIZE 4096
    251 #define AAC_INTERLEAVE_BUFFER_SIZE   12000  // Calc with 96 Kbps as max
    252 #define VIDEO_INTERLEAVE_BUFFER_SIZE 256000
    253 #define TEXT_INTERLEAVE_BUFFER_SIZE  12000
    254 
    255 #define MAX_PV_BASE_SIMPLE_PROFILE_VOL_HEADER_SIZE 28
    256 
    257 #define LANGUAGE_CODE_UNKNOWN   0x55C4
    258 #define RATING_ENTITY_UNKNOWN   0
    259 #define RATING_CRITERIA_UNKNOWN 0
    260 
    261 #define DEFAULT_INTERLEAVE_INTERVAL 1000
    262 
    263 //Encoding mode defines
    264 
    265 //Please note that only SOME COMBINATIONS are allowed
    266 
    267 //b31.....b4b3b2b1b0 - Bit Mask Definitions
    268 //No bits are set - default mode - no interleaving, meta data at the end
    269 //b0 is set - Media data is interleaved, BIFS and OD are still seperate tracks
    270 //b1 is set - Meta data is upfront, this implies temp files are needed while authoring
    271 //b2 - undefined
    272 //b3 is set - Do not use temp files while authoring
    273 //b4-b31 - Reserved for future use
    274 
    275 /**
    276  * This mode authors non Progressive Downloadable output files using temp files
    277  * during authoring:
    278  * Meta data towards the end of the clip
    279  * Media data is not interleaved. Temp files are used.
    280  * Media data is authored in separate media atoms for each track
    281  * Temporary files are written to the same directory as the output file.
    282  */
    283 #define PVMP4FF_SET_MEDIA_INTERLEAVE_MODE   0x00000001
    284 
    285 #define PVMP4FF_SET_META_DATA_UPFRONT_MODE  0x00000002
    286 
    287 /**
    288  * This mode authors 3GPP Progressive Downloadable output files:
    289  * Meta Data is upfront.
    290  * Media Data is interleaved. Temp files are used.
    291  * Temporary files are written to the same directory as the output file.
    292  */
    293 #define PVMP4FF_3GPP_PROGRESSIVE_DOWNLOAD_MODE 0x00000003
    294 
    295 /**
    296  * This mode authors 3GPP Downloadable output files:
    297  * Meta Data is towards the end of the clip.
    298  * Media Data is interleaved.
    299  * No temp files are used.
    300  */
    301 #define PVMP4FF_3GPP_DOWNLOAD_MODE  0x00000009
    302 
    303 #define PVMP4FF_SET_FIRST_SAMPLE_EDIT_MODE  0x00000010
    304 
    305 // movie fragment mode
    306 // 6th bit is now reserved movie fragment mode and last bit is reserved for interleaving
    307 #define PVMP4FF_MOVIE_FRAGMENT_MODE 0x00000021
    308 
    309 #define DEFAULT_MOVIE_FRAGMENT_DURATION_IN_MS 10000
    310 
    311 class PVMP4FFComposerAudioEncodeParams
    312 {
    313     public:
    314         PVMP4FFComposerAudioEncodeParams()
    315         {
    316             samplingRate = 0;
    317             numberOfChannels = 2;
    318             bitsPerSample = 16;
    319         }
    320 
    321         uint32 samplingRate;
    322         uint32 numberOfChannels;
    323         uint32 bitsPerSample;
    324 };
    325 
    326 #endif
    327 
    328 
    329