/*
* 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 */