Home | History | Annotate | Download | only in inc
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      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 express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /**
     18  ******************************************************************************
     19  * @file    M4MP4W_Types.h
     20  * @brief   Definition of types for the core MP4 writer
     21  ******************************************************************************
     22  */
     23 
     24 #ifndef M4MP4W_TYPES_H
     25 #define M4MP4W_TYPES_H
     26 
     27 #ifdef __cplusplus
     28 extern "C" {
     29 #endif /* __cplusplus */
     30 
     31 #include "NXPSW_CompilerSwitches.h"
     32 
     33 #ifndef _M4MP4W_USE_CST_MEMORY_WRITER
     34 
     35 /* includes */
     36 #include "M4OSA_Types.h"
     37 #include "M4OSA_FileWriter.h"
     38 #include "M4OSA_FileReader.h"
     39 #include "M4SYS_Stream.h"
     40 
     41 /**
     42  ******************************************************************************
     43  * structure    M4MP4C_FtypBox
     44  * @brief       Information to build the 'ftyp' atom
     45  ******************************************************************************
     46  */
     47 #define M4MPAC_FTYP_TAG 0x66747970 /* 'ftyp' */
     48 #define M4MPAC_MAX_COMPATIBLE_BRANDS 10
     49 typedef struct
     50 {
     51     /* All brand fields are actually char[4] stored in big-endian integer format */
     52 
     53     M4OSA_UInt32    major_brand;         /* generally '3gp4'            */
     54     M4OSA_UInt32    minor_version;       /* generally '0000' or 'x.x '  */
     55     M4OSA_UInt32    nbCompatibleBrands;  /* number of compatible brands */
     56     M4OSA_UInt32    compatible_brands[M4MPAC_MAX_COMPATIBLE_BRANDS];   /* array of max compatible
     57                                                                        brands */
     58 } M4MP4C_FtypBox;
     59 
     60 
     61 /**
     62  ******************************************************************************
     63  * structure    M4MP4W_memAddr
     64  * @brief        Buffer structure for the MP4 writer
     65  ******************************************************************************
     66  */
     67 typedef struct
     68 {
     69     M4OSA_UInt32        size;
     70     M4OSA_MemAddr32    addr;
     71 } M4MP4W_memAddr;
     72 
     73 /**
     74  ******************************************************************************
     75  * Time type for the core MP4 writer
     76  ******************************************************************************
     77  */
     78 typedef M4OSA_UInt32 M4MP4W_Time32;
     79 
     80 /**
     81  ******************************************************************************
     82  * enumeration   M4MP4W_State
     83  * @brief        This enum defines the core MP4 writer states
     84  * @note         These states are used internaly, but can be retrieved from outside
     85  *               the writer.
     86  ******************************************************************************
     87  */
     88 typedef enum
     89 {
     90     M4MP4W_opened            = 0x100,
     91     M4MP4W_ready             = 0x200,
     92     M4MP4W_writing           = 0x300,
     93     M4MP4W_writing_startAU   = 0x301,
     94     M4MP4W_closed            = 0x400
     95 } M4MP4W_State;
     96 
     97 /**
     98  ******************************************************************************
     99  * enumeration    M4MP4W_OptionID
    100  * @brief        This enum defines the core MP4 writer options
    101  * @note        These options give parameters for the core MP4 writer
    102  ******************************************************************************
    103  */
    104 typedef enum
    105 {
    106     M4MP4W_maxAUperChunk        = 0xC101,
    107     M4MP4W_maxChunkSize         = 0xC102,
    108     M4MP4W_maxChunkInter        = 0xC103,
    109     M4MP4W_preWriteCallBack     = 0xC104,
    110     M4MP4W_postWriteCallBack    = 0xC105,
    111     M4MP4W_maxAUsize            = 0xC106,
    112     M4MP4W_IOD                  = 0xC111,
    113     M4MP4W_ESD                  = 0xC112,
    114     M4MP4W_SDP                  = 0xC113,
    115     M4MP4W_trackSize            = 0xC114,
    116     M4MP4W_MOOVfirst            = 0xC121,
    117     M4MP4W_V2_MOOF              = 0xC131,
    118     M4MP4W_V2_tblCompres        = 0xC132,
    119     /*warning: unspecified options:*/
    120     M4MP4W_maxFileSize          = 0xC152,
    121     M4MP4W_CamcoderVersion      = 0xC153, /*000 to 999 !*/
    122     M4MP4W_estimateAudioSize    = 0xC154, /*audio AUs are processed after the video, */
    123     /*this option MUST NOT be set if non constant audio
    124     frame size (e.g. if SID)*/
    125     M4MP4W_embeddedString       = 0xC155,
    126     M4MP4W_integrationTag       = 0xC156,
    127     M4MP4W_maxFileDuration      = 0xC157,
    128     M4MP4W_setFtypBox           = 0xC158,
    129     M4MP4W_DSI                  = 0xC159,
    130     /* H.264 trimming */
    131     M4MP4W_MUL_PPS_SPS          = 0xC160,
    132     /* H.264 trimming */
    133 } M4MP4W_OptionID;
    134 
    135 /**
    136  ******************************************************************************
    137  * Audio & video stream IDs
    138  ******************************************************************************
    139  */
    140 #define AudioStreamID 1
    141 #define VideoStreamID 2
    142 
    143 /**
    144  ******************************************************************************
    145  * Default parameters values, that can be modified by M4MP4W_setOption
    146  ******************************************************************************
    147  */
    148 #define M4MP4W_DefaultWidth 320
    149 #define M4MP4W_DefaultHeight 240
    150 #define M4MP4W_DefaultMaxAuSize  4096 /*bytes*/
    151 #define M4MP4W_DefaultMaxChunkSize 100000 /*bytes*/
    152 #define M4MP4W_DefaultInterleaveDur 0 /*bytes*/
    153 
    154 
    155 /**
    156  ******************************************************************************
    157  * structure    M4MP4W_StreamIDsize
    158  * @brief        Video plane size
    159  ******************************************************************************
    160  */
    161 typedef struct
    162 {
    163     M4SYS_StreamID streamID;
    164     M4OSA_UInt16    height;
    165     M4OSA_UInt16    width;
    166 } M4MP4W_StreamIDsize;
    167 
    168 /**
    169  ******************************************************************************
    170  * structure    M4MP4W_TrackData
    171  * @brief       Internal core MP4 writer track structure
    172  ******************************************************************************
    173  */
    174 typedef struct
    175 {
    176     M4SYS_StreamType    trackType;
    177     M4OSA_UInt32        timescale;          /* T (video=1000), (AMR8=8000), (AMR16=16000)*/
    178     M4OSA_UInt32        sampleSize;         /* S (video=0)*/
    179     M4OSA_UInt32        sttsTableEntryNb;   /* J (audio=1)*/
    180     M4MP4W_Time32        lastCTS;           /* CTS of the previous AU,
    181                                                init to 0.Gives duration at the end.*/
    182     M4OSA_UInt32        sampleNb;           /* K (audio=F)*/
    183 } M4MP4W_TrackData;
    184 
    185 /**
    186  ******************************************************************************
    187  * structure    M4MP4W_AudioTrackData
    188  * @brief       Internal core MP4 writer audio specific structure
    189  ******************************************************************************
    190  */
    191 typedef struct
    192 {
    193     M4MP4W_State            microState;
    194     M4MP4W_TrackData        CommonData;
    195     M4OSA_UChar**           Chunk;
    196     M4OSA_UInt32*           chunkSizeTable;
    197 #ifndef _M4MP4W_MOOV_FIRST
    198     M4OSA_UInt32*           chunkOffsetTable;
    199 #endif /*_M4MP4W_MOOV_FIRST*/
    200     M4OSA_UInt32*           chunkSampleNbTable;
    201     M4OSA_UInt32*           chunkTimeMsTable;
    202     M4OSA_UInt32            currentChunk;       /* Init to 0*/
    203     M4OSA_UInt32            currentPos;         /* Init to 0 */
    204 #ifdef _M4MP4W_OPTIMIZE_FOR_PHONE
    205     M4OSA_UInt32            currentStsc;        /* Init to 0 */
    206 #endif
    207     M4MP4W_Time32           sampleDuration;     /* Check (AMR8=160), (AMR16=320)*/
    208     M4OSA_UInt32            MaxChunkSize;       /* Init to M4MP4W_Mp4FileData.MaxChunkSize*/
    209     M4OSA_UInt32            MaxAUSize;          /* Init to M4MP4W_Mp4FileData.MaxAUSize*/
    210     M4OSA_UInt32            LastAllocatedChunk;
    211     /* previously, audio au size was supposed constant,
    212      * which is actually not the case if silences (sid).*/
    213     /* at first audio au, sampleSize is set. It is later reset to 0 if non constant size.*/
    214     /* So sampleSize should be tested to know weither or not there is a TABLE_STSZ. */
    215     M4OSA_UInt32*           TABLE_STSZ; /* table size is 4K*/
    216     M4OSA_UInt32            nbOfAllocatedStszBlocks;
    217     M4OSA_UInt32*           TABLE_STTS;
    218     M4OSA_UInt32            nbOfAllocatedSttsBlocks;
    219     M4OSA_UInt32            maxBitrate;     /*not used in amr case*/
    220     M4OSA_UInt32            avgBitrate;     /*not used in amr case*/
    221     M4OSA_UChar*            DSI;            /* Decoder Specific Info: May be M4OSA_NULL
    222                                             (defaulted) for AMR */
    223     M4OSA_UInt8             dsiSize;        /* DSI size, always 9 bytes for AMR */
    224 } M4MP4W_AudioTrackData;
    225 
    226 
    227 /**
    228  ******************************************************************************
    229  * structure    M4MP4W_VideoTrackData
    230  * @brief        Internal core MP4 writer video specific structure
    231  ******************************************************************************
    232  */
    233 typedef struct
    234 {
    235     M4MP4W_State            microState;
    236     M4MP4W_TrackData        CommonData;
    237     M4OSA_UChar**           Chunk;
    238     M4OSA_UInt32*           chunkSizeTable;
    239 #ifndef _M4MP4W_MOOV_FIRST
    240     M4OSA_UInt32*           chunkOffsetTable;
    241 #endif /*_M4MP4W_MOOV_FIRST*/
    242     M4OSA_UInt32*           chunkSampleNbTable;
    243     M4MP4W_Time32*          chunkTimeMsTable;
    244     M4OSA_UInt32            currentChunk;            /* Init to 0*/
    245     M4OSA_UInt32            currentPos ;             /* Init to 0*/
    246 #ifdef _M4MP4W_OPTIMIZE_FOR_PHONE
    247     M4OSA_UInt32            currentStsc;             /* Init to 0*/
    248 #endif
    249     M4OSA_UInt32            stssTableEntryNb ;       /* N*/
    250     M4OSA_UInt16            width;                   /* X*/
    251     M4OSA_UInt16            height;                  /* Y*/
    252     M4OSA_UInt32*           TABLE_STTS;              /* table size is J*/
    253     M4OSA_UInt32            nbOfAllocatedSttsBlocks;
    254 #ifdef _M4MP4W_OPTIMIZE_FOR_PHONE
    255     M4OSA_UInt16*           TABLE_STSZ;              /* table size is 2K*/
    256 #else
    257     M4OSA_UInt32*           TABLE_STSZ;              /* table size is 4K*/
    258 #endif
    259     M4OSA_UInt32            nbOfAllocatedStszBlocks;
    260     M4OSA_UInt32*           TABLE_STSS;              /* table size is N*/
    261     M4OSA_UInt32            nbOfAllocatedStssBlocks;
    262 #ifdef _M4MP4W_OPTIMIZE_FOR_PHONE
    263     M4OSA_UInt32            MaxAUperChunk;           /*Init to 0, i.e. not used*/
    264 #endif
    265     M4OSA_UInt32            MaxChunkSize;            /*Init to M4MP4W_Mp4FileData.MaxChunkSize*/
    266     M4OSA_UInt32            MaxAUSize;               /*Init to M4MP4W_Mp4FileData.MaxAUSize*/
    267     M4OSA_UInt32            LastAllocatedChunk;
    268     M4OSA_UInt32            maxBitrate;
    269     M4OSA_UInt32            avgBitrate;
    270     M4OSA_UChar*            DSI;            /* Decoder Specific Info: May be M4OSA_NULL
    271                                             (defaulted) for H263*/
    272     M4OSA_UInt8             dsiSize;        /* DSI size, always 7 bytes for H263 */
    273 } M4MP4W_VideoTrackData;
    274 
    275 /**
    276  ******************************************************************************
    277  * structure    M4MP4W_Mp4FileData
    278  * @brief       Internal core MP4 writer private context structure
    279  ******************************************************************************
    280  */
    281 typedef struct
    282 {
    283     M4MP4W_State                  state;
    284     M4OSA_Char*                   url;
    285     M4OSA_UInt32                  duration;    /* D in ms, max duration of audio&video*/
    286     M4OSA_UInt32                  filesize;    /* actual filesize in bytes*/
    287     M4MP4W_AudioTrackData*        audioTrackPtr;
    288     M4OSA_Bool                    hasAudio;
    289     M4MP4W_VideoTrackData*        videoTrackPtr;
    290     M4OSA_Bool                    hasVideo;
    291     M4OSA_UInt32                  MaxChunkSize;       /* Init to 100000*/
    292     M4OSA_UInt32                  MaxAUSize;          /* Init to 4096*/
    293     M4OSA_UInt32                  MaxFileSize;        /* Init to 0, i.e. not used*/
    294     M4MP4W_Time32                 InterleaveDur;      /* Init to 0, i.e. not used, ms*/
    295     /* M4MP4W_WriteCallBack            PreWriteCallBack;*/    /*Init to M4OSA_NULL*/
    296     /* M4MP4W_WriteCallBack            PostWriteCallBack;*/ /*Init to M4OSA_NULL*/
    297     M4OSA_FileWriterPointer*      fileWriterFunctions;
    298     M4OSA_FileReadPointer*        fileReaderFunctions;
    299     M4OSA_UInt32                  camcoderVersion;
    300     M4OSA_Bool                    estimateAudioSize;  /* default is false*/
    301     M4OSA_UInt32                  audioMsChunkDur;    /* in ms, set only if estimateAudioSize
    302                                                          is true*/
    303     M4OSA_UInt32                  audioMsStopTime;    /* time to stop audio, set only if
    304                                                          estimateAudioSize is true*/
    305     M4OSA_Context                 fileWriterContext;
    306 #ifndef _M4MP4W_MOOV_FIRST
    307     M4OSA_UInt32                  absoluteCurrentPos; /* new field for offset update*/
    308 #endif /*_M4MP4W_MOOV_FIRST*/
    309     M4OSA_UChar*                  embeddedString;     /* 16 bytes string, default value
    310                                                          writen if NULL*/
    311     M4OSA_UChar*                  integrationTag;     /* 60 bytes string, memset to 0 if NULL */
    312     M4OSA_UInt32                  MaxFileDuration;    /* Init to 0, i.e. not used*/
    313     M4MP4C_FtypBox                ftyp;               /* ftyp atom, if not defined set major_brand
    314                                                             = 0, will use default box */
    315 #ifdef _M4MP4W_RESERVED_MOOV_DISK_SPACE
    316     M4OSA_Char*                    safetyFileUrl;
    317     M4OSA_Bool                        cleanSafetyFile;
    318 #endif /* _M4MP4W_RESERVED_MOOV_DISK_SPACE */
    319     M4OSA_Bool                               bMULPPSSPS;
    320 } M4MP4W_Mp4FileData;
    321 
    322 #endif /* _M4MP4W_USE_CST_MEMORY_WRITER */
    323 
    324 #ifdef __cplusplus
    325 }
    326 #endif /* __cplusplus */
    327 
    328 #endif /*M4MP4W_TYPES_H*/
    329 
    330