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