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