Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(723)

Side by Side Diff: media/mp4/track_run_iterator_unittest.cc

Issue 10651006: Add Common Encryption support to BMFF, including subsample decryption. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Satisfy mac_rel buildbot Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/mp4/track_run_iterator.cc ('k') | media/webm/webm_cluster_parser.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/logging.h" 6 #include "base/logging.h"
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "media/mp4/box_definitions.h" 8 #include "media/mp4/box_definitions.h"
9 #include "media/mp4/rcheck.h" 9 #include "media/mp4/rcheck.h"
10 #include "media/mp4/track_run_iterator.h" 10 #include "media/mp4/track_run_iterator.h"
11 #include "testing/gtest/include/gtest/gtest.h" 11 #include "testing/gtest/include/gtest/gtest.h"
12 12
13 // The sum of the elements in a vector initialized with SumAscending, 13 // The sum of the elements in a vector initialized with SumAscending,
14 // less the value of the last element. 14 // less the value of the last element.
15 static const int kSumAscending1 = 45; 15 static const int kSumAscending1 = 45;
16 16
17 static const int kAudioScale = 48000; 17 static const int kAudioScale = 48000;
18 static const int kVideoScale = 25; 18 static const int kVideoScale = 25;
19 19
20 static const uint32 kSampleIsDifferenceSampleFlagMask = 0x10000; 20 static const uint32 kSampleIsDifferenceSampleFlagMask = 0x10000;
21 21
22 static const uint8 kAuxInfo[] = {
23 0x41, 0x54, 0x65, 0x73, 0x74, 0x49, 0x76, 0x31,
24 0x41, 0x54, 0x65, 0x73, 0x74, 0x49, 0x76, 0x32,
25 0x00, 0x02,
26 0x00, 0x01, 0x00, 0x00, 0x00, 0x02,
27 0x00, 0x03, 0x00, 0x00, 0x00, 0x04
28 };
29
30 static const char kIv1[] = {
31 0x41, 0x54, 0x65, 0x73, 0x74, 0x49, 0x76, 0x31,
32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
33 };
34
35 static const uint8 kKeyId[] = {
36 0x41, 0x47, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x54,
37 0x65, 0x73, 0x74, 0x4b, 0x65, 0x79, 0x49, 0x44
38 };
39
22 namespace media { 40 namespace media {
23 namespace mp4 { 41 namespace mp4 {
24 42
25 class TrackRunIteratorTest : public testing::Test { 43 class TrackRunIteratorTest : public testing::Test {
26 public: 44 public:
27 TrackRunIteratorTest() { 45 TrackRunIteratorTest() {
28 CreateMovie(); 46 CreateMovie();
29 } 47 }
30 48
31 protected: 49 protected:
32 Movie moov_; 50 Movie moov_;
33 scoped_ptr<TrackRunIterator> iter_; 51 scoped_ptr<TrackRunIterator> iter_;
34 52
35 void CreateMovie() { 53 void CreateMovie() {
36 moov_.header.timescale = 1000; 54 moov_.header.timescale = 1000;
37 moov_.tracks.resize(3); 55 moov_.tracks.resize(3);
38 moov_.extends.tracks.resize(2); 56 moov_.extends.tracks.resize(2);
39 moov_.tracks[0].header.track_id = 1; 57 moov_.tracks[0].header.track_id = 1;
40 moov_.tracks[0].media.header.timescale = kAudioScale; 58 moov_.tracks[0].media.header.timescale = kAudioScale;
41 SampleDescription& desc1 = 59 SampleDescription& desc1 =
42 moov_.tracks[0].media.information.sample_table.description; 60 moov_.tracks[0].media.information.sample_table.description;
61 AudioSampleEntry aud_desc;
62 aud_desc.format = FOURCC_MP4A;
63 aud_desc.sinf.info.track_encryption.is_encrypted = false;
43 desc1.type = kAudio; 64 desc1.type = kAudio;
44 desc1.audio_entries.resize(1); 65 desc1.audio_entries.push_back(aud_desc);
45 desc1.audio_entries[0].format = FOURCC_MP4A;
46 moov_.extends.tracks[0].track_id = 1; 66 moov_.extends.tracks[0].track_id = 1;
67 moov_.extends.tracks[0].default_sample_description_index = 1;
47 68
48 moov_.tracks[1].header.track_id = 2; 69 moov_.tracks[1].header.track_id = 2;
49 moov_.tracks[1].media.header.timescale = kVideoScale; 70 moov_.tracks[1].media.header.timescale = kVideoScale;
50 SampleDescription& desc2 = 71 SampleDescription& desc2 =
51 moov_.tracks[1].media.information.sample_table.description; 72 moov_.tracks[1].media.information.sample_table.description;
73 VideoSampleEntry vid_desc;
74 vid_desc.format = FOURCC_AVC1;
75 vid_desc.sinf.info.track_encryption.is_encrypted = false;
52 desc2.type = kVideo; 76 desc2.type = kVideo;
53 desc2.video_entries.resize(1); 77 desc2.video_entries.push_back(vid_desc);
54 desc2.video_entries[0].sinf.info.track_encryption.is_encrypted = false;
55 moov_.extends.tracks[1].track_id = 2; 78 moov_.extends.tracks[1].track_id = 2;
79 moov_.extends.tracks[1].default_sample_description_index = 1;
56 80
57 moov_.tracks[2].header.track_id = 3; 81 moov_.tracks[2].header.track_id = 3;
58 moov_.tracks[2].media.information.sample_table.description.type = kHint; 82 moov_.tracks[2].media.information.sample_table.description.type = kHint;
59 } 83 }
60 84
61 MovieFragment CreateFragment() { 85 MovieFragment CreateFragment() {
62 MovieFragment moof; 86 MovieFragment moof;
63 moof.tracks.resize(2); 87 moof.tracks.resize(2);
64 moof.tracks[0].decode_time.decode_time = 0; 88 moof.tracks[0].decode_time.decode_time = 0;
65 moof.tracks[0].header.track_id = 1; 89 moof.tracks[0].header.track_id = 1;
66 moof.tracks[0].header.has_default_sample_flags = true; 90 moof.tracks[0].header.has_default_sample_flags = true;
67 moof.tracks[0].header.default_sample_duration = 1024; 91 moof.tracks[0].header.default_sample_duration = 1024;
68 moof.tracks[0].header.default_sample_size = 4; 92 moof.tracks[0].header.default_sample_size = 4;
69 moof.tracks[0].header.sample_description_index = 0;
70 moof.tracks[0].runs.resize(2); 93 moof.tracks[0].runs.resize(2);
71 moof.tracks[0].runs[0].sample_count = 10; 94 moof.tracks[0].runs[0].sample_count = 10;
72 moof.tracks[0].runs[0].data_offset = 100; 95 moof.tracks[0].runs[0].data_offset = 100;
73 SetAscending(&moof.tracks[0].runs[0].sample_sizes); 96 SetAscending(&moof.tracks[0].runs[0].sample_sizes);
74 97
75 moof.tracks[0].runs[1].sample_count = 10; 98 moof.tracks[0].runs[1].sample_count = 10;
76 moof.tracks[0].runs[1].data_offset = 10000; 99 moof.tracks[0].runs[1].data_offset = 10000;
77 100
78 moof.tracks[1].header.track_id = 2; 101 moof.tracks[1].header.track_id = 2;
79 moof.tracks[1].header.has_default_sample_flags = false; 102 moof.tracks[1].header.has_default_sample_flags = false;
80 moof.tracks[1].header.sample_description_index = 0;
81 moof.tracks[1].decode_time.decode_time = 10; 103 moof.tracks[1].decode_time.decode_time = 10;
82 moof.tracks[1].runs.resize(1); 104 moof.tracks[1].runs.resize(1);
83 moof.tracks[1].runs[0].sample_count = 10; 105 moof.tracks[1].runs[0].sample_count = 10;
84 moof.tracks[1].runs[0].data_offset = 200; 106 moof.tracks[1].runs[0].data_offset = 200;
85 SetAscending(&moof.tracks[1].runs[0].sample_sizes); 107 SetAscending(&moof.tracks[1].runs[0].sample_sizes);
86 SetAscending(&moof.tracks[1].runs[0].sample_durations); 108 SetAscending(&moof.tracks[1].runs[0].sample_durations);
87 moof.tracks[1].runs[0].sample_flags.resize(10); 109 moof.tracks[1].runs[0].sample_flags.resize(10);
88 for (size_t i = 1; i < moof.tracks[1].runs[0].sample_flags.size(); i++) { 110 for (size_t i = 1; i < moof.tracks[1].runs[0].sample_flags.size(); i++) {
89 moof.tracks[1].runs[0].sample_flags[i] = 111 moof.tracks[1].runs[0].sample_flags[i] =
90 kSampleIsDifferenceSampleFlagMask; 112 kSampleIsDifferenceSampleFlagMask;
91 } 113 }
92 114
93 return moof; 115 return moof;
94 } 116 }
95 117
118 // Update the first sample description of a Track to indicate encryption
119 void AddEncryption(Track* track) {
120 SampleDescription* stsd =
121 &track->media.information.sample_table.description;
122 ProtectionSchemeInfo* sinf;
123 if (!stsd->video_entries.empty()) {
124 sinf = &stsd->video_entries[0].sinf;
125 } else {
126 sinf = &stsd->audio_entries[0].sinf;
127 }
128
129 sinf->type.type = FOURCC_CENC;
130 sinf->info.track_encryption.is_encrypted = true;
131 sinf->info.track_encryption.default_iv_size = 8;
132 sinf->info.track_encryption.default_kid.insert(
133 sinf->info.track_encryption.default_kid.begin(),
134 kKeyId, kKeyId + arraysize(kKeyId));
135 }
136
137 // Add aux info covering the first track run to a TrackFragment, and update
138 // the run to ensure it matches length and subsample information.
139 void AddAuxInfoHeaders(int offset, TrackFragment* frag) {
140 frag->auxiliary_offset.offsets.push_back(offset);
141 frag->auxiliary_size.sample_count = 2;
142 frag->auxiliary_size.sample_info_sizes.push_back(8);
143 frag->auxiliary_size.sample_info_sizes.push_back(22);
144 frag->runs[0].sample_count = 2;
145 frag->runs[0].sample_sizes[1] = 10;
146 }
147
96 void SetAscending(std::vector<uint32>* vec) { 148 void SetAscending(std::vector<uint32>* vec) {
97 vec->resize(10); 149 vec->resize(10);
98 for (size_t i = 0; i < vec->size(); i++) 150 for (size_t i = 0; i < vec->size(); i++)
99 (*vec)[i] = i+1; 151 (*vec)[i] = i+1;
100 } 152 }
101 }; 153 };
102 154
103 TEST_F(TrackRunIteratorTest, NoRunsTest) { 155 TEST_F(TrackRunIteratorTest, NoRunsTest) {
104 iter_.reset(new TrackRunIterator(&moov_)); 156 iter_.reset(new TrackRunIterator(&moov_));
105 ASSERT_TRUE(iter_->Init(MovieFragment())); 157 ASSERT_TRUE(iter_->Init(MovieFragment()));
106 EXPECT_FALSE(iter_->RunIsValid()); 158 EXPECT_FALSE(iter_->IsRunValid());
107 EXPECT_FALSE(iter_->SampleIsValid()); 159 EXPECT_FALSE(iter_->IsSampleValid());
108 } 160 }
109 161
110 TEST_F(TrackRunIteratorTest, BasicOperationTest) { 162 TEST_F(TrackRunIteratorTest, BasicOperationTest) {
111 iter_.reset(new TrackRunIterator(&moov_)); 163 iter_.reset(new TrackRunIterator(&moov_));
112 MovieFragment moof = CreateFragment(); 164 MovieFragment moof = CreateFragment();
113 165
114 // Test that runs are sorted correctly, and that properties of the initial 166 // Test that runs are sorted correctly, and that properties of the initial
115 // sample of the first run are correct 167 // sample of the first run are correct
116 ASSERT_TRUE(iter_->Init(moof)); 168 ASSERT_TRUE(iter_->Init(moof));
117 EXPECT_TRUE(iter_->RunIsValid()); 169 EXPECT_TRUE(iter_->IsRunValid());
118 EXPECT_FALSE(iter_->is_encrypted()); 170 EXPECT_FALSE(iter_->is_encrypted());
119 EXPECT_EQ(iter_->track_id(), 1u); 171 EXPECT_EQ(iter_->track_id(), 1u);
120 EXPECT_EQ(iter_->sample_offset(), 100); 172 EXPECT_EQ(iter_->sample_offset(), 100);
121 EXPECT_EQ(iter_->sample_size(), 1); 173 EXPECT_EQ(iter_->sample_size(), 1);
122 EXPECT_EQ(iter_->dts(), TimeDeltaFromFrac(0, kAudioScale)); 174 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(0, kAudioScale));
123 EXPECT_EQ(iter_->cts(), TimeDeltaFromFrac(0, kAudioScale)); 175 EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(0, kAudioScale));
124 EXPECT_EQ(iter_->duration(), TimeDeltaFromFrac(1024, kAudioScale)); 176 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(1024, kAudioScale));
125 EXPECT_TRUE(iter_->is_keyframe()); 177 EXPECT_TRUE(iter_->is_keyframe());
126 178
127 // Advance to the last sample in the current run, and test its properties 179 // Advance to the last sample in the current run, and test its properties
128 for (int i = 0; i < 9; i++) iter_->AdvanceSample(); 180 for (int i = 0; i < 9; i++) iter_->AdvanceSample();
129 EXPECT_EQ(iter_->track_id(), 1u); 181 EXPECT_EQ(iter_->track_id(), 1u);
130 EXPECT_EQ(iter_->sample_offset(), 100 + kSumAscending1); 182 EXPECT_EQ(iter_->sample_offset(), 100 + kSumAscending1);
131 EXPECT_EQ(iter_->sample_size(), 10); 183 EXPECT_EQ(iter_->sample_size(), 10);
132 EXPECT_EQ(iter_->dts(), TimeDeltaFromFrac(1024 * 9, kAudioScale)); 184 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(1024 * 9, kAudioScale));
133 EXPECT_EQ(iter_->duration(), TimeDeltaFromFrac(1024, kAudioScale)); 185 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(1024, kAudioScale));
134 EXPECT_TRUE(iter_->is_keyframe()); 186 EXPECT_TRUE(iter_->is_keyframe());
135 187
136 // Test end-of-run 188 // Test end-of-run
137 iter_->AdvanceSample(); 189 iter_->AdvanceSample();
138 EXPECT_FALSE(iter_->SampleIsValid()); 190 EXPECT_FALSE(iter_->IsSampleValid());
139 191
140 // Test last sample of next run 192 // Test last sample of next run
141 iter_->AdvanceRun(); 193 iter_->AdvanceRun();
142 EXPECT_TRUE(iter_->is_keyframe()); 194 EXPECT_TRUE(iter_->is_keyframe());
143 for (int i = 0; i < 9; i++) iter_->AdvanceSample(); 195 for (int i = 0; i < 9; i++) iter_->AdvanceSample();
144 EXPECT_EQ(iter_->track_id(), 2u); 196 EXPECT_EQ(iter_->track_id(), 2u);
145 EXPECT_EQ(iter_->sample_offset(), 200 + kSumAscending1); 197 EXPECT_EQ(iter_->sample_offset(), 200 + kSumAscending1);
146 EXPECT_EQ(iter_->sample_size(), 10); 198 EXPECT_EQ(iter_->sample_size(), 10);
147 int64 base_dts = kSumAscending1 + moof.tracks[1].decode_time.decode_time; 199 int64 base_dts = kSumAscending1 + moof.tracks[1].decode_time.decode_time;
148 EXPECT_EQ(iter_->dts(), TimeDeltaFromFrac(base_dts, kVideoScale)); 200 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(base_dts, kVideoScale));
149 EXPECT_EQ(iter_->duration(), TimeDeltaFromFrac(10, kVideoScale)); 201 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(10, kVideoScale));
150 EXPECT_FALSE(iter_->is_keyframe()); 202 EXPECT_FALSE(iter_->is_keyframe());
151 203
152 // Test final run 204 // Test final run
153 iter_->AdvanceRun(); 205 iter_->AdvanceRun();
154 EXPECT_EQ(iter_->track_id(), 1u); 206 EXPECT_EQ(iter_->track_id(), 1u);
155 EXPECT_EQ(iter_->dts(), TimeDeltaFromFrac(1024 * 10, kAudioScale)); 207 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(1024 * 10, kAudioScale));
156 iter_->AdvanceSample(); 208 iter_->AdvanceSample();
157 EXPECT_EQ(moof.tracks[0].runs[1].data_offset + 209 EXPECT_EQ(moof.tracks[0].runs[1].data_offset +
158 moof.tracks[0].header.default_sample_size, 210 moof.tracks[0].header.default_sample_size,
159 iter_->sample_offset()); 211 iter_->sample_offset());
160 iter_->AdvanceRun(); 212 iter_->AdvanceRun();
161 EXPECT_FALSE(iter_->RunIsValid()); 213 EXPECT_FALSE(iter_->IsRunValid());
162 } 214 }
163 215
164 TEST_F(TrackRunIteratorTest, TrackExtendsDefaultsTest) { 216 TEST_F(TrackRunIteratorTest, TrackExtendsDefaultsTest) {
165 moov_.extends.tracks[0].default_sample_duration = 50; 217 moov_.extends.tracks[0].default_sample_duration = 50;
166 moov_.extends.tracks[0].default_sample_size = 3; 218 moov_.extends.tracks[0].default_sample_size = 3;
167 moov_.extends.tracks[0].default_sample_flags = 219 moov_.extends.tracks[0].default_sample_flags =
168 kSampleIsDifferenceSampleFlagMask; 220 kSampleIsDifferenceSampleFlagMask;
169 iter_.reset(new TrackRunIterator(&moov_)); 221 iter_.reset(new TrackRunIterator(&moov_));
170 MovieFragment moof = CreateFragment(); 222 MovieFragment moof = CreateFragment();
171 moof.tracks[0].header.has_default_sample_flags = false; 223 moof.tracks[0].header.has_default_sample_flags = false;
172 moof.tracks[0].header.default_sample_size = 0; 224 moof.tracks[0].header.default_sample_size = 0;
173 moof.tracks[0].header.default_sample_duration = 0; 225 moof.tracks[0].header.default_sample_duration = 0;
174 moof.tracks[0].runs[0].sample_sizes.clear(); 226 moof.tracks[0].runs[0].sample_sizes.clear();
175 ASSERT_TRUE(iter_->Init(moof)); 227 ASSERT_TRUE(iter_->Init(moof));
176 iter_->AdvanceSample(); 228 iter_->AdvanceSample();
177 EXPECT_FALSE(iter_->is_keyframe()); 229 EXPECT_FALSE(iter_->is_keyframe());
178 EXPECT_EQ(iter_->sample_size(), 3); 230 EXPECT_EQ(iter_->sample_size(), 3);
179 EXPECT_EQ(iter_->sample_offset(), moof.tracks[0].runs[0].data_offset + 3); 231 EXPECT_EQ(iter_->sample_offset(), moof.tracks[0].runs[0].data_offset + 3);
180 EXPECT_EQ(iter_->duration(), TimeDeltaFromFrac(50, kAudioScale)); 232 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(50, kAudioScale));
181 EXPECT_EQ(iter_->dts(), TimeDeltaFromFrac(50, kAudioScale)); 233 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(50, kAudioScale));
182 } 234 }
183 235
184 TEST_F(TrackRunIteratorTest, FirstSampleFlagTest) { 236 TEST_F(TrackRunIteratorTest, FirstSampleFlagTest) {
185 // Ensure that keyframes are flagged correctly in the face of BMFF boxes which 237 // Ensure that keyframes are flagged correctly in the face of BMFF boxes which
186 // explicitly specify the flags for the first sample in a run and rely on 238 // explicitly specify the flags for the first sample in a run and rely on
187 // defaults for all subsequent samples 239 // defaults for all subsequent samples
188 iter_.reset(new TrackRunIterator(&moov_)); 240 iter_.reset(new TrackRunIterator(&moov_));
189 MovieFragment moof = CreateFragment(); 241 MovieFragment moof = CreateFragment();
190 moof.tracks[1].header.has_default_sample_flags = true; 242 moof.tracks[1].header.has_default_sample_flags = true;
191 moof.tracks[1].header.default_sample_flags = 243 moof.tracks[1].header.default_sample_flags =
192 kSampleIsDifferenceSampleFlagMask; 244 kSampleIsDifferenceSampleFlagMask;
193 moof.tracks[1].runs[0].sample_flags.resize(1); 245 moof.tracks[1].runs[0].sample_flags.resize(1);
194 ASSERT_TRUE(iter_->Init(moof)); 246 ASSERT_TRUE(iter_->Init(moof));
195 iter_->AdvanceRun(); 247 iter_->AdvanceRun();
196 EXPECT_TRUE(iter_->is_keyframe()); 248 EXPECT_TRUE(iter_->is_keyframe());
197 iter_->AdvanceSample(); 249 iter_->AdvanceSample();
198 EXPECT_FALSE(iter_->is_keyframe()); 250 EXPECT_FALSE(iter_->is_keyframe());
199 } 251 }
200 252
201 TEST_F(TrackRunIteratorTest, MinDecodeTest) { 253 TEST_F(TrackRunIteratorTest, MinDecodeTest) {
202 iter_.reset(new TrackRunIterator(&moov_)); 254 iter_.reset(new TrackRunIterator(&moov_));
203 MovieFragment moof = CreateFragment(); 255 MovieFragment moof = CreateFragment();
204 moof.tracks[0].decode_time.decode_time = kAudioScale; 256 moof.tracks[0].decode_time.decode_time = kAudioScale;
205 ASSERT_TRUE(iter_->Init(moof)); 257 ASSERT_TRUE(iter_->Init(moof));
206 EXPECT_EQ(TimeDeltaFromFrac(moof.tracks[1].decode_time.decode_time, 258 EXPECT_EQ(TimeDeltaFromRational(moof.tracks[1].decode_time.decode_time,
207 kVideoScale), 259 kVideoScale),
208 iter_->GetMinDecodeTimestamp()); 260 iter_->GetMinDecodeTimestamp());
209 } 261 }
210 262
211 TEST_F(TrackRunIteratorTest, ReorderingTest) { 263 TEST_F(TrackRunIteratorTest, ReorderingTest) {
212 iter_.reset(new TrackRunIterator(&moov_)); 264 iter_.reset(new TrackRunIterator(&moov_));
213 MovieFragment moof = CreateFragment(); 265 MovieFragment moof = CreateFragment();
214 std::vector<int32>& cts_offsets = 266 std::vector<int32>& cts_offsets =
215 moof.tracks[1].runs[0].sample_composition_time_offsets; 267 moof.tracks[1].runs[0].sample_composition_time_offsets;
216 cts_offsets.resize(10); 268 cts_offsets.resize(10);
217 cts_offsets[0] = 2; 269 cts_offsets[0] = 2;
218 cts_offsets[1] = -1; 270 cts_offsets[1] = -1;
219 moof.tracks[1].decode_time.decode_time = 0; 271 moof.tracks[1].decode_time.decode_time = 0;
220 ASSERT_TRUE(iter_->Init(moof)); 272 ASSERT_TRUE(iter_->Init(moof));
221 iter_->AdvanceRun(); 273 iter_->AdvanceRun();
222 EXPECT_EQ(iter_->dts(), TimeDeltaFromFrac(0, kVideoScale)); 274 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(0, kVideoScale));
223 EXPECT_EQ(iter_->cts(), TimeDeltaFromFrac(2, kVideoScale)); 275 EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(2, kVideoScale));
224 EXPECT_EQ(iter_->duration(), TimeDeltaFromFrac(1, kVideoScale)); 276 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(1, kVideoScale));
225 iter_->AdvanceSample(); 277 iter_->AdvanceSample();
226 EXPECT_EQ(iter_->dts(), TimeDeltaFromFrac(1, kVideoScale)); 278 EXPECT_EQ(iter_->dts(), TimeDeltaFromRational(1, kVideoScale));
227 EXPECT_EQ(iter_->cts(), TimeDeltaFromFrac(0, kVideoScale)); 279 EXPECT_EQ(iter_->cts(), TimeDeltaFromRational(0, kVideoScale));
228 EXPECT_EQ(iter_->duration(), TimeDeltaFromFrac(2, kVideoScale)); 280 EXPECT_EQ(iter_->duration(), TimeDeltaFromRational(2, kVideoScale));
281 }
282
283 TEST_F(TrackRunIteratorTest, IgnoreUnknownAuxInfoTest) {
284 iter_.reset(new TrackRunIterator(&moov_));
285 MovieFragment moof = CreateFragment();
286 moof.tracks[1].auxiliary_offset.offsets.push_back(50);
287 moof.tracks[1].auxiliary_size.default_sample_info_size = 2;
288 moof.tracks[1].auxiliary_size.sample_count = 2;
289 moof.tracks[1].runs[0].sample_count = 2;
290 ASSERT_TRUE(iter_->Init(moof));
291 iter_->AdvanceRun();
292 EXPECT_FALSE(iter_->AuxInfoNeedsToBeCached());
293 }
294
295 TEST_F(TrackRunIteratorTest, DecryptConfigTest) {
296 AddEncryption(&moov_.tracks[1]);
297 iter_.reset(new TrackRunIterator(&moov_));
298
299 MovieFragment moof = CreateFragment();
300 AddAuxInfoHeaders(50, &moof.tracks[1]);
301
302 ASSERT_TRUE(iter_->Init(moof));
303
304 // The run for track 2 will be first, since its aux info offset is the first
305 // element in the file.
306 EXPECT_EQ(iter_->track_id(), 2u);
307 EXPECT_TRUE(iter_->is_encrypted());
308 EXPECT_TRUE(iter_->AuxInfoNeedsToBeCached());
309 EXPECT_EQ(static_cast<uint32>(iter_->aux_info_size()), arraysize(kAuxInfo));
310 EXPECT_EQ(iter_->aux_info_offset(), 50);
311 EXPECT_EQ(iter_->GetMaxClearOffset(), 50);
312 EXPECT_FALSE(iter_->CacheAuxInfo(NULL, 0));
313 EXPECT_FALSE(iter_->CacheAuxInfo(kAuxInfo, 3));
314 EXPECT_TRUE(iter_->AuxInfoNeedsToBeCached());
315 EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo)));
316 EXPECT_FALSE(iter_->AuxInfoNeedsToBeCached());
317 EXPECT_EQ(iter_->sample_offset(), 200);
318 EXPECT_EQ(iter_->GetMaxClearOffset(), moof.tracks[0].runs[0].data_offset);
319 scoped_ptr<DecryptConfig> config = iter_->GetDecryptConfig();
320 ASSERT_EQ(arraysize(kKeyId), config->key_id().size());
321 EXPECT_TRUE(!memcmp(kKeyId, config->key_id().data(),
322 config->key_id().size()));
323 ASSERT_EQ(arraysize(kIv1), config->iv().size());
324 EXPECT_TRUE(!memcmp(kIv1, config->iv().data(), config->iv().size()));
325 EXPECT_TRUE(config->subsamples().empty());
326 iter_->AdvanceSample();
327 config = iter_->GetDecryptConfig();
328 EXPECT_EQ(config->subsamples().size(), 2u);
329 EXPECT_EQ(config->subsamples()[0].clear_bytes, 1u);
330 EXPECT_EQ(config->subsamples()[1].cypher_bytes, 4u);
331 }
332
333 // It is legal for aux info blocks to be shared among multiple formats.
334 TEST_F(TrackRunIteratorTest, SharedAuxInfoTest) {
335 AddEncryption(&moov_.tracks[0]);
336 AddEncryption(&moov_.tracks[1]);
337 iter_.reset(new TrackRunIterator(&moov_));
338
339 MovieFragment moof = CreateFragment();
340 moof.tracks[0].runs.resize(1);
341 AddAuxInfoHeaders(50, &moof.tracks[0]);
342 AddAuxInfoHeaders(50, &moof.tracks[1]);
343 moof.tracks[0].auxiliary_size.default_sample_info_size = 8;
344
345 ASSERT_TRUE(iter_->Init(moof));
346 EXPECT_EQ(iter_->track_id(), 1u);
347 EXPECT_EQ(iter_->aux_info_offset(), 50);
348 EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo)));
349 scoped_ptr<DecryptConfig> config = iter_->GetDecryptConfig();
350 ASSERT_EQ(arraysize(kIv1), config->iv().size());
351 EXPECT_TRUE(!memcmp(kIv1, config->iv().data(), config->iv().size()));
352 iter_->AdvanceSample();
353 EXPECT_EQ(iter_->GetMaxClearOffset(), 50);
354 iter_->AdvanceRun();
355 EXPECT_EQ(iter_->GetMaxClearOffset(), 50);
356 EXPECT_EQ(iter_->aux_info_offset(), 50);
357 EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo)));
358 EXPECT_EQ(iter_->GetMaxClearOffset(), 200);
359 ASSERT_EQ(arraysize(kIv1), config->iv().size());
360 EXPECT_TRUE(!memcmp(kIv1, config->iv().data(), config->iv().size()));
361 iter_->AdvanceSample();
362 EXPECT_EQ(iter_->GetMaxClearOffset(), 201);
363 }
364
365 // Sensible files are expected to place auxiliary information for a run
366 // immediately before the main data for that run. Alternative schemes are
367 // possible, however, including the somewhat reasonable behavior of placing all
368 // aux info at the head of the 'mdat' box together, and the completely
369 // unreasonable behavior demonstrated here:
370 // byte 50: track 2, run 1 aux info
371 // byte 100: track 1, run 1 data
372 // byte 200: track 2, run 1 data
373 // byte 201: track 1, run 2 aux info (*inside* track 2, run 1 data)
374 // byte 10000: track 1, run 2 data
375 // byte 20000: track 1, run 1 aux info
376 TEST_F(TrackRunIteratorTest, UnexpectedOrderingTest) {
377 AddEncryption(&moov_.tracks[0]);
378 AddEncryption(&moov_.tracks[1]);
379 iter_.reset(new TrackRunIterator(&moov_));
380
381 MovieFragment moof = CreateFragment();
382 AddAuxInfoHeaders(20000, &moof.tracks[0]);
383 moof.tracks[0].auxiliary_offset.offsets.push_back(201);
384 moof.tracks[0].auxiliary_size.sample_count += 2;
385 moof.tracks[0].auxiliary_size.default_sample_info_size = 8;
386 moof.tracks[0].runs[1].sample_count = 2;
387 AddAuxInfoHeaders(50, &moof.tracks[1]);
388 moof.tracks[1].runs[0].sample_sizes[0] = 5;
389
390 ASSERT_TRUE(iter_->Init(moof));
391 EXPECT_EQ(iter_->track_id(), 2u);
392 EXPECT_EQ(iter_->aux_info_offset(), 50);
393 EXPECT_EQ(iter_->sample_offset(), 200);
394 EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo)));
395 EXPECT_EQ(iter_->GetMaxClearOffset(), 100);
396 iter_->AdvanceRun();
397 EXPECT_EQ(iter_->track_id(), 1u);
398 EXPECT_EQ(iter_->aux_info_offset(), 20000);
399 EXPECT_EQ(iter_->sample_offset(), 100);
400 EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo)));
401 EXPECT_EQ(iter_->GetMaxClearOffset(), 100);
402 iter_->AdvanceSample();
403 EXPECT_EQ(iter_->GetMaxClearOffset(), 101);
404 iter_->AdvanceRun();
405 EXPECT_EQ(iter_->track_id(), 1u);
406 EXPECT_EQ(iter_->aux_info_offset(), 201);
407 EXPECT_EQ(iter_->sample_offset(), 10000);
408 EXPECT_EQ(iter_->GetMaxClearOffset(), 201);
409 EXPECT_TRUE(iter_->CacheAuxInfo(kAuxInfo, arraysize(kAuxInfo)));
410 EXPECT_EQ(iter_->GetMaxClearOffset(), 10000);
229 } 411 }
230 412
231 } // namespace mp4 413 } // namespace mp4
232 } // namespace media 414 } // namespace media
OLDNEW
« no previous file with comments | « media/mp4/track_run_iterator.cc ('k') | media/webm/webm_cluster_parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698