annotate Plugins/Input/aac/libmp4v2/mp4track.cpp @ 790:8f437afc4f4a trunk

[svn] - more sanity checking
author nenolod
date Fri, 03 Mar 2006 20:09:52 -0800
parents f2dc045d2327
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1 /*
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
2 * The contents of this file are subject to the Mozilla Public
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
3 * License Version 1.1 (the "License"); you may not use this file
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
4 * except in compliance with the License. You may obtain a copy of
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
5 * the License at http://www.mozilla.org/MPL/
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
6 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
7 * Software distributed under the License is distributed on an "AS
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
8 * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
9 * implied. See the License for the specific language governing
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
10 * rights and limitations under the License.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
11 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
12 * The Original Code is MPEG4IP.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
13 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
14 * The Initial Developer of the Original Code is Cisco Systems Inc.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
15 * Portions created by Cisco Systems Inc. are
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
16 * Copyright (C) Cisco Systems Inc. 2001 - 2004. All Rights Reserved.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
17 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
18 * 3GPP features implementation is based on 3GPP's TS26.234-v5.60,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
19 * and was contributed by Ximpo Group Ltd.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
20 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
21 * Portions created by Ximpo Group Ltd. are
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
22 * Copyright (C) Ximpo Group Ltd. 2003, 2004. All Rights Reserved.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
23 *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
24 * Contributor(s):
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
25 * Dave Mackie dmackie@cisco.com
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
26 * Alix Marchandise-Franquet alix@cisco.com
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
27 * Ximpo Group Ltd. mp4v2@ximpo.com
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
28 */
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
29
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
30 #include "mp4common.h"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
31
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
32 #define AMR_UNINITIALIZED -1
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
33 #define AMR_TRUE 0
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
34 #define AMR_FALSE 1
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
35
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
36 MP4Track::MP4Track(MP4File* pFile, MP4Atom* pTrakAtom)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
37 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
38 m_pFile = pFile;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
39 m_pTrakAtom = pTrakAtom;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
40
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
41 m_lastStsdIndex = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
42 m_lastSampleFile = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
43
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
44 m_cachedReadSampleId = MP4_INVALID_SAMPLE_ID;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
45 m_pCachedReadSample = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
46 m_cachedReadSampleSize = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
47
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
48 m_writeSampleId = 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
49 m_fixedSampleDuration = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
50 m_pChunkBuffer = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
51 m_chunkBufferSize = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
52 m_chunkSamples = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
53 m_chunkDuration = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
54
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
55 // m_bytesPerSample should be set to 1, except for the
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
56 // quicktime audio constant bit rate samples, which have non-1 values
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
57 m_bytesPerSample = 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
58 m_samplesPerChunk = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
59 m_durationPerChunk = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
60 m_isAmr = AMR_UNINITIALIZED;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
61 m_curMode = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
62
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
63 bool success = true;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
64
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
65 MP4Integer32Property* pTrackIdProperty;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
66 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
67 "trak.tkhd.trackId",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
68 (MP4Property**)&pTrackIdProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
69 if (success) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
70 m_trackId = pTrackIdProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
71 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
72
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
73 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
74 "trak.mdia.mdhd.timeScale",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
75 (MP4Property**)&m_pTimeScaleProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
76 if (success) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
77 // default chunking is 1 second of samples
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
78 m_durationPerChunk = m_pTimeScaleProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
79 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
80
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
81 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
82 "trak.tkhd.duration",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
83 (MP4Property**)&m_pTrackDurationProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
84
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
85 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
86 "trak.mdia.mdhd.duration",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
87 (MP4Property**)&m_pMediaDurationProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
88
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
89 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
90 "trak.tkhd.modificationTime",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
91 (MP4Property**)&m_pTrackModificationProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
92
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
93 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
94 "trak.mdia.mdhd.modificationTime",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
95 (MP4Property**)&m_pMediaModificationProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
96
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
97 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
98 "trak.mdia.hdlr.handlerType",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
99 (MP4Property**)&m_pTypeProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
100
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
101 // get handles on sample size information
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
102
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
103 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
104 "trak.mdia.minf.stbl.stsz.sampleSize",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
105 (MP4Property**)&m_pStszFixedSampleSizeProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
106
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
107 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
108 "trak.mdia.minf.stbl.stsz.sampleCount",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
109 (MP4Property**)&m_pStszSampleCountProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
110
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
111 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
112 "trak.mdia.minf.stbl.stsz.entries.sampleSize",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
113 (MP4Property**)&m_pStszSampleSizeProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
114
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
115 // get handles on information needed to map sample id's to file offsets
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
116
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
117 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
118 "trak.mdia.minf.stbl.stsc.entryCount",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
119 (MP4Property**)&m_pStscCountProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
120
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
121 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
122 "trak.mdia.minf.stbl.stsc.entries.firstChunk",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
123 (MP4Property**)&m_pStscFirstChunkProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
124
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
125 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
126 "trak.mdia.minf.stbl.stsc.entries.samplesPerChunk",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
127 (MP4Property**)&m_pStscSamplesPerChunkProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
128
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
129 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
130 "trak.mdia.minf.stbl.stsc.entries.sampleDescriptionIndex",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
131 (MP4Property**)&m_pStscSampleDescrIndexProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
132
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
133 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
134 "trak.mdia.minf.stbl.stsc.entries.firstSample",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
135 (MP4Property**)&m_pStscFirstSampleProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
136
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
137 bool haveStco = m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
138 "trak.mdia.minf.stbl.stco.entryCount",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
139 (MP4Property**)&m_pChunkCountProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
140
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
141 if (haveStco) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
142 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
143 "trak.mdia.minf.stbl.stco.entries.chunkOffset",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
144 (MP4Property**)&m_pChunkOffsetProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
145 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
146 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
147 "trak.mdia.minf.stbl.co64.entryCount",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
148 (MP4Property**)&m_pChunkCountProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
149
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
150 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
151 "trak.mdia.minf.stbl.co64.entries.chunkOffset",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
152 (MP4Property**)&m_pChunkOffsetProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
153 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
154
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
155 // get handles on sample timing info
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
156
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
157 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
158 "trak.mdia.minf.stbl.stts.entryCount",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
159 (MP4Property**)&m_pSttsCountProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
160
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
161 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
162 "trak.mdia.minf.stbl.stts.entries.sampleCount",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
163 (MP4Property**)&m_pSttsSampleCountProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
164
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
165 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
166 "trak.mdia.minf.stbl.stts.entries.sampleDelta",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
167 (MP4Property**)&m_pSttsSampleDeltaProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
168
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
169 // get handles on rendering offset info if it exists
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
170
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
171 m_pCttsCountProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
172 m_pCttsSampleCountProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
173 m_pCttsSampleOffsetProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
174
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
175 bool haveCtts = m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
176 "trak.mdia.minf.stbl.ctts.entryCount",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
177 (MP4Property**)&m_pCttsCountProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
178
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
179 if (haveCtts) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
180 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
181 "trak.mdia.minf.stbl.ctts.entries.sampleCount",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
182 (MP4Property**)&m_pCttsSampleCountProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
183
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
184 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
185 "trak.mdia.minf.stbl.ctts.entries.sampleOffset",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
186 (MP4Property**)&m_pCttsSampleOffsetProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
187 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
188
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
189 // get handles on sync sample info if it exists
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
190
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
191 m_pStssCountProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
192 m_pStssSampleProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
193
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
194 bool haveStss = m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
195 "trak.mdia.minf.stbl.stss.entryCount",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
196 (MP4Property**)&m_pStssCountProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
197
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
198 if (haveStss) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
199 success &= m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
200 "trak.mdia.minf.stbl.stss.entries.sampleNumber",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
201 (MP4Property**)&m_pStssSampleProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
202 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
203
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
204 // edit list
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
205 InitEditListProperties();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
206
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
207 // was everything found?
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
208 if (!success) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
209 throw new MP4Error("invalid track", "MP4Track::MP4Track");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
210 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
211 CalculateBytesPerSample();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
212 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
213
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
214 MP4Track::~MP4Track()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
215 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
216 MP4Free(m_pCachedReadSample);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
217 MP4Free(m_pChunkBuffer);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
218 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
219
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
220 const char* MP4Track::GetType()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
221 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
222 return m_pTypeProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
223 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
224
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
225 void MP4Track::SetType(const char* type)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
226 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
227 m_pTypeProperty->SetValue(MP4NormalizeTrackType(type,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
228 m_pFile->GetVerbosity()));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
229 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
230
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
231 void MP4Track::ReadSample(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
232 MP4SampleId sampleId,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
233 u_int8_t** ppBytes,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
234 u_int32_t* pNumBytes,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
235 MP4Timestamp* pStartTime,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
236 MP4Duration* pDuration,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
237 MP4Duration* pRenderingOffset,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
238 bool* pIsSyncSample)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
239 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
240 if (sampleId == MP4_INVALID_SAMPLE_ID) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
241 throw new MP4Error("sample id can't be zero",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
242 "MP4Track::ReadSample");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
243 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
244
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
245 // handle unusual case of wanting to read a sample
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
246 // that is still sitting in the write chunk buffer
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
247 if (m_pChunkBuffer && sampleId >= m_writeSampleId - m_chunkSamples) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
248 WriteChunkBuffer();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
249 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
250
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
251 FILE* pFile = GetSampleFile(sampleId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
252
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
253 if (pFile == (FILE*)-1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
254 throw new MP4Error("sample is located in an inaccessible file",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
255 "MP4Track::ReadSample");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
256 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
257
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
258 u_int64_t fileOffset = GetSampleFileOffset(sampleId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
259
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
260 u_int32_t sampleSize = GetSampleSize(sampleId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
261 if (*ppBytes != NULL && *pNumBytes < sampleSize) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
262 throw new MP4Error("sample buffer is too small",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
263 "MP4Track::ReadSample");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
264 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
265 *pNumBytes = sampleSize;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
266
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
267 VERBOSE_READ_SAMPLE(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
268 printf("ReadSample: track %u id %u offset 0x"X64" size %u (0x%x)\n",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
269 m_trackId, sampleId, fileOffset, *pNumBytes, *pNumBytes));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
270
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
271 bool bufferMalloc = false;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
272 if (*ppBytes == NULL) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
273 *ppBytes = (u_int8_t*)MP4Malloc(*pNumBytes);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
274 bufferMalloc = true;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
275 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
276
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
277 u_int64_t oldPos = m_pFile->GetPosition(pFile); // only used in mode == 'w'
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
278 try {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
279 m_pFile->SetPosition(fileOffset, pFile);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
280 m_pFile->ReadBytes(*ppBytes, *pNumBytes, pFile);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
281
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
282 if (pStartTime || pDuration) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
283 GetSampleTimes(sampleId, pStartTime, pDuration);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
284
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
285 VERBOSE_READ_SAMPLE(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
286 printf("ReadSample: start "U64" duration "D64"\n",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
287 (pStartTime ? *pStartTime : 0),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
288 (pDuration ? *pDuration : 0)));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
289 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
290 if (pRenderingOffset) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
291 *pRenderingOffset = GetSampleRenderingOffset(sampleId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
292
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
293 VERBOSE_READ_SAMPLE(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
294 printf("ReadSample: renderingOffset "D64"\n",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
295 *pRenderingOffset));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
296 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
297 if (pIsSyncSample) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
298 *pIsSyncSample = IsSyncSample(sampleId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
299
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
300 VERBOSE_READ_SAMPLE(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
301 printf("ReadSample: isSyncSample %u\n",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
302 *pIsSyncSample));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
303 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
304 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
305
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
306 catch (MP4Error* e) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
307 if (bufferMalloc) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
308 // let's not leak memory
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
309 MP4Free(*ppBytes);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
310 *ppBytes = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
311 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
312 if (m_pFile->GetMode() == 'w') {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
313 m_pFile->SetPosition(oldPos, pFile);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
314 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
315 throw e;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
316 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
317
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
318 if (m_pFile->GetMode() == 'w') {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
319 m_pFile->SetPosition(oldPos, pFile);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
320 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
321 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
322
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
323 void MP4Track::ReadSampleFragment(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
324 MP4SampleId sampleId,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
325 u_int32_t sampleOffset,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
326 u_int16_t sampleLength,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
327 u_int8_t* pDest)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
328 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
329 if (sampleId == MP4_INVALID_SAMPLE_ID) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
330 throw new MP4Error("invalid sample id",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
331 "MP4Track::ReadSampleFragment");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
332 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
333
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
334 if (sampleId != m_cachedReadSampleId) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
335 MP4Free(m_pCachedReadSample);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
336 m_pCachedReadSample = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
337 m_cachedReadSampleSize = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
338 m_cachedReadSampleId = MP4_INVALID_SAMPLE_ID;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
339
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
340 ReadSample(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
341 sampleId,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
342 &m_pCachedReadSample,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
343 &m_cachedReadSampleSize);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
344
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
345 m_cachedReadSampleId = sampleId;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
346 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
347
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
348 if (sampleOffset + sampleLength > m_cachedReadSampleSize) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
349 throw new MP4Error("offset and/or length are too large",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
350 "MP4Track::ReadSampleFragment");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
351 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
352
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
353 memcpy(pDest, &m_pCachedReadSample[sampleOffset], sampleLength);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
354 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
355
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
356 void MP4Track::WriteSample(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
357 const u_int8_t* pBytes,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
358 u_int32_t numBytes,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
359 MP4Duration duration,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
360 MP4Duration renderingOffset,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
361 bool isSyncSample)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
362 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
363 u_int8_t curMode = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
364
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
365 VERBOSE_WRITE_SAMPLE(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
366 printf("WriteSample: track %u id %u size %u (0x%x) ",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
367 m_trackId, m_writeSampleId, numBytes, numBytes));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
368
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
369 if (pBytes == NULL && numBytes > 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
370 throw new MP4Error("no sample data", "MP4WriteSample");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
371 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
372
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
373 if (m_isAmr == AMR_UNINITIALIZED ) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
374 // figure out if this is an AMR audio track
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
375 if (m_pTrakAtom->FindAtom("trak.mdia.minf.stbl.stsd.samr") ||
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
376 m_pTrakAtom->FindAtom("trak.mdia.minf.stbl.stsd.sawb")) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
377 m_isAmr = AMR_TRUE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
378 m_curMode = (pBytes[0] >> 3) & 0x000F;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
379 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
380 m_isAmr = AMR_FALSE;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
381 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
382 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
383
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
384 if (m_isAmr == AMR_TRUE) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
385 curMode = (pBytes[0] >> 3) &0x000F; // The mode is in the first byte
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
386 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
387
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
388 if (duration == MP4_INVALID_DURATION) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
389 duration = GetFixedSampleDuration();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
390 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
391
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
392 VERBOSE_WRITE_SAMPLE(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
393 printf("duration "U64"\n", duration));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
394
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
395 if ((m_isAmr == AMR_TRUE) &&
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
396 (m_curMode != curMode)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
397 WriteChunkBuffer();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
398 m_curMode = curMode;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
399 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
400
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
401 // append sample bytes to chunk buffer
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
402 m_pChunkBuffer = (u_int8_t*)MP4Realloc(m_pChunkBuffer,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
403 m_chunkBufferSize + numBytes);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
404 memcpy(&m_pChunkBuffer[m_chunkBufferSize], pBytes, numBytes);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
405 m_chunkBufferSize += numBytes;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
406 m_chunkSamples++;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
407 m_chunkDuration += duration;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
408
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
409 UpdateSampleSizes(m_writeSampleId, numBytes);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
410
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
411 UpdateSampleTimes(duration);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
412
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
413 UpdateRenderingOffsets(m_writeSampleId, renderingOffset);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
414
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
415 UpdateSyncSamples(m_writeSampleId, isSyncSample);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
416
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
417 if (IsChunkFull(m_writeSampleId)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
418 WriteChunkBuffer();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
419 m_curMode = curMode;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
420 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
421
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
422 UpdateDurations(duration);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
423
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
424 UpdateModificationTimes();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
425
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
426 m_writeSampleId++;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
427 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
428
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
429 void MP4Track::WriteChunkBuffer()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
430 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
431 if (m_chunkBufferSize == 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
432 return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
433 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
434
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
435 u_int64_t chunkOffset = m_pFile->GetPosition();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
436
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
437 // write chunk buffer
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
438 m_pFile->WriteBytes(m_pChunkBuffer, m_chunkBufferSize);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
439
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
440 VERBOSE_WRITE_SAMPLE(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
441 printf("WriteChunk: track %u offset 0x"X64" size %u (0x%x) numSamples %u\n",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
442 m_trackId, chunkOffset, m_chunkBufferSize,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
443 m_chunkBufferSize, m_chunkSamples));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
444
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
445 UpdateSampleToChunk(m_writeSampleId,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
446 m_pChunkCountProperty->GetValue() + 1,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
447 m_chunkSamples);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
448
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
449 UpdateChunkOffsets(chunkOffset);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
450
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
451 // clean up chunk buffer
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
452 MP4Free(m_pChunkBuffer);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
453 m_pChunkBuffer = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
454 m_chunkBufferSize = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
455 m_chunkSamples = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
456 m_chunkDuration = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
457 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
458
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
459 void MP4Track::FinishWrite()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
460 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
461 // write out any remaining samples in chunk buffer
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
462 WriteChunkBuffer();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
463
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
464 // record buffer size and bitrates
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
465 MP4BitfieldProperty* pBufferSizeProperty;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
466
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
467 if (m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
468 "trak.mdia.minf.stbl.stsd.*.esds.decConfigDescr.bufferSizeDB",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
469 (MP4Property**)&pBufferSizeProperty)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
470 pBufferSizeProperty->SetValue(GetMaxSampleSize());
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
471 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
472
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
473 MP4Integer32Property* pBitrateProperty;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
474
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
475 if (m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
476 "trak.mdia.minf.stbl.stsd.*.esds.decConfigDescr.maxBitrate",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
477 (MP4Property**)&pBitrateProperty)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
478 pBitrateProperty->SetValue(GetMaxBitrate());
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
479 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
480
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
481 if (m_pTrakAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
482 "trak.mdia.minf.stbl.stsd.*.esds.decConfigDescr.avgBitrate",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
483 (MP4Property**)&pBitrateProperty)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
484 pBitrateProperty->SetValue(GetAvgBitrate());
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
485 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
486 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
487
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
488 bool MP4Track::IsChunkFull(MP4SampleId sampleId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
489 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
490 if (m_samplesPerChunk) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
491 return m_chunkSamples >= m_samplesPerChunk;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
492 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
493
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
494 ASSERT(m_durationPerChunk);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
495 return m_chunkDuration >= m_durationPerChunk;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
496 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
497
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
498 u_int32_t MP4Track::GetNumberOfSamples()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
499 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
500 return m_pStszSampleCountProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
501 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
502
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
503 u_int32_t MP4Track::GetSampleSize(MP4SampleId sampleId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
504 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
505 u_int32_t fixedSampleSize =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
506 m_pStszFixedSampleSizeProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
507
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
508 if (fixedSampleSize != 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
509 return fixedSampleSize * m_bytesPerSample;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
510 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
511 return m_bytesPerSample *
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
512 m_pStszSampleSizeProperty->GetValue(sampleId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
513 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
514
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
515 u_int32_t MP4Track::GetMaxSampleSize()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
516 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
517 u_int32_t fixedSampleSize =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
518 m_pStszFixedSampleSizeProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
519
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
520 if (fixedSampleSize != 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
521 return fixedSampleSize * m_bytesPerSample;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
522 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
523
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
524 u_int32_t maxSampleSize = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
525 u_int32_t numSamples = m_pStszSampleSizeProperty->GetCount();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
526 for (MP4SampleId sid = 1; sid <= numSamples; sid++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
527 u_int32_t sampleSize =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
528 m_pStszSampleSizeProperty->GetValue(sid - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
529 if (sampleSize > maxSampleSize) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
530 maxSampleSize = sampleSize;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
531 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
532 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
533 return maxSampleSize * m_bytesPerSample;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
534 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
535
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
536 u_int64_t MP4Track::GetTotalOfSampleSizes()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
537 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
538 uint64_t retval;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
539 u_int32_t fixedSampleSize =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
540 m_pStszFixedSampleSizeProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
541
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
542 // if fixed sample size, just need to multiply by number of samples
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
543 if (fixedSampleSize != 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
544 retval = m_bytesPerSample;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
545 retval *= fixedSampleSize;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
546 retval *= GetNumberOfSamples();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
547 return retval;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
548 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
549
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
550 // else non-fixed sample size, sum them
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
551 u_int64_t totalSampleSizes = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
552 u_int32_t numSamples = m_pStszSampleSizeProperty->GetCount();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
553 for (MP4SampleId sid = 1; sid <= numSamples; sid++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
554 u_int32_t sampleSize =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
555 m_pStszSampleSizeProperty->GetValue(sid - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
556 totalSampleSizes += sampleSize;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
557 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
558 return totalSampleSizes * m_bytesPerSample;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
559 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
560
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
561 void MP4Track::UpdateSampleSizes(MP4SampleId sampleId, u_int32_t numBytes)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
562 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
563 if (m_bytesPerSample > 1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
564 if ((numBytes % m_bytesPerSample) != 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
565 // error
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
566 VERBOSE_ERROR(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
567 printf("UpdateSampleSize: numBytes %u not divisible by bytesPerSample %u sampleId %u\n",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
568 numBytes, m_bytesPerSample, sampleId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
569 );
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
570 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
571 numBytes /= m_bytesPerSample;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
572 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
573 // for first sample
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
574 if (sampleId == 1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
575 if (numBytes > 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
576 // presume sample size is fixed
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
577 m_pStszFixedSampleSizeProperty->SetValue(numBytes);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
578 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
579 // special case of first sample is zero bytes in length
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
580 // leave m_pStszFixedSampleSizeProperty at 0
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
581 // start recording variable sample sizes
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
582 m_pStszSampleSizeProperty->AddValue(0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
583 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
584
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
585 } else { // sampleId > 1
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
586 u_int32_t fixedSampleSize =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
587 m_pStszFixedSampleSizeProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
588
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
589 if (fixedSampleSize == 0 || numBytes != fixedSampleSize) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
590 // sample size is not fixed
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
591
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
592 if (fixedSampleSize) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
593 // need to clear fixed sample size
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
594 m_pStszFixedSampleSizeProperty->SetValue(0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
595
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
596 // and create sizes for all previous samples
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
597 for (MP4SampleId sid = 1; sid < sampleId; sid++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
598 m_pStszSampleSizeProperty->AddValue(fixedSampleSize);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
599 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
600 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
601
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
602 // add size value for this sample
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
603 m_pStszSampleSizeProperty->AddValue(numBytes);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
604 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
605 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
606
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
607 m_pStszSampleCountProperty->IncrementValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
608 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
609
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
610 u_int32_t MP4Track::GetAvgBitrate()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
611 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
612 if (GetDuration() == 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
613 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
614 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
615
201
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
616 double calc = (double) (GetTotalOfSampleSizes());
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
617 // this is a bit better - we use the whole duration
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
618 calc *= 8.0;
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
619 calc *= GetTimeScale();
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
620 calc /= (double) (GetDuration());
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
621 // we might want to think about rounding to the next 100 or 1000
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
622 return (uint32_t) ceil(calc);
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
623 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
624
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
625 u_int32_t MP4Track::GetMaxBitrate()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
626 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
627 u_int32_t timeScale = GetTimeScale();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
628 MP4SampleId numSamples = GetNumberOfSamples();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
629 u_int32_t maxBytesPerSec = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
630 u_int32_t bytesThisSec = 0;
201
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
631 MP4Timestamp thisSecStart = 0;
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
632 MP4Timestamp lastSampleTime = 0;
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
633 uint32_t lastSampleSize = 0;
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
634
201
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
635 MP4SampleId thisSecStartSid = 1;
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
636 for (MP4SampleId sid = 1; sid <= numSamples; sid++) {
201
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
637 uint32_t sampleSize;
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
638 MP4Timestamp sampleTime;
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
639
201
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
640 sampleSize = GetSampleSize(sid);
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
641 GetSampleTimes(sid, &sampleTime, NULL);
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
642
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
643 if (sampleTime < thisSecStart + timeScale) {
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
644 bytesThisSec += sampleSize;
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
645 lastSampleSize = sampleSize;
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
646 lastSampleTime = sampleTime;
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
647 } else {
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
648 // we've already written the last sample and sampleSize.
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
649 // this means that we've probably overflowed the last second
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
650 // calculate the time we've overflowed
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
651 MP4Duration overflow_dur =
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
652 (thisSecStart + timeScale) - lastSampleTime;
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
653 // calculate the duration of the last sample
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
654 MP4Duration lastSampleDur = sampleTime - lastSampleTime;
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
655 uint32_t overflow_bytes;
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
656 // now, calculate the number of bytes we overflowed. Round up.
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
657 overflow_bytes =
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
658 ((lastSampleSize * overflow_dur) + (lastSampleDur - 1)) / lastSampleDur;
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
659
201
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
660 if (bytesThisSec - overflow_bytes > maxBytesPerSec) {
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
661 maxBytesPerSec = bytesThisSec - overflow_bytes;
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
662 }
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
663
201
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
664 // now adjust the values for this sample. Remove the bytes
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
665 // from the first sample in this time frame
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
666 lastSampleTime = sampleTime;
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
667 lastSampleSize = sampleSize;
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
668 bytesThisSec += sampleSize;
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
669 bytesThisSec -= GetSampleSize(thisSecStartSid);
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
670 thisSecStartSid++;
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
671 GetSampleTimes(thisSecStartSid, &thisSecStart, NULL);
f2dc045d2327 [svn] libmp4v2 goes back to the future
chainsaw
parents: 199
diff changeset
672 }
61
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
673 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
674
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
675 return maxBytesPerSec * 8;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
676 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
677
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
678 u_int32_t MP4Track::GetSampleStscIndex(MP4SampleId sampleId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
679 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
680 u_int32_t stscIndex;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
681 u_int32_t numStscs = m_pStscCountProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
682
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
683 if (numStscs == 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
684 throw new MP4Error("No data chunks exist", "GetSampleStscIndex");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
685 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
686
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
687 for (stscIndex = 0; stscIndex < numStscs; stscIndex++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
688 if (sampleId < m_pStscFirstSampleProperty->GetValue(stscIndex)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
689 ASSERT(stscIndex != 0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
690 stscIndex -= 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
691 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
692 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
693 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
694 if (stscIndex == numStscs) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
695 ASSERT(stscIndex != 0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
696 stscIndex -= 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
697 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
698
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
699 return stscIndex;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
700 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
701
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
702 FILE* MP4Track::GetSampleFile(MP4SampleId sampleId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
703 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
704 u_int32_t stscIndex =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
705 GetSampleStscIndex(sampleId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
706
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
707 u_int32_t stsdIndex =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
708 m_pStscSampleDescrIndexProperty->GetValue(stscIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
709
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
710 // check if the answer will be the same as last time
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
711 if (m_lastStsdIndex && stsdIndex == m_lastStsdIndex) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
712 return m_lastSampleFile;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
713 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
714
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
715 MP4Atom* pStsdAtom =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
716 m_pTrakAtom->FindAtom("trak.mdia.minf.stbl.stsd");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
717 ASSERT(pStsdAtom);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
718
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
719 MP4Atom* pStsdEntryAtom =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
720 pStsdAtom->GetChildAtom(stsdIndex - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
721 ASSERT(pStsdEntryAtom);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
722
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
723 MP4Integer16Property* pDrefIndexProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
724 pStsdEntryAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
725 "*.dataReferenceIndex",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
726 (MP4Property**)&pDrefIndexProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
727
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
728 if (pDrefIndexProperty == NULL) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
729 throw new MP4Error("invalid stsd entry", "GetSampleFile");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
730 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
731
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
732 u_int32_t drefIndex =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
733 pDrefIndexProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
734
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
735 MP4Atom* pDrefAtom =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
736 m_pTrakAtom->FindAtom("trak.mdia.minf.dinf.dref");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
737 ASSERT(pDrefAtom);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
738
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
739 MP4Atom* pUrlAtom =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
740 pDrefAtom->GetChildAtom(drefIndex - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
741 ASSERT(pUrlAtom);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
742
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
743 FILE* pFile;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
744
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
745 if (pUrlAtom->GetFlags() & 1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
746 pFile = NULL; // self-contained
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
747 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
748 MP4StringProperty* pLocationProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
749 pUrlAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
750 "*.location",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
751 (MP4Property**)&pLocationProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
752 ASSERT(pLocationProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
753
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
754 const char* url = pLocationProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
755
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
756 VERBOSE_READ_SAMPLE(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
757 printf("dref url = %s\n", url));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
758
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
759 pFile = (FILE*)-1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
760
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
761 // attempt to open url if it's a file url
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
762 // currently this is the only thing we understand
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
763 if (!strncmp(url, "file:", 5)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
764 const char* fileName = url + 5;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
765 if (!strncmp(fileName, "//", 2)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
766 fileName = strchr(fileName + 2, '/');
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
767 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
768 if (fileName) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
769 pFile = fopen(fileName, "rb");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
770 if (!pFile) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
771 pFile = (FILE*)-1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
772 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
773 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
774 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
775 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
776
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
777 if (m_lastSampleFile) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
778 fclose(m_lastSampleFile);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
779 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
780
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
781 // cache the answer
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
782 m_lastStsdIndex = stsdIndex;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
783 m_lastSampleFile = pFile;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
784
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
785 return pFile;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
786 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
787
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
788 u_int64_t MP4Track::GetSampleFileOffset(MP4SampleId sampleId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
789 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
790 u_int32_t stscIndex =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
791 GetSampleStscIndex(sampleId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
792
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
793 // firstChunk is the chunk index of the first chunk with
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
794 // samplesPerChunk samples in the chunk. There may be multiples -
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
795 // ie: several chunks with the same number of samples per chunk.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
796 u_int32_t firstChunk =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
797 m_pStscFirstChunkProperty->GetValue(stscIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
798
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
799 MP4SampleId firstSample =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
800 m_pStscFirstSampleProperty->GetValue(stscIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
801
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
802 u_int32_t samplesPerChunk =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
803 m_pStscSamplesPerChunkProperty->GetValue(stscIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
804
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
805 // chunkId tells which is the absolute chunk number that this sample
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
806 // is stored in.
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
807 MP4ChunkId chunkId = firstChunk +
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
808 ((sampleId - firstSample) / samplesPerChunk);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
809
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
810 // chunkOffset is the file offset (absolute) for the start of the chunk
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
811 u_int64_t chunkOffset = m_pChunkOffsetProperty->GetValue(chunkId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
812
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
813 MP4SampleId firstSampleInChunk =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
814 sampleId - ((sampleId - firstSample) % samplesPerChunk);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
815
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
816 // need cumulative samples sizes from firstSample to sampleId - 1
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
817 u_int32_t sampleOffset = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
818 for (MP4SampleId i = firstSampleInChunk; i < sampleId; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
819 sampleOffset += GetSampleSize(i);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
820 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
821
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
822 return chunkOffset + sampleOffset;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
823 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
824
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
825 void MP4Track::UpdateSampleToChunk(MP4SampleId sampleId,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
826 MP4ChunkId chunkId, u_int32_t samplesPerChunk)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
827 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
828 u_int32_t numStsc = m_pStscCountProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
829
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
830 // if samplesPerChunk == samplesPerChunk of last entry
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
831 if (numStsc && samplesPerChunk ==
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
832 m_pStscSamplesPerChunkProperty->GetValue(numStsc-1)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
833
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
834 // nothing to do
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
835
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
836 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
837 // add stsc entry
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
838 m_pStscFirstChunkProperty->AddValue(chunkId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
839 m_pStscSamplesPerChunkProperty->AddValue(samplesPerChunk);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
840 m_pStscSampleDescrIndexProperty->AddValue(1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
841 m_pStscFirstSampleProperty->AddValue(sampleId - samplesPerChunk + 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
842
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
843 m_pStscCountProperty->IncrementValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
844 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
845 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
846
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
847 void MP4Track::UpdateChunkOffsets(u_int64_t chunkOffset)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
848 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
849 if (m_pChunkOffsetProperty->GetType() == Integer32Property) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
850 ((MP4Integer32Property*)m_pChunkOffsetProperty)->AddValue(chunkOffset);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
851 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
852 ((MP4Integer64Property*)m_pChunkOffsetProperty)->AddValue(chunkOffset);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
853 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
854 m_pChunkCountProperty->IncrementValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
855 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
856
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
857 MP4Duration MP4Track::GetFixedSampleDuration()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
858 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
859 u_int32_t numStts = m_pSttsCountProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
860
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
861 if (numStts == 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
862 return m_fixedSampleDuration;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
863 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
864 if (numStts != 1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
865 return MP4_INVALID_DURATION; // sample duration is not fixed
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
866 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
867 return m_pSttsSampleDeltaProperty->GetValue(0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
868 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
869
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
870 bool MP4Track::SetFixedSampleDuration(MP4Duration duration)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
871 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
872 u_int32_t numStts = m_pSttsCountProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
873
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
874 // setting this is only allowed before samples have been written
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
875 if (numStts != 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
876 return false;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
877 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
878 m_fixedSampleDuration = duration;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
879 return true;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
880 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
881
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
882 void MP4Track::GetSampleTimes(MP4SampleId sampleId,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
883 MP4Timestamp* pStartTime, MP4Duration* pDuration)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
884 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
885 u_int32_t numStts = m_pSttsCountProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
886 MP4SampleId sid = 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
887 MP4Duration elapsed = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
888
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
889 for (u_int32_t sttsIndex = 0; sttsIndex < numStts; sttsIndex++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
890 u_int32_t sampleCount =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
891 m_pSttsSampleCountProperty->GetValue(sttsIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
892 u_int32_t sampleDelta =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
893 m_pSttsSampleDeltaProperty->GetValue(sttsIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
894
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
895 if (sampleId <= sid + sampleCount - 1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
896 if (pStartTime) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
897 *pStartTime = (sampleId - sid);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
898 *pStartTime *= sampleDelta;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
899 *pStartTime += elapsed;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
900 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
901 if (pDuration) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
902 *pDuration = sampleDelta;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
903 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
904 return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
905 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
906 sid += sampleCount;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
907 elapsed += sampleCount * sampleDelta;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
908 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
909
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
910 throw new MP4Error("sample id out of range",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
911 "MP4Track::GetSampleTimes");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
912 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
913
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
914 MP4SampleId MP4Track::GetSampleIdFromTime(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
915 MP4Timestamp when,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
916 bool wantSyncSample)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
917 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
918 u_int32_t numStts = m_pSttsCountProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
919 MP4SampleId sid = 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
920 MP4Duration elapsed = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
921
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
922 for (u_int32_t sttsIndex = 0; sttsIndex < numStts; sttsIndex++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
923 u_int32_t sampleCount =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
924 m_pSttsSampleCountProperty->GetValue(sttsIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
925 u_int32_t sampleDelta =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
926 m_pSttsSampleDeltaProperty->GetValue(sttsIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
927
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
928 if (sampleDelta == 0 && sttsIndex < numStts - 1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
929 VERBOSE_READ(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
930 printf("Warning: Zero sample duration, stts entry %u\n",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
931 sttsIndex));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
932 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
933
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
934 MP4Duration d = when - elapsed;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
935
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
936 if (d <= sampleCount * sampleDelta) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
937 MP4SampleId sampleId = sid;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
938 if (sampleDelta) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
939 sampleId += (d / sampleDelta);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
940 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
941
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
942 if (wantSyncSample) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
943 return GetNextSyncSample(sampleId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
944 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
945 return sampleId;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
946 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
947
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
948 sid += sampleCount;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
949 elapsed += sampleCount * sampleDelta;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
950 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
951
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
952 throw new MP4Error("time out of range",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
953 "MP4Track::GetSampleIdFromTime");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
954
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
955 return 0; // satisfy MS compiler
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
956 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
957
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
958 void MP4Track::UpdateSampleTimes(MP4Duration duration)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
959 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
960 u_int32_t numStts = m_pSttsCountProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
961
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
962 // if duration == duration of last entry
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
963 if (numStts
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
964 && duration == m_pSttsSampleDeltaProperty->GetValue(numStts-1)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
965 // increment last entry sampleCount
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
966 m_pSttsSampleCountProperty->IncrementValue(1, numStts-1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
967
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
968 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
969 // add stts entry, sampleCount = 1, sampleDuration = duration
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
970 m_pSttsSampleCountProperty->AddValue(1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
971 m_pSttsSampleDeltaProperty->AddValue(duration);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
972 m_pSttsCountProperty->IncrementValue();;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
973 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
974 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
975
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
976 u_int32_t MP4Track::GetSampleCttsIndex(MP4SampleId sampleId,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
977 MP4SampleId* pFirstSampleId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
978 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
979 u_int32_t numCtts = m_pCttsCountProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
980
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
981 MP4SampleId sid = 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
982
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
983 for (u_int32_t cttsIndex = 0; cttsIndex < numCtts; cttsIndex++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
984 u_int32_t sampleCount =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
985 m_pCttsSampleCountProperty->GetValue(cttsIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
986
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
987 if (sampleId <= sid + sampleCount - 1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
988 if (pFirstSampleId) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
989 *pFirstSampleId = sid;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
990 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
991 return cttsIndex;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
992 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
993 sid += sampleCount;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
994 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
995
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
996 throw new MP4Error("sample id out of range",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
997 "MP4Track::GetSampleCttsIndex");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
998 return 0; // satisfy MS compiler
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
999 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1000
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1001 MP4Duration MP4Track::GetSampleRenderingOffset(MP4SampleId sampleId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1002 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1003 if (m_pCttsCountProperty == NULL) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1004 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1005 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1006 if (m_pCttsCountProperty->GetValue() == 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1007 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1008 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1009
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1010 u_int32_t cttsIndex = GetSampleCttsIndex(sampleId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1011
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1012 return m_pCttsSampleOffsetProperty->GetValue(cttsIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1013 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1014
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1015 void MP4Track::UpdateRenderingOffsets(MP4SampleId sampleId,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1016 MP4Duration renderingOffset)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1017 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1018 // if ctts atom doesn't exist
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1019 if (m_pCttsCountProperty == NULL) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1020
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1021 // no rendering offset, so nothing to do
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1022 if (renderingOffset == 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1023 return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1024 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1025
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1026 // else create a ctts atom
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1027 MP4Atom* pCttsAtom = AddAtom("trak.mdia.minf.stbl", "ctts");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1028
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1029 // and get handles on the properties
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1030 pCttsAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1031 "ctts.entryCount",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1032 (MP4Property**)&m_pCttsCountProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1033
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1034 pCttsAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1035 "ctts.entries.sampleCount",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1036 (MP4Property**)&m_pCttsSampleCountProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1037
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1038 pCttsAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1039 "ctts.entries.sampleOffset",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1040 (MP4Property**)&m_pCttsSampleOffsetProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1041
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1042 // if this is not the first sample
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1043 if (sampleId > 1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1044 // add a ctts entry for all previous samples
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1045 // with rendering offset equal to zero
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1046 m_pCttsSampleCountProperty->AddValue(sampleId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1047 m_pCttsSampleOffsetProperty->AddValue(0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1048 m_pCttsCountProperty->IncrementValue();;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1049 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1050 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1051
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1052 // ctts atom exists (now)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1053
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1054 u_int32_t numCtts = m_pCttsCountProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1055
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1056 // if renderingOffset == renderingOffset of last entry
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1057 if (numCtts && renderingOffset
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1058 == m_pCttsSampleOffsetProperty->GetValue(numCtts-1)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1059
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1060 // increment last entry sampleCount
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1061 m_pCttsSampleCountProperty->IncrementValue(1, numCtts-1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1062
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1063 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1064 // add ctts entry, sampleCount = 1, sampleOffset = renderingOffset
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1065 m_pCttsSampleCountProperty->AddValue(1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1066 m_pCttsSampleOffsetProperty->AddValue(renderingOffset);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1067 m_pCttsCountProperty->IncrementValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1068 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1069 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1070
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1071 void MP4Track::SetSampleRenderingOffset(MP4SampleId sampleId,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1072 MP4Duration renderingOffset)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1073 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1074 // check if any ctts entries exist
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1075 if (m_pCttsCountProperty == NULL
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1076 || m_pCttsCountProperty->GetValue() == 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1077 // if not then Update routine can be used
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1078 // to create a ctts entry for samples before this one
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1079 // and a ctts entry for this sample
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1080 UpdateRenderingOffsets(sampleId, renderingOffset);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1081
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1082 // but we also need a ctts entry
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1083 // for all samples after this one
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1084 u_int32_t afterSamples = GetNumberOfSamples() - sampleId;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1085
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1086 if (afterSamples) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1087 m_pCttsSampleCountProperty->AddValue(afterSamples);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1088 m_pCttsSampleOffsetProperty->AddValue(0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1089 m_pCttsCountProperty->IncrementValue();;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1090 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1091
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1092 return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1093 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1094
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1095 MP4SampleId firstSampleId;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1096 u_int32_t cttsIndex = GetSampleCttsIndex(sampleId, &firstSampleId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1097
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1098 // do nothing in the degenerate case
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1099 if (renderingOffset ==
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1100 m_pCttsSampleOffsetProperty->GetValue(cttsIndex)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1101 return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1102 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1103
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1104 u_int32_t sampleCount =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1105 m_pCttsSampleCountProperty->GetValue(cttsIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1106
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1107 // if this sample has it's own ctts entry
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1108 if (sampleCount == 1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1109 // then just set the value,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1110 // note we don't attempt to collapse entries
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1111 m_pCttsSampleOffsetProperty->SetValue(renderingOffset, cttsIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1112 return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1113 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1114
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1115 MP4SampleId lastSampleId = firstSampleId + sampleCount - 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1116
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1117 // else we share this entry with other samples
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1118 // we need to insert our own entry
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1119 if (sampleId == firstSampleId) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1120 // our sample is the first one
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1121 m_pCttsSampleCountProperty->
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1122 InsertValue(1, cttsIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1123 m_pCttsSampleOffsetProperty->
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1124 InsertValue(renderingOffset, cttsIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1125
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1126 m_pCttsSampleCountProperty->
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1127 SetValue(sampleCount - 1, cttsIndex + 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1128
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1129 m_pCttsCountProperty->IncrementValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1130
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1131 } else if (sampleId == lastSampleId) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1132 // our sample is the last one
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1133 m_pCttsSampleCountProperty->
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1134 InsertValue(1, cttsIndex + 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1135 m_pCttsSampleOffsetProperty->
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1136 InsertValue(renderingOffset, cttsIndex + 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1137
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1138 m_pCttsSampleCountProperty->
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1139 SetValue(sampleCount - 1, cttsIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1140
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1141 m_pCttsCountProperty->IncrementValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1142
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1143 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1144 // our sample is in the middle, UGH!
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1145
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1146 // insert our new entry
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1147 m_pCttsSampleCountProperty->
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1148 InsertValue(1, cttsIndex + 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1149 m_pCttsSampleOffsetProperty->
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1150 InsertValue(renderingOffset, cttsIndex + 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1151
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1152 // adjust count of previous entry
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1153 m_pCttsSampleCountProperty->
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1154 SetValue(sampleId - firstSampleId, cttsIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1155
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1156 // insert new entry for those samples beyond our sample
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1157 m_pCttsSampleCountProperty->
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1158 InsertValue(lastSampleId - sampleId, cttsIndex + 2);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1159 u_int32_t oldRenderingOffset =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1160 m_pCttsSampleOffsetProperty->GetValue(cttsIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1161 m_pCttsSampleOffsetProperty->
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1162 InsertValue(oldRenderingOffset, cttsIndex + 2);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1163
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1164 m_pCttsCountProperty->IncrementValue(2);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1165 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1166 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1167
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1168 bool MP4Track::IsSyncSample(MP4SampleId sampleId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1169 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1170 if (m_pStssCountProperty == NULL) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1171 return true;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1172 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1173
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1174 u_int32_t numStss = m_pStssCountProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1175
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1176 for (u_int32_t stssIndex = 0; stssIndex < numStss; stssIndex++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1177 MP4SampleId syncSampleId =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1178 m_pStssSampleProperty->GetValue(stssIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1179
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1180 if (sampleId == syncSampleId) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1181 return true;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1182 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1183 if (sampleId < syncSampleId) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1184 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1185 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1186 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1187
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1188 return false;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1189 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1190
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1191 // N.B. "next" is inclusive of this sample id
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1192 MP4SampleId MP4Track::GetNextSyncSample(MP4SampleId sampleId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1193 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1194 if (m_pStssCountProperty == NULL) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1195 return sampleId;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1196 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1197
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1198 u_int32_t numStss = m_pStssCountProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1199
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1200 for (u_int32_t stssIndex = 0; stssIndex < numStss; stssIndex++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1201 MP4SampleId syncSampleId =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1202 m_pStssSampleProperty->GetValue(stssIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1203
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1204 if (sampleId > syncSampleId) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1205 continue;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1206 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1207 return syncSampleId;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1208 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1209
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1210 // LATER check stsh for alternate sample
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1211
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1212 return MP4_INVALID_SAMPLE_ID;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1213 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1214
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1215 void MP4Track::UpdateSyncSamples(MP4SampleId sampleId, bool isSyncSample)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1216 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1217 if (isSyncSample) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1218 // if stss atom exists, add entry
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1219 if (m_pStssCountProperty) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1220 m_pStssSampleProperty->AddValue(sampleId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1221 m_pStssCountProperty->IncrementValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1222 } // else nothing to do (yet)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1223
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1224 } else { // !isSyncSample
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1225 // if stss atom doesn't exist, create one
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1226 if (m_pStssCountProperty == NULL) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1227
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1228 MP4Atom* pStssAtom = AddAtom("trak.mdia.minf.stbl", "stss");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1229
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1230 pStssAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1231 "stss.entryCount",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1232 (MP4Property**)&m_pStssCountProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1233
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1234 pStssAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1235 "stss.entries.sampleNumber",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1236 (MP4Property**)&m_pStssSampleProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1237
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1238 // set values for all samples that came before this one
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1239 for (MP4SampleId sid = 1; sid < sampleId; sid++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1240 m_pStssSampleProperty->AddValue(sid);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1241 m_pStssCountProperty->IncrementValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1242 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1243 } // else nothing to do
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1244 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1245 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1246
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1247 MP4Atom* MP4Track::AddAtom(char* parentName, char* childName)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1248 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1249 MP4Atom* pChildAtom = MP4Atom::CreateAtom(childName);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1250
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1251 MP4Atom* pParentAtom = m_pTrakAtom->FindAtom(parentName);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1252 ASSERT(pParentAtom);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1253
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1254 pParentAtom->AddChildAtom(pChildAtom);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1255
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1256 pChildAtom->Generate();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1257
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1258 return pChildAtom;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1259 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1260
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1261 u_int64_t MP4Track::GetDuration()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1262 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1263 return m_pMediaDurationProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1264 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1265
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1266 u_int32_t MP4Track::GetTimeScale()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1267 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1268 return m_pTimeScaleProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1269 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1270
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1271 void MP4Track::UpdateDurations(MP4Duration duration)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1272 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1273 // update media, track, and movie durations
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1274 m_pMediaDurationProperty->SetValue(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1275 m_pMediaDurationProperty->GetValue() + duration);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1276
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1277 MP4Duration movieDuration = ToMovieDuration(duration);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1278 m_pTrackDurationProperty->SetValue(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1279 m_pTrackDurationProperty->GetValue() + movieDuration);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1280
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1281 m_pFile->UpdateDuration(m_pTrackDurationProperty->GetValue());
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1282 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1283
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1284 MP4Duration MP4Track::ToMovieDuration(MP4Duration trackDuration)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1285 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1286 return (trackDuration * m_pFile->GetTimeScale())
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1287 / m_pTimeScaleProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1288 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1289
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1290 void MP4Track::UpdateModificationTimes()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1291 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1292 // update media and track modification times
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1293 MP4Timestamp now = MP4GetAbsTimestamp();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1294 m_pMediaModificationProperty->SetValue(now);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1295 m_pTrackModificationProperty->SetValue(now);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1296 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1297
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1298 u_int32_t MP4Track::GetNumberOfChunks()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1299 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1300 return m_pChunkOffsetProperty->GetCount();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1301 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1302
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1303 u_int32_t MP4Track::GetChunkStscIndex(MP4ChunkId chunkId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1304 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1305 u_int32_t stscIndex;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1306 u_int32_t numStscs = m_pStscCountProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1307
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1308 ASSERT(chunkId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1309 ASSERT(numStscs > 0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1310
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1311 for (stscIndex = 0; stscIndex < numStscs; stscIndex++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1312 if (chunkId < m_pStscFirstChunkProperty->GetValue(stscIndex)) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1313 ASSERT(stscIndex != 0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1314 break;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1315 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1316 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1317 return stscIndex - 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1318 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1319
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1320 MP4Timestamp MP4Track::GetChunkTime(MP4ChunkId chunkId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1321 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1322 u_int32_t stscIndex = GetChunkStscIndex(chunkId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1323
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1324 MP4ChunkId firstChunkId =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1325 m_pStscFirstChunkProperty->GetValue(stscIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1326
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1327 MP4SampleId firstSample =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1328 m_pStscFirstSampleProperty->GetValue(stscIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1329
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1330 u_int32_t samplesPerChunk =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1331 m_pStscSamplesPerChunkProperty->GetValue(stscIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1332
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1333 MP4SampleId firstSampleInChunk =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1334 firstSample + ((chunkId - firstChunkId) * samplesPerChunk);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1335
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1336 MP4Timestamp chunkTime;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1337
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1338 GetSampleTimes(firstSampleInChunk, &chunkTime, NULL);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1339
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1340 return chunkTime;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1341 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1342
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1343 u_int32_t MP4Track::GetChunkSize(MP4ChunkId chunkId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1344 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1345 u_int32_t stscIndex = GetChunkStscIndex(chunkId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1346
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1347 MP4ChunkId firstChunkId =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1348 m_pStscFirstChunkProperty->GetValue(stscIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1349
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1350 MP4SampleId firstSample =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1351 m_pStscFirstSampleProperty->GetValue(stscIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1352
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1353 u_int32_t samplesPerChunk =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1354 m_pStscSamplesPerChunkProperty->GetValue(stscIndex);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1355
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1356 MP4SampleId firstSampleInChunk =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1357 firstSample + ((chunkId - firstChunkId) * samplesPerChunk);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1358
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1359 // need cumulative sizes of samples in chunk
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1360 u_int32_t chunkSize = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1361 for (u_int32_t i = 0; i < samplesPerChunk; i++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1362 chunkSize += GetSampleSize(firstSampleInChunk + i);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1363 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1364
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1365 return chunkSize;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1366 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1367
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1368 void MP4Track::ReadChunk(MP4ChunkId chunkId,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1369 u_int8_t** ppChunk, u_int32_t* pChunkSize)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1370 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1371 ASSERT(chunkId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1372 ASSERT(ppChunk);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1373 ASSERT(pChunkSize);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1374
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1375 u_int64_t chunkOffset =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1376 m_pChunkOffsetProperty->GetValue(chunkId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1377
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1378 *pChunkSize = GetChunkSize(chunkId);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1379 *ppChunk = (u_int8_t*)MP4Malloc(*pChunkSize);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1380
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1381 VERBOSE_READ_SAMPLE(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1382 printf("ReadChunk: track %u id %u offset 0x"X64" size %u (0x%x)\n",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1383 m_trackId, chunkId, chunkOffset, *pChunkSize, *pChunkSize));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1384
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1385 u_int64_t oldPos = m_pFile->GetPosition(); // only used in mode == 'w'
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1386 try {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1387 m_pFile->SetPosition(chunkOffset);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1388 m_pFile->ReadBytes(*ppChunk, *pChunkSize);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1389 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1390 catch (MP4Error* e) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1391 // let's not leak memory
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1392 MP4Free(*ppChunk);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1393 *ppChunk = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1394
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1395 if (m_pFile->GetMode() == 'w') {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1396 m_pFile->SetPosition(oldPos);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1397 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1398 throw e;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1399 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1400
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1401 if (m_pFile->GetMode() == 'w') {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1402 m_pFile->SetPosition(oldPos);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1403 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1404 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1405
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1406 void MP4Track::RewriteChunk(MP4ChunkId chunkId,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1407 u_int8_t* pChunk, u_int32_t chunkSize)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1408 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1409 u_int64_t chunkOffset = m_pFile->GetPosition();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1410
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1411 m_pFile->WriteBytes(pChunk, chunkSize);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1412
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1413 m_pChunkOffsetProperty->SetValue(chunkOffset, chunkId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1414
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1415 VERBOSE_WRITE_SAMPLE(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1416 printf("RewriteChunk: track %u id %u offset 0x"X64" size %u (0x%x)\n",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1417 m_trackId, chunkId, chunkOffset, chunkSize, chunkSize));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1418 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1419
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1420 // map track type name aliases to official names
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1421
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1422
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1423 bool MP4Track::InitEditListProperties()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1424 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1425 m_pElstCountProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1426 m_pElstMediaTimeProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1427 m_pElstDurationProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1428 m_pElstRateProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1429 m_pElstReservedProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1430
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1431 MP4Atom* pElstAtom =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1432 m_pTrakAtom->FindAtom("trak.edts.elst");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1433
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1434 if (!pElstAtom) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1435 return false;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1436 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1437
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1438 pElstAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1439 "elst.entryCount",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1440 (MP4Property**)&m_pElstCountProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1441
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1442 pElstAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1443 "elst.entries.mediaTime",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1444 (MP4Property**)&m_pElstMediaTimeProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1445
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1446 pElstAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1447 "elst.entries.segmentDuration",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1448 (MP4Property**)&m_pElstDurationProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1449
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1450 pElstAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1451 "elst.entries.mediaRate",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1452 (MP4Property**)&m_pElstRateProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1453
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1454 pElstAtom->FindProperty(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1455 "elst.entries.reserved",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1456 (MP4Property**)&m_pElstReservedProperty);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1457
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1458 return m_pElstCountProperty
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1459 && m_pElstMediaTimeProperty
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1460 && m_pElstDurationProperty
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1461 && m_pElstRateProperty
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1462 && m_pElstReservedProperty;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1463 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1464
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1465 MP4EditId MP4Track::AddEdit(MP4EditId editId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1466 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1467 if (!m_pElstCountProperty) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1468 m_pFile->AddDescendantAtoms(m_pTrakAtom, "edts.elst");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1469 InitEditListProperties();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1470 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1471
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1472 if (editId == MP4_INVALID_EDIT_ID) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1473 editId = m_pElstCountProperty->GetValue() + 1;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1474 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1475
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1476 m_pElstMediaTimeProperty->InsertValue(0, editId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1477 m_pElstDurationProperty->InsertValue(0, editId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1478 m_pElstRateProperty->InsertValue(1, editId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1479 m_pElstReservedProperty->InsertValue(0, editId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1480
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1481 m_pElstCountProperty->IncrementValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1482
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1483 return editId;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1484 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1485
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1486 void MP4Track::DeleteEdit(MP4EditId editId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1487 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1488 if (editId == MP4_INVALID_EDIT_ID) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1489 throw new MP4Error("edit id can't be zero",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1490 "MP4Track::DeleteEdit");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1491 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1492
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1493 if (!m_pElstCountProperty
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1494 || m_pElstCountProperty->GetValue() == 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1495 throw new MP4Error("no edits exist",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1496 "MP4Track::DeleteEdit");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1497 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1498
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1499 m_pElstMediaTimeProperty->DeleteValue(editId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1500 m_pElstDurationProperty->DeleteValue(editId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1501 m_pElstRateProperty->DeleteValue(editId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1502 m_pElstReservedProperty->DeleteValue(editId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1503
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1504 m_pElstCountProperty->IncrementValue(-1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1505
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1506 // clean up if last edit is deleted
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1507 if (m_pElstCountProperty->GetValue() == 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1508 m_pElstCountProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1509 m_pElstMediaTimeProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1510 m_pElstDurationProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1511 m_pElstRateProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1512 m_pElstReservedProperty = NULL;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1513
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1514 m_pTrakAtom->DeleteChildAtom(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1515 m_pTrakAtom->FindAtom("trak.edts"));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1516 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1517 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1518
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1519 MP4Timestamp MP4Track::GetEditStart(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1520 MP4EditId editId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1521 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1522 if (editId == MP4_INVALID_EDIT_ID) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1523 return MP4_INVALID_TIMESTAMP;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1524 } else if (editId == 1) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1525 return 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1526 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1527 return (MP4Timestamp)GetEditTotalDuration(editId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1528 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1529
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1530 MP4Duration MP4Track::GetEditTotalDuration(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1531 MP4EditId editId)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1532 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1533 u_int32_t numEdits = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1534
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1535 if (m_pElstCountProperty) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1536 numEdits = m_pElstCountProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1537 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1538
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1539 if (editId == MP4_INVALID_EDIT_ID) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1540 editId = numEdits;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1541 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1542
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1543 if (numEdits == 0 || editId > numEdits) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1544 return MP4_INVALID_DURATION;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1545 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1546
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1547 MP4Duration totalDuration = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1548
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1549 for (MP4EditId eid = 1; eid <= editId; eid++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1550 totalDuration +=
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1551 m_pElstDurationProperty->GetValue(eid - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1552 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1553
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1554 return totalDuration;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1555 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1556
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1557 MP4SampleId MP4Track::GetSampleIdFromEditTime(
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1558 MP4Timestamp editWhen,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1559 MP4Timestamp* pStartTime,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1560 MP4Duration* pDuration)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1561 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1562 MP4SampleId sampleId = MP4_INVALID_SAMPLE_ID;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1563 u_int32_t numEdits = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1564
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1565 if (m_pElstCountProperty) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1566 numEdits = m_pElstCountProperty->GetValue();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1567 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1568
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1569 if (numEdits) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1570 MP4Duration editElapsedDuration = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1571
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1572 for (MP4EditId editId = 1; editId <= numEdits; editId++) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1573 // remember edit segment's start time (in edit timeline)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1574 MP4Timestamp editStartTime =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1575 (MP4Timestamp)editElapsedDuration;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1576
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1577 // accumulate edit segment's duration
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1578 editElapsedDuration +=
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1579 m_pElstDurationProperty->GetValue(editId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1580
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1581 // calculate difference between the specified edit time
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1582 // and the end of this edit segment
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1583 if (editElapsedDuration - editWhen <= 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1584 // the specified time has not yet been reached
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1585 continue;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1586 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1587
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1588 // 'editWhen' is within this edit segment
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1589
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1590 // calculate the specified edit time
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1591 // relative to just this edit segment
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1592 MP4Duration editOffset =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1593 editWhen - editStartTime;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1594
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1595 // calculate the media (track) time that corresponds
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1596 // to the specified edit time based on the edit list
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1597 MP4Timestamp mediaWhen =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1598 m_pElstMediaTimeProperty->GetValue(editId - 1)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1599 + editOffset;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1600
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1601 // lookup the sample id for the media time
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1602 sampleId = GetSampleIdFromTime(mediaWhen, false);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1603
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1604 // lookup the sample's media start time and duration
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1605 MP4Timestamp sampleStartTime;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1606 MP4Duration sampleDuration;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1607
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1608 GetSampleTimes(sampleId, &sampleStartTime, &sampleDuration);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1609
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1610 // calculate the difference if any between when the sample
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1611 // would naturally start and when it starts in the edit timeline
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1612 MP4Duration sampleStartOffset =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1613 mediaWhen - sampleStartTime;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1614
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1615 // calculate the start time for the sample in the edit time line
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1616 MP4Timestamp editSampleStartTime =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1617 editWhen - MIN(editOffset, sampleStartOffset);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1618
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1619 MP4Duration editSampleDuration = 0;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1620
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1621 // calculate how long this sample lasts in the edit list timeline
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1622 if (m_pElstRateProperty->GetValue(editId - 1) == 0) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1623 // edit segment is a "dwell"
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1624 // so sample duration is that of the edit segment
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1625 editSampleDuration =
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1626 m_pElstDurationProperty->GetValue(editId - 1);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1627
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1628 } else {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1629 // begin with the natural sample duration
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1630 editSampleDuration = sampleDuration;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1631
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1632 // now shorten that if the edit segment starts
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1633 // after the sample would naturally start
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1634 if (editOffset < sampleStartOffset) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1635 editSampleDuration -= sampleStartOffset - editOffset;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1636 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1637
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1638 // now shorten that if the edit segment ends
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1639 // before the sample would naturally end
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1640 if (editElapsedDuration
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1641 < editSampleStartTime + sampleDuration) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1642 editSampleDuration -= (editSampleStartTime + sampleDuration)
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1643 - editElapsedDuration;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1644 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1645 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1646
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1647 if (pStartTime) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1648 *pStartTime = editSampleStartTime;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1649 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1650
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1651 if (pDuration) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1652 *pDuration = editSampleDuration;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1653 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1654
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1655 VERBOSE_EDIT(m_pFile->GetVerbosity(),
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1656 printf("GetSampleIdFromEditTime: when "U64" "
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1657 "sampleId %u start "U64" duration "D64"\n",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1658 editWhen, sampleId,
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1659 editSampleStartTime, editSampleDuration));
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1660
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1661 return sampleId;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1662 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1663
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1664 throw new MP4Error("time out of range",
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1665 "MP4Track::GetSampleIdFromEditTime");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1666
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1667 } else { // no edit list
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1668 sampleId = GetSampleIdFromTime(editWhen, false);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1669
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1670 if (pStartTime || pDuration) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1671 GetSampleTimes(sampleId, pStartTime, pDuration);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1672 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1673 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1674
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1675 return sampleId;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1676 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1677
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1678 void MP4Track::CalculateBytesPerSample ()
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1679 {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1680 MP4Atom *pMedia = m_pTrakAtom->FindAtom("trak.mdia.minf.stbl.stsd");
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1681 MP4Atom *pMediaData;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1682 const char *media_data_name;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1683 if (pMedia == NULL) return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1684
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1685 if (pMedia->GetNumberOfChildAtoms() != 1) return;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1686
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1687 pMediaData = pMedia->GetChildAtom(0);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1688 media_data_name = pMediaData->GetType();
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1689 if ((ATOMID(media_data_name) == ATOMID("twos")) ||
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1690 (ATOMID(media_data_name) == ATOMID("sowt"))) {
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1691 MP4IntegerProperty *chan, *sampleSize;
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1692 chan = (MP4IntegerProperty *)pMediaData->GetProperty(4);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1693 sampleSize = (MP4IntegerProperty *)pMediaData->GetProperty(5);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1694 m_bytesPerSample = chan->GetValue() * (sampleSize->GetValue() / 8);
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1695 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1696 }
fa848bd484d8 [svn] Move plugins to Plugins/
nenolod
parents:
diff changeset
1697