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
28extern "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
49typedef 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 */
67typedef 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 */
78typedef 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 */
88typedef 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 */
104typedef 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 */
161typedef 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 */
174typedef 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 */
191typedef 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 */
233typedef 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 */
281typedef 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