/* * 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_Utils.c * @brief Utilities and private functions for the MP4 writer ****************************************************************************** */ #include "NXPSW_CompilerSwitches.h" #ifndef _M4MP4W_USE_CST_MEMORY_WRITER #include "M4MP4W_Utils.h" #include "M4OSA_Error.h" #include "M4MP4W_Types.h" #define ERR_CHECK(exp, err) if (!(exp)) { return err; } /*******************************************************************************/ M4OSA_ERR M4MP4W_putByte(M4OSA_UChar c, M4OSA_FileWriterPointer* fileFunction, M4OSA_Context context) /*******************************************************************************/ { M4OSA_ERR err = fileFunction->writeData(context, (M4OSA_MemAddr8)&c, 1); return err; } /*******************************************************************************/ M4OSA_ERR M4MP4W_putBE16(M4OSA_UInt32 val, M4OSA_FileWriterPointer* fileFunction, M4OSA_Context context) /*******************************************************************************/ { M4OSA_ERR err; err = M4MP4W_putByte((M4OSA_UChar)(val >> 8), fileFunction, context); ERR_CHECK(err == M4NO_ERROR, err); err = M4MP4W_putByte((M4OSA_UChar)val, fileFunction, context); return err; } /*******************************************************************************/ M4OSA_ERR M4MP4W_putBE24(M4OSA_UInt32 val, M4OSA_FileWriterPointer* fileFunction, M4OSA_Context context) /*******************************************************************************/ { M4OSA_ERR err; err = M4MP4W_putByte((M4OSA_UChar)(val >> 16), fileFunction, context); ERR_CHECK(err == M4NO_ERROR, err); err = M4MP4W_putByte((M4OSA_UChar)(val >> 8), fileFunction, context); ERR_CHECK(err == M4NO_ERROR, err); err = M4MP4W_putByte((M4OSA_UChar)val, fileFunction, context); return err; } /*******************************************************************************/ M4OSA_ERR M4MP4W_putBE32(M4OSA_UInt32 val, M4OSA_FileWriterPointer* fileFunction, M4OSA_Context context) /*******************************************************************************/ { M4OSA_ERR err; err = M4MP4W_putByte((M4OSA_UChar)(val >> 24), fileFunction, context); ERR_CHECK(err == M4NO_ERROR, err); err = M4MP4W_putByte((M4OSA_UChar)(val >> 16), fileFunction, context); ERR_CHECK(err == M4NO_ERROR, err); err = M4MP4W_putByte((M4OSA_UChar)(val >> 8), fileFunction, context); ERR_CHECK(err == M4NO_ERROR, err); err = M4MP4W_putByte((M4OSA_UChar)val, fileFunction, context); return err; } /*******************************************************************************/ M4OSA_ERR M4MP4W_putBlock(const M4OSA_UChar* Block, M4OSA_UInt32 size, M4OSA_FileWriterPointer* fileFunction, M4OSA_Context context) /*******************************************************************************/ { M4OSA_ERR err = fileFunction->writeData(context, (M4OSA_MemAddr8)Block, size); return err; } /*******************************************************************************/ void M4MP4W_convertInt32BE(M4OSA_UInt32* valPtr) /*******************************************************************************/ { M4OSA_UChar a, b; M4OSA_UChar* c = (M4OSA_UChar*)valPtr; a = *(c); b = *(c+1); *(c) = *(c+3); *(c+1) = *(c+2); *(c+2) = b; *(c+3) = a; } /*******************************************************************************/ void M4MP4W_table32ToBE(M4OSA_UInt32* tab, M4OSA_UInt32 nb) /*******************************************************************************/ { M4OSA_UInt32 i; for (i=0; i<nb; i++) M4MP4W_convertInt32BE(&(tab)[i]); } /*******************************************************************************/ void* M4MP4W_realloc(M4OSA_MemAddr32 ptr, M4OSA_UInt32 oldSize, M4OSA_UInt32 newSize) /*******************************************************************************/ { M4OSA_MemAddr32 ptr2 = (M4OSA_MemAddr32)M4OSA_32bitAlignedMalloc(newSize, M4MP4_WRITER, (M4OSA_Char *)"realloc"); if (M4OSA_NULL != ptr2) { memcpy((void *)ptr2, (void *)ptr, oldSize); } free(ptr); return ptr2; } /*******************************************************************************/ M4OSA_ERR M4MP4W_freeContext(M4OSA_Context context) /*******************************************************************************/ { #ifdef _M4MP4W_MOOV_FIRST M4OSA_UInt32 i; #endif /*_M4MP4W_MOOV_FIRST*/ M4MP4W_Mp4FileData* mMp4FileDataPtr = (M4MP4W_Mp4FileData*)context; ERR_CHECK(context != M4OSA_NULL, M4ERR_PARAMETER); /*freeContext is now called after closeWrite*/ ERR_CHECK( mMp4FileDataPtr->state == M4MP4W_closed, M4ERR_STATE); mMp4FileDataPtr->state = M4MP4W_closed; if (mMp4FileDataPtr->audioTrackPtr != M4OSA_NULL) { /*delete also other chunks if any*/ /*for (i=0; i<=mMp4FileDataPtr->audioTrackPtr->currentChunk; i++)*/ #ifdef _M4MP4W_MOOV_FIRST for (i=0; i<=mMp4FileDataPtr->audioTrackPtr->LastAllocatedChunk; i++) { free(mMp4FileDataPtr->audioTrackPtr->Chunk[i]); } #else if ((M4OSA_NULL != mMp4FileDataPtr->audioTrackPtr->Chunk) && (M4OSA_NULL != mMp4FileDataPtr->audioTrackPtr->Chunk[0])) { free(mMp4FileDataPtr->audioTrackPtr->Chunk[0]); } if (M4OSA_NULL != mMp4FileDataPtr->audioTrackPtr->chunkOffsetTable) { free(mMp4FileDataPtr->audioTrackPtr->chunkOffsetTable); } #endif /*_M4MP4W_MOOV_FIRST*/ /*now dynamic*/ if (M4OSA_NULL != mMp4FileDataPtr->audioTrackPtr->Chunk) { free(mMp4FileDataPtr->audioTrackPtr->Chunk); } if (M4OSA_NULL != mMp4FileDataPtr->audioTrackPtr->chunkSizeTable) { free(mMp4FileDataPtr->audioTrackPtr->chunkSizeTable); } if (M4OSA_NULL != mMp4FileDataPtr->audioTrackPtr->chunkSampleNbTable) { free(mMp4FileDataPtr->audioTrackPtr->chunkSampleNbTable); } if (M4OSA_NULL != mMp4FileDataPtr->audioTrackPtr->chunkTimeMsTable) { free(mMp4FileDataPtr->audioTrackPtr->chunkTimeMsTable); } if (mMp4FileDataPtr->audioTrackPtr->TABLE_STTS != M4OSA_NULL) { free(mMp4FileDataPtr->audioTrackPtr->TABLE_STTS); } if (mMp4FileDataPtr->audioTrackPtr->TABLE_STSZ != M4OSA_NULL) { free(mMp4FileDataPtr->audioTrackPtr->TABLE_STSZ); } if (mMp4FileDataPtr->audioTrackPtr->DSI != M4OSA_NULL) { free(mMp4FileDataPtr->audioTrackPtr->DSI); mMp4FileDataPtr->audioTrackPtr->DSI = M4OSA_NULL; } free(mMp4FileDataPtr->audioTrackPtr); mMp4FileDataPtr->audioTrackPtr = M4OSA_NULL; } if (mMp4FileDataPtr->videoTrackPtr != M4OSA_NULL) { /*delete also other chunks if any*/ /*for (i=0; i<=mMp4FileDataPtr->videoTrackPtr->currentChunk; i++)*/ #ifdef _M4MP4W_MOOV_FIRST for (i=0; i<=mMp4FileDataPtr->videoTrackPtr->LastAllocatedChunk; i++) { free(mMp4FileDataPtr->videoTrackPtr->Chunk[i]); } #else if ((M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->Chunk) && (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->Chunk[0])) { free(mMp4FileDataPtr->videoTrackPtr->Chunk[0]); } if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->chunkOffsetTable) { free(mMp4FileDataPtr->videoTrackPtr->chunkOffsetTable); } #endif /*_M4MP4W_MOOV_FIRST*/ /*now dynamic*/ if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->Chunk) { free(mMp4FileDataPtr->videoTrackPtr->Chunk); } if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->chunkSizeTable) { free(mMp4FileDataPtr->videoTrackPtr->chunkSizeTable); } if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->chunkSampleNbTable) { free(mMp4FileDataPtr->videoTrackPtr->chunkSampleNbTable); } if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->chunkTimeMsTable) { free(mMp4FileDataPtr->videoTrackPtr->chunkTimeMsTable); } if (mMp4FileDataPtr->videoTrackPtr->DSI != M4OSA_NULL) { free(mMp4FileDataPtr->videoTrackPtr->DSI); mMp4FileDataPtr->videoTrackPtr->DSI = M4OSA_NULL; } /*now dynamic*/ if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->TABLE_STTS) { free(mMp4FileDataPtr->videoTrackPtr->TABLE_STTS); } if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->TABLE_STSZ) { free(mMp4FileDataPtr->videoTrackPtr->TABLE_STSZ); } if (M4OSA_NULL != mMp4FileDataPtr->videoTrackPtr->TABLE_STSS) { free(mMp4FileDataPtr->videoTrackPtr->TABLE_STSS); } free(mMp4FileDataPtr->videoTrackPtr); mMp4FileDataPtr->videoTrackPtr = M4OSA_NULL; } if (mMp4FileDataPtr->embeddedString != M4OSA_NULL) { free(mMp4FileDataPtr->embeddedString); mMp4FileDataPtr->embeddedString = M4OSA_NULL; } free(mMp4FileDataPtr); return M4NO_ERROR; } #ifdef _M4MP4W_OPTIMIZE_FOR_PHONE /*******************************************************************************/ M4OSA_Void M4MP4W_put32_Hi(M4OSA_UInt32* tab, M4OSA_UInt16 Hi) /*******************************************************************************/ { *tab &= 0xFFFF; *tab |= Hi<<16; } /*******************************************************************************/ M4OSA_Void M4MP4W_put32_Lo(M4OSA_UInt32* tab, M4OSA_UInt16 Lo) /*******************************************************************************/ { *tab &= 0xFFFF0000; *tab |= Lo; } /*******************************************************************************/ M4OSA_UInt16 M4MP4W_get32_Hi(M4OSA_UInt32* tab) /*******************************************************************************/ { return (*tab >> 16) & 0xFFFF; } /*******************************************************************************/ M4OSA_UInt16 M4MP4W_get32_Lo(M4OSA_UInt32* tab) /*******************************************************************************/ { return *tab & 0xFFFF; } #endif #endif /* _M4MP4W_USE_CST_MEMORY_WRITER */