blob: 1b9d266d481c5be301fe824d98ceca09c990107e [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.
* -------------------------------------------------------------------
*/
/*********************************************************************************/
/* ------------------------------------------------------------------- */
/* MPEG-4 TrackHeaderAtom Class */
/* ------------------------------------------------------------------- */
/*********************************************************************************/
/*
This TrackHeaderAtom Class specifies the characteristics of a single MPEG-4
track.
*/
#define IMPLEMENT_TrackHeaderAtom
#include "trackheaderatom.h"
#include "atomutils.h"
#include "atomdefs.h"
// Stream-in Constructor
TrackHeaderAtom::TrackHeaderAtom(MP4_FF_FILE *fp, uint32 size, uint32 type)
: FullAtom(fp, size, type)
{
_layer = 0;
_alternateGroup = 0;
_width = 0;
_height = 0;
_tx = 0;
_ty = 0;
if (_success)
{
_pparent = NULL;
if (getVersion() == 1)
{
if (!AtomUtils::read64(fp, _creationTime64))
_success = false;
if (!AtomUtils::read64(fp, _modificationTime64))
_success = false;
if (!AtomUtils::read32(fp, _trackID))
_success = false;
if (!AtomUtils::read32(fp, _reserved1))
_success = false;
if (!AtomUtils::read64(fp, _duration64))
_success = false;
}
else
{
if (!AtomUtils::read32(fp, _creationTime))
_success = false;
if (!AtomUtils::read32(fp, _modificationTime))
_success = false;
if (!AtomUtils::read32(fp, _trackID))
_success = false;
if (!AtomUtils::read32(fp, _reserved1))
_success = false;
if (!AtomUtils::read32(fp, _duration))
_success = false;
}
if (!AtomUtils::read32(fp, _reserved2[0]))
_success = false;
if (!AtomUtils::read32(fp, _reserved2[1]))
_success = false;
if (!AtomUtils::read32(fp, _reserved2[2]))
_success = false;
if (!AtomUtils::read16(fp, _reserved3))
_success = false;
if (!AtomUtils::read16(fp, _reserved4))
_success = false;
if (!AtomUtils::read32(fp, _reserved5[0]))
_success = false;
if (!AtomUtils::read32(fp, _reserved5[1]))
_success = false;
if (!AtomUtils::read32(fp, _reserved5[2]))
_success = false;
if (!AtomUtils::read32(fp, _reserved5[3]))
_success = false;
if (!AtomUtils::read32(fp, _reserved5[4]))
_success = false;
if (!AtomUtils::read32(fp, _reserved5[5]))
_success = false;
if (!AtomUtils::read32(fp, _reserved5[6]))
_success = false;
if (!AtomUtils::read32(fp, _reserved5[7]))
_success = false;
if (!AtomUtils::read32(fp, _reserved5[8]))
_success = false;
if (!AtomUtils::read32(fp, _reserved6))
_success = false;
if (!AtomUtils::read32(fp, _reserved7))
_success = false;
if (_success)
{
if (_reserved3 == 0x0100)
{
// Check flags for audio track
_mediaType = MEDIA_TYPE_AUDIO;
}
else if ((_reserved6 == 0x01400000) && (_reserved7 == 0x00f00000))
{
// Check flags for visual track
_mediaType = MEDIA_TYPE_VISUAL;
}
else
{
/*
* Store these parameters, just in case
* the track later on turn out to be a text one
* Also Width, Height, XOffset & YOffsets are stored
* as 16.16 fixed point values, with lower 16 bits
* always set to zero
*/
_width = ((_reserved6 >> 16) & 0xFFFF);
_height = ((_reserved7 >> 16) & 0xFFFF);
_layer = (int16)((_reserved2[2] >> 16) & 0xFF);
_alternateGroup =
(uint16)((_reserved2[2]) & 0xFF);
_tx = ((_reserved5[6] >> 16) & 0xFFFF);
_ty = ((_reserved5[7] >> 16) & 0xFFFF);
_mediaType = MEDIA_TYPE_UNKNOWN;
}
}
else
{
_mp4ErrorCode = READ_TRACK_HEADER_ATOM_FAILED;
}
}
else
{
if (_mp4ErrorCode != ATOM_VERSION_NOT_SUPPORTED)
_mp4ErrorCode = READ_TRACK_HEADER_ATOM_FAILED;
}
}
// Destructor
TrackHeaderAtom::~TrackHeaderAtom()
{
// Empty
}