blob: 5f9d16b0329bace06c31f1e6af924ec99bcc7f57 [file] [log] [blame]
/*
* Copyright (C) 2011 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
******************************************************************************
* @file M4MP4W_Types.h
* @brief Definition of types for the core MP4 writer
******************************************************************************
*/
#ifndef M4MP4W_TYPES_H
#define M4MP4W_TYPES_H
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#include "NXPSW_CompilerSwitches.h"
#ifndef _M4MP4W_USE_CST_MEMORY_WRITER
/* includes */
#include "M4OSA_Types.h"
#include "M4OSA_FileWriter.h"
#include "M4OSA_FileReader.h"
#include "M4SYS_Stream.h"
/**
******************************************************************************
* structure M4MP4C_FtypBox
* @brief Information to build the 'ftyp' atom
******************************************************************************
*/
#define M4MPAC_FTYP_TAG 0x66747970 /* 'ftyp' */
#define M4MPAC_MAX_COMPATIBLE_BRANDS 10
typedef struct
{
/* All brand fields are actually char[4] stored in big-endian integer format */
M4OSA_UInt32 major_brand; /* generally '3gp4' */
M4OSA_UInt32 minor_version; /* generally '0000' or 'x.x ' */
M4OSA_UInt32 nbCompatibleBrands; /* number of compatible brands */
M4OSA_UInt32 compatible_brands[M4MPAC_MAX_COMPATIBLE_BRANDS]; /* array of max compatible
brands */
} M4MP4C_FtypBox;
/**
******************************************************************************
* structure M4MP4W_memAddr
* @brief Buffer structure for the MP4 writer
******************************************************************************
*/
typedef struct
{
M4OSA_UInt32 size;
M4OSA_MemAddr32 addr;
} M4MP4W_memAddr;
/**
******************************************************************************
* Time type for the core MP4 writer
******************************************************************************
*/
typedef M4OSA_UInt32 M4MP4W_Time32;
/**
******************************************************************************
* enumeration M4MP4W_State
* @brief This enum defines the core MP4 writer states
* @note These states are used internaly, but can be retrieved from outside
* the writer.
******************************************************************************
*/
typedef enum
{
M4MP4W_opened = 0x100,
M4MP4W_ready = 0x200,
M4MP4W_writing = 0x300,
M4MP4W_writing_startAU = 0x301,
M4MP4W_closed = 0x400
} M4MP4W_State;
/**
******************************************************************************
* enumeration M4MP4W_OptionID
* @brief This enum defines the core MP4 writer options
* @note These options give parameters for the core MP4 writer
******************************************************************************
*/
typedef enum
{
M4MP4W_maxAUperChunk = 0xC101,
M4MP4W_maxChunkSize = 0xC102,
M4MP4W_maxChunkInter = 0xC103,
M4MP4W_preWriteCallBack = 0xC104,
M4MP4W_postWriteCallBack = 0xC105,
M4MP4W_maxAUsize = 0xC106,
M4MP4W_IOD = 0xC111,
M4MP4W_ESD = 0xC112,
M4MP4W_SDP = 0xC113,
M4MP4W_trackSize = 0xC114,
M4MP4W_MOOVfirst = 0xC121,
M4MP4W_V2_MOOF = 0xC131,
M4MP4W_V2_tblCompres = 0xC132,
/*warning: unspecified options:*/
M4MP4W_maxFileSize = 0xC152,
M4MP4W_CamcoderVersion = 0xC153, /*000 to 999 !*/
M4MP4W_estimateAudioSize = 0xC154, /*audio AUs are processed after the video, */
/*this option MUST NOT be set if non constant audio
frame size (e.g. if SID)*/
M4MP4W_embeddedString = 0xC155,
M4MP4W_integrationTag = 0xC156,
M4MP4W_maxFileDuration = 0xC157,
M4MP4W_setFtypBox = 0xC158,
M4MP4W_DSI = 0xC159,
/* H.264 trimming */
M4MP4W_MUL_PPS_SPS = 0xC160,
/* H.264 trimming */
} M4MP4W_OptionID;
/**
******************************************************************************
* Audio & video stream IDs
******************************************************************************
*/
#define AudioStreamID 1
#define VideoStreamID 2
/**
******************************************************************************
* Default parameters values, that can be modified by M4MP4W_setOption
******************************************************************************
*/
#define M4MP4W_DefaultWidth 320
#define M4MP4W_DefaultHeight 240
#define M4MP4W_DefaultMaxAuSize 4096 /*bytes*/
#define M4MP4W_DefaultMaxChunkSize 100000 /*bytes*/
#define M4MP4W_DefaultInterleaveDur 0 /*bytes*/
/**
******************************************************************************
* structure M4MP4W_StreamIDsize
* @brief Video plane size
******************************************************************************
*/
typedef struct
{
M4SYS_StreamID streamID;
M4OSA_UInt16 height;
M4OSA_UInt16 width;
} M4MP4W_StreamIDsize;
/**
******************************************************************************
* structure M4MP4W_TrackData
* @brief Internal core MP4 writer track structure
******************************************************************************
*/
typedef struct
{
M4SYS_StreamType trackType;
M4OSA_UInt32 timescale; /* T (video=1000), (AMR8=8000), (AMR16=16000)*/
M4OSA_UInt32 sampleSize; /* S (video=0)*/
M4OSA_UInt32 sttsTableEntryNb; /* J (audio=1)*/
M4MP4W_Time32 lastCTS; /* CTS of the previous AU,
init to 0.Gives duration at the end.*/
M4OSA_UInt32 sampleNb; /* K (audio=F)*/
} M4MP4W_TrackData;
/**
******************************************************************************
* structure M4MP4W_AudioTrackData
* @brief Internal core MP4 writer audio specific structure
******************************************************************************
*/
typedef struct
{
M4MP4W_State microState;
M4MP4W_TrackData CommonData;
M4OSA_UChar** Chunk;
M4OSA_UInt32* chunkSizeTable;
#ifndef _M4MP4W_MOOV_FIRST
M4OSA_UInt32* chunkOffsetTable;
#endif /*_M4MP4W_MOOV_FIRST*/
M4OSA_UInt32* chunkSampleNbTable;
M4OSA_UInt32* chunkTimeMsTable;
M4OSA_UInt32 currentChunk; /* Init to 0*/
M4OSA_UInt32 currentPos; /* Init to 0 */
#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE
M4OSA_UInt32 currentStsc; /* Init to 0 */
#endif
M4MP4W_Time32 sampleDuration; /* Check (AMR8=160), (AMR16=320)*/
M4OSA_UInt32 MaxChunkSize; /* Init to M4MP4W_Mp4FileData.MaxChunkSize*/
M4OSA_UInt32 MaxAUSize; /* Init to M4MP4W_Mp4FileData.MaxAUSize*/
M4OSA_UInt32 LastAllocatedChunk;
/* previously, audio au size was supposed constant,
* which is actually not the case if silences (sid).*/
/* at first audio au, sampleSize is set. It is later reset to 0 if non constant size.*/
/* So sampleSize should be tested to know weither or not there is a TABLE_STSZ. */
M4OSA_UInt32* TABLE_STSZ; /* table size is 4K*/
M4OSA_UInt32 nbOfAllocatedStszBlocks;
M4OSA_UInt32* TABLE_STTS;
M4OSA_UInt32 nbOfAllocatedSttsBlocks;
M4OSA_UInt32 maxBitrate; /*not used in amr case*/
M4OSA_UInt32 avgBitrate; /*not used in amr case*/
M4OSA_UChar* DSI; /* Decoder Specific Info: May be M4OSA_NULL
(defaulted) for AMR */
M4OSA_UInt8 dsiSize; /* DSI size, always 9 bytes for AMR */
} M4MP4W_AudioTrackData;
/**
******************************************************************************
* structure M4MP4W_VideoTrackData
* @brief Internal core MP4 writer video specific structure
******************************************************************************
*/
typedef struct
{
M4MP4W_State microState;
M4MP4W_TrackData CommonData;
M4OSA_UChar** Chunk;
M4OSA_UInt32* chunkSizeTable;
#ifndef _M4MP4W_MOOV_FIRST
M4OSA_UInt32* chunkOffsetTable;
#endif /*_M4MP4W_MOOV_FIRST*/
M4OSA_UInt32* chunkSampleNbTable;
M4MP4W_Time32* chunkTimeMsTable;
M4OSA_UInt32 currentChunk; /* Init to 0*/
M4OSA_UInt32 currentPos ; /* Init to 0*/
#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE
M4OSA_UInt32 currentStsc; /* Init to 0*/
#endif
M4OSA_UInt32 stssTableEntryNb ; /* N*/
M4OSA_UInt16 width; /* X*/
M4OSA_UInt16 height; /* Y*/
M4OSA_UInt32* TABLE_STTS; /* table size is J*/
M4OSA_UInt32 nbOfAllocatedSttsBlocks;
#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE
M4OSA_UInt16* TABLE_STSZ; /* table size is 2K*/
#else
M4OSA_UInt32* TABLE_STSZ; /* table size is 4K*/
#endif
M4OSA_UInt32 nbOfAllocatedStszBlocks;
M4OSA_UInt32* TABLE_STSS; /* table size is N*/
M4OSA_UInt32 nbOfAllocatedStssBlocks;
#ifdef _M4MP4W_OPTIMIZE_FOR_PHONE
M4OSA_UInt32 MaxAUperChunk; /*Init to 0, i.e. not used*/
#endif
M4OSA_UInt32 MaxChunkSize; /*Init to M4MP4W_Mp4FileData.MaxChunkSize*/
M4OSA_UInt32 MaxAUSize; /*Init to M4MP4W_Mp4FileData.MaxAUSize*/
M4OSA_UInt32 LastAllocatedChunk;
M4OSA_UInt32 maxBitrate;
M4OSA_UInt32 avgBitrate;
M4OSA_UChar* DSI; /* Decoder Specific Info: May be M4OSA_NULL
(defaulted) for H263*/
M4OSA_UInt8 dsiSize; /* DSI size, always 7 bytes for H263 */
} M4MP4W_VideoTrackData;
/**
******************************************************************************
* structure M4MP4W_Mp4FileData
* @brief Internal core MP4 writer private context structure
******************************************************************************
*/
typedef struct
{
M4MP4W_State state;
M4OSA_Char* url;
M4OSA_UInt32 duration; /* D in ms, max duration of audio&video*/
M4OSA_UInt32 filesize; /* actual filesize in bytes*/
M4MP4W_AudioTrackData* audioTrackPtr;
M4OSA_Bool hasAudio;
M4MP4W_VideoTrackData* videoTrackPtr;
M4OSA_Bool hasVideo;
M4OSA_UInt32 MaxChunkSize; /* Init to 100000*/
M4OSA_UInt32 MaxAUSize; /* Init to 4096*/
M4OSA_UInt32 MaxFileSize; /* Init to 0, i.e. not used*/
M4MP4W_Time32 InterleaveDur; /* Init to 0, i.e. not used, ms*/
/* M4MP4W_WriteCallBack PreWriteCallBack;*/ /*Init to M4OSA_NULL*/
/* M4MP4W_WriteCallBack PostWriteCallBack;*/ /*Init to M4OSA_NULL*/
M4OSA_FileWriterPointer* fileWriterFunctions;
M4OSA_FileReadPointer* fileReaderFunctions;
M4OSA_UInt32 camcoderVersion;
M4OSA_Bool estimateAudioSize; /* default is false*/
M4OSA_UInt32 audioMsChunkDur; /* in ms, set only if estimateAudioSize
is true*/
M4OSA_UInt32 audioMsStopTime; /* time to stop audio, set only if
estimateAudioSize is true*/
M4OSA_Context fileWriterContext;
#ifndef _M4MP4W_MOOV_FIRST
M4OSA_UInt32 absoluteCurrentPos; /* new field for offset update*/
#endif /*_M4MP4W_MOOV_FIRST*/
M4OSA_UChar* embeddedString; /* 16 bytes string, default value
writen if NULL*/
M4OSA_UChar* integrationTag; /* 60 bytes string, memset to 0 if NULL */
M4OSA_UInt32 MaxFileDuration; /* Init to 0, i.e. not used*/
M4MP4C_FtypBox ftyp; /* ftyp atom, if not defined set major_brand
= 0, will use default box */
#ifdef _M4MP4W_RESERVED_MOOV_DISK_SPACE
M4OSA_Char* safetyFileUrl;
M4OSA_Bool cleanSafetyFile;
#endif /* _M4MP4W_RESERVED_MOOV_DISK_SPACE */
M4OSA_Bool bMULPPSSPS;
} M4MP4W_Mp4FileData;
#endif /* _M4MP4W_USE_CST_MEMORY_WRITER */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /*M4MP4W_TYPES_H*/