blob: 25cad21eca791605fca14367bee69fbbfb8052eb [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 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.
* -------------------------------------------------------------------
*/
#include "filetypeatom.h"
#include "atomutils.h"
typedef Oscl_Vector<uint32, OsclMemAllocator> uint32VecType;
OSCL_EXPORT_REF FileTypeAtom::FileTypeAtom(MP4_FF_FILE *fp, uint32 size, uint32 type)
: Atom(fp, size, type)
{
uint32 i, brandName, atomSize;
_pCompatible_brand = NULL;
_pMajorBrand = 0;
_pVersion = 0;
if (_success)
{
PV_MP4_FF_NEW(fp->auditCB, uint32VecType, (), _pCompatible_brand);
// ftype size is only 8. In that case we should not read beyond the atom boundry blindly
atomSize = getSize();
int32 count = atomSize;
count -= DEFAULT_ATOM_SIZE;
if (atomSize >= MINIMUM_SIZE_REQUIRED_TO_READ_MAJOR_BRAND)
{
AtomUtils::read32(fp, _pMajorBrand);
count -= 4;
}
// Read only when it is inside the atom size specified. dont just assume that it is present
if (atomSize >= MINIMUM_SIZE_REQUIRED_TO_READ_MINOR_VERSION)
{
AtomUtils::read32(fp, _pVersion);
count -= 4;
}
//subtract 16 bytes, 4 from tag and 4 from size 4 from Brand and 4 from Version, now I assume
//the size if the total atom
if (atomSize >= 16)
{
for (i = 0; i < atomSize - 16; i += 4)
{
if (count >= 4)
{
AtomUtils::read32(fp, brandName);
(*_pCompatible_brand).push_back(brandName);
count -= 4;
}
}
}
if (count > 0)
{
AtomUtils::seekFromCurrPos(fp, count);
}
}
else
{
_success = false;
_mp4ErrorCode = READ_FILE_TYPE_ATOM_FAILED;
}
}
// Destructor
OSCL_EXPORT_REF FileTypeAtom::~FileTypeAtom()
{
if (_pCompatible_brand != NULL)
PV_MP4_FF_TEMPLATED_DELETE(NULL, uint32VecType, Oscl_Vector, _pCompatible_brand);
}