blob: cb5e50211c3e7078f86dcbae90cd4737fac8595c [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 2008 PacketVideo
*
* 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.
* -------------------------------------------------------------------
*/
#define IMPLEMENT_MovieExtendsAtom
#include "movieextendsatom.h"
typedef Oscl_Vector <PVA_FF_TrackExtendsAtom*, OsclMemAllocator> PVA_FF_TrackExtendsAtomVecType;
// constructor
PVA_FF_MovieExtendsAtom::PVA_FF_MovieExtendsAtom()
: PVA_FF_Atom(MOVIE_EXTENDS_ATOM)
{
PV_MP4_FF_NEW(fp->auditCB, PVA_FF_MovieExtendsHeaderAtom, (), _pMehdAtom);
_pMehdAtom->setParent(this);
PV_MP4_FF_NEW(fp->auditCB, PVA_FF_TrackExtendsAtomVecType, (), _pTrexAtomVec);
recomputeSize();
}
//destructor
PVA_FF_MovieExtendsAtom::~PVA_FF_MovieExtendsAtom()
{
PV_MP4_FF_DELETE(NULL, PVA_FF_MovieExtendsHeaderAtom, _pMehdAtom);
// Delete trex atoms
for (uint32 ii = 0; ii < _pTrexAtomVec->size(); ii++)
{
PV_MP4_FF_DELETE(NULL, PVA_FF_TrackExtendAtom, (*_pTrexAtomVec)[ii]);
}
PV_MP4_FF_TEMPLATED_DELETE(NULL, PVA_FF_TrackExtendsAtomVecType, Oscl_Vector, _pTrexAtomVec);
}
// returns pointer to movie extension header atom
PVA_FF_MovieExtendsHeaderAtom*
PVA_FF_MovieExtendsAtom::getMehdAtom()
{
return _pMehdAtom;
}
// set movie fragment duration
void
PVA_FF_MovieExtendsAtom::setMovieFragmentDuration(uint32 duration)
{
_pMehdAtom->setFragmentDuration(duration);
}
// update fragment duration
void
PVA_FF_MovieExtendsAtom::updateMovieFragmentDuration(uint32 ts)
{
_pMehdAtom->updateMovieFragmentDuration(ts);
}
// write fragment duration into target file
void
PVA_FF_MovieExtendsAtom::writeMovieFragmentDuration(MP4_AUTHOR_FF_FILE_IO_WRAP* fp)
{
_pMehdAtom->writeMovieFragmentDuration(fp);
}
// return fragement duration
uint32
PVA_FF_MovieExtendsAtom::getDuration()
{
return _pMehdAtom->getFragmentDuration();
}
// add new trex atom to the list
void
PVA_FF_MovieExtendsAtom::addTrexAtom(PVA_FF_TrackExtendsAtom *pTrexAtom)
{
_pTrexAtomVec->push_back(pTrexAtom);
pTrexAtom->setParent(this);
recomputeSize();
}
// returns trex atom corressponding to track id
PVA_FF_TrackExtendsAtom*
PVA_FF_MovieExtendsAtom::getTrexAtom(uint32 trackId)
{
if (_pTrexAtomVec->size() != 0)
{
for (uint32 ii = 0; ii < _pTrexAtomVec->size(); ii++)
{
if (trackId == ((*_pTrexAtomVec)[ii])->getTrackId())
return ((*_pTrexAtomVec)[ii]);
}
}
return NULL;
}
// Recomputes the size of the current atom by checking all contained atoms
void
PVA_FF_MovieExtendsAtom::recomputeSize()
{
int32 size = getDefaultSize(); // From base class
// add size of mehd atom
size += _pMehdAtom->getSize();
// add size of Trex atoms
if (_pTrexAtomVec->size() != 0)
{
for (uint32 ii = 0; ii < _pTrexAtomVec->size(); ii++)
{
size += ((*_pTrexAtomVec)[ii])->getSize();
}
}
_size = size;
// Update the size of the parent atom since this child atom may have changed
if (_pparent != NULL)
{
_pparent->recomputeSize();
}
}
// Write the atom into target file
bool
PVA_FF_MovieExtendsAtom::renderToFileStream(MP4_AUTHOR_FF_FILE_IO_WRAP* fp)
{
uint32 rendered = 0;
if (!renderAtomBaseMembers(fp))
{
return false;
}
rendered += getDefaultSize();
// Render the movie extend header atom
if (!_pMehdAtom->renderToFileStream(fp))
{
return false;
}
rendered += getMehdAtom()->getSize();
// render track extend atoms
if (_pTrexAtomVec->size() != 0)
{
for (uint32 ii = 0; ii < _pTrexAtomVec->size(); ii++)
{
if (!((*_pTrexAtomVec)[ii])->renderToFileStream(fp))
{
return false;
}
rendered += ((*_pTrexAtomVec)[ii])->getSize();
}
}
return true;
}