blob: c36a8f2c6624a9340021c145b0b18699b046fb66 [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.
* -------------------------------------------------------------------
*/
/*
This PVA_FF_SyncSampleAtom Class provides a compact marking of the random access
points within the stream.
*/
#define IMPLEMENT_SyncSampleAtom
#include "syncsampleatom.h"
#include "atomutils.h"
#include "a_atomdefs.h"
typedef Oscl_Vector<uint32, OsclMemAllocator> uint32VecType;
// Constructor
PVA_FF_SyncSampleAtom::PVA_FF_SyncSampleAtom()
: PVA_FF_FullAtom(SYNC_SAMPLE_ATOM, (uint8)0, (uint32)0)
{
_entryCount = 0;
PV_MP4_FF_NEW(fp->auditCB, uint32VecType, (), _psampleNumbers);
_nextSampleNumber = 0;
recomputeSize();
}
// Destructor
PVA_FF_SyncSampleAtom::~PVA_FF_SyncSampleAtom()
{
// Cleanup vector
PV_MP4_FF_TEMPLATED_DELETE(NULL, uint32VecType, Oscl_Vector, _psampleNumbers);
}
// This atom maintains a vector of sample numbers that are random access point samples
// i.e. I-frames. This information if passes in through a single byte flag that fp parsed
// to get the vop_coding_type
void
PVA_FF_SyncSampleAtom::nextSample(uint8 flags)
{
// Flags Format:
// | mtb (1) | layer_id (3) | coding_type (2) | ref_select_code (2) |
uint8 codingType = (uint8)((flags >> 2) & 0x03);
if (codingType == CODING_TYPE_I) // Need to check if sample fp an I-frame, then add entry to vector
{
addSampleNumber(_nextSampleNumber);
}
_nextSampleNumber++; // Increment sample nuber regardless of whether
// or not you add it to the vector
}
// Adding to and getting the sample number values
void
PVA_FF_SyncSampleAtom::addSampleNumber(uint32 sample)
{
_psampleNumbers->push_back(sample);
_entryCount += 1;
recomputeSize();
}
// Rendering the PVA_FF_Atom in proper format (bitlengths, etc.) to an ostream
bool
PVA_FF_SyncSampleAtom::renderToFileStream(MP4_AUTHOR_FF_FILE_IO_WRAP *fp)
{
int32 rendered = 0;
if (!renderAtomBaseMembers(fp))
{
return false;
}
rendered += getDefaultSize();
if (!PVA_FF_AtomUtils::render32(fp, getEntryCount()))
{
return false;
}
rendered += 4;
// Need to render in a 1-based index vector instead of a 0-based index array
int32 ARRAY_OFFSET_1_BASE = 1;
if (_psampleNumbers != NULL)
{
if (_psampleNumbers->size() < _entryCount)
{
return false;
}
for (uint32 i = 0; i < _entryCount; i++)
{
if (!PVA_FF_AtomUtils::render32(fp, (*_psampleNumbers)[i] + ARRAY_OFFSET_1_BASE))
{
return false;
}
}
}
rendered += 4 * _entryCount;
return true;
}
void
PVA_FF_SyncSampleAtom::recomputeSize()
{
int32 size = getDefaultSize();
size += 4; // For entryCount
size += 4 * _entryCount;
_size = size;
// Update size of parent atom
if (_pparent != NULL)
{
_pparent->recomputeSize();
}
}