1/* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18#define IMPLEMENT_MovieExtendsHeaderAtom 19 20#include "movieextendsheaderatom.h" 21#include "a_isucceedfail.h" 22#include "atomutils.h" 23 24 25// constructor 26PVA_FF_MovieExtendsHeaderAtom::PVA_FF_MovieExtendsHeaderAtom() 27 : PVA_FF_FullAtom(MOVIE_EXTENDS_HEADER_ATOM, (uint8)0, (uint32)0) 28{ 29 _fragmentDuration = 0; 30 _fileOffset = 0; 31 _oRendered = false; 32 recomputeSize(); 33 34} 35 36//destructor 37PVA_FF_MovieExtendsHeaderAtom::~PVA_FF_MovieExtendsHeaderAtom() 38{ 39 // do nothing 40} 41 42 43// return fragment duration 44uint32 45PVA_FF_MovieExtendsHeaderAtom::getFragmentDuration(void) 46{ 47 return _fragmentDuration; 48} 49 50 51// set fragment duration 52void 53PVA_FF_MovieExtendsHeaderAtom::setFragmentDuration(uint32 duration) 54{ 55 _fragmentDuration = duration; 56} 57 58 59// update the value of fragment duration for new sample 60void 61PVA_FF_MovieExtendsHeaderAtom::updateMovieFragmentDuration(uint32 ts) 62{ 63 if (ts > _fragmentDuration) 64 { 65 _fragmentDuration = ts; 66 } 67} 68 69// write the duration value at the file offset stored during rendering 70void 71PVA_FF_MovieExtendsHeaderAtom::writeMovieFragmentDuration(MP4_AUTHOR_FF_FILE_IO_WRAP* fp) 72{ 73 uint32 fileWriteOffset; 74 75 fileWriteOffset = PVA_FF_AtomUtils::getCurrentFilePosition(fp); 76 77 PVA_FF_AtomUtils::seekFromStart(fp, _fileOffset); 78 79 if (_oRendered == true) 80 { 81 PVA_FF_AtomUtils::render32(fp, _fragmentDuration); 82 } 83 84 PVA_FF_AtomUtils::seekFromStart(fp, fileWriteOffset); 85} 86 87 88// recompute size of atom 89void 90PVA_FF_MovieExtendsHeaderAtom::recomputeSize() 91{ 92 int32 size = getDefaultSize(); 93 94 size += 4; // For fragment duration 95 96 _size = size; 97 98 // Update the parent atom size 99 if (_pparent != NULL) 100 { 101 _pparent->recomputeSize(); 102 } 103} 104 105 106// write atom to the target file 107bool 108PVA_FF_MovieExtendsHeaderAtom::renderToFileStream(MP4_AUTHOR_FF_FILE_IO_WRAP* fp) 109{ 110 uint32 rendered = 0; 111 112 if (!renderAtomBaseMembers(fp)) 113 { 114 return false; 115 } 116 rendered += getDefaultSize(); 117 118 // store file offset to modify duration later 119 _fileOffset = PVA_FF_AtomUtils::getCurrentFilePosition(fp); 120 121 if (!PVA_FF_AtomUtils::render32(fp, _fragmentDuration)) 122 { 123 return false; 124 } 125 126 rendered += 4; 127 128 _oRendered = true; 129 130 return true; 131} 132