OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <map> | |
9 #include <sstream> | 10 #include <sstream> |
10 | 11 |
11 #include "base/macros.h" | 12 #include "base/macros.h" |
12 #include "media/base/stream_parser.h" | 13 #include "media/base/stream_parser.h" |
13 #include "media/base/stream_parser_buffer.h" | 14 #include "media/base/stream_parser_buffer.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
15 | 16 |
16 namespace media { | 17 namespace media { |
17 | 18 |
18 typedef StreamParser::TrackId TrackId; | 19 typedef StreamParser::TrackId TrackId; |
19 typedef StreamParser::BufferQueue BufferQueue; | 20 typedef StreamParser::BufferQueue BufferQueue; |
20 typedef StreamParser::TextBufferQueueMap TextBufferQueueMap; | |
21 | 21 |
22 const int kEnd = -1; | 22 const int kEnd = -1; |
23 const uint8_t kFakeData[] = {0xFF}; | 23 const uint8_t kFakeData[] = {0xFF}; |
24 const TrackId kAudioTrackId = 0; | 24 const TrackId kAudioTrackId = 0; |
25 const TrackId kVideoTrackId = 1; | 25 const TrackId kVideoTrackId = 1; |
26 const TrackId kTextTrackIdA = 2; | 26 const TrackId kTextTrackIdA = 2; |
27 const TrackId kTextTrackIdB = 3; | 27 const TrackId kTextTrackIdB = 3; |
28 | 28 |
29 static bool IsAudio(scoped_refptr<StreamParserBuffer> buffer) { | 29 static bool IsAudio(scoped_refptr<StreamParserBuffer> buffer) { |
30 return buffer->type() == DemuxerStream::AUDIO; | 30 return buffer->type() == DemuxerStream::AUDIO; |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
71 bool (*predicate)(scoped_refptr<StreamParserBuffer> buffer)) { | 71 bool (*predicate)(scoped_refptr<StreamParserBuffer> buffer)) { |
72 return static_cast<size_t>(count_if(merged_buffers_.begin(), | 72 return static_cast<size_t>(count_if(merged_buffers_.begin(), |
73 merged_buffers_.end(), | 73 merged_buffers_.end(), |
74 predicate)); | 74 predicate)); |
75 } | 75 } |
76 | 76 |
77 // Appends test audio buffers in the sequence described by |decode_timestamps| | 77 // Appends test audio buffers in the sequence described by |decode_timestamps| |
78 // to |audio_buffers_|. See GenerateBuffers() for |decode_timestamps| format. | 78 // to |audio_buffers_|. See GenerateBuffers() for |decode_timestamps| format. |
79 void GenerateAudioBuffers(const int* decode_timestamps) { | 79 void GenerateAudioBuffers(const int* decode_timestamps) { |
80 GenerateBuffers(decode_timestamps, DemuxerStream::AUDIO, kAudioTrackId, | 80 GenerateBuffers(decode_timestamps, DemuxerStream::AUDIO, kAudioTrackId, |
81 &audio_buffers_); | 81 &buffer_queue_map_[kAudioTrackId]); |
82 } | 82 } |
83 | 83 |
84 // Appends test video buffers in the sequence described by |decode_timestamps| | 84 // Appends test video buffers in the sequence described by |decode_timestamps| |
85 // to |video_buffers_|. See GenerateBuffers() for |decode_timestamps| format. | 85 // to |video_buffers_|. See GenerateBuffers() for |decode_timestamps| format. |
86 void GenerateVideoBuffers(const int* decode_timestamps) { | 86 void GenerateVideoBuffers(const int* decode_timestamps) { |
87 GenerateBuffers(decode_timestamps, DemuxerStream::VIDEO, kVideoTrackId, | 87 GenerateBuffers(decode_timestamps, DemuxerStream::VIDEO, kVideoTrackId, |
88 &video_buffers_); | 88 &buffer_queue_map_[kVideoTrackId]); |
89 } | 89 } |
90 | 90 |
91 // Current tests only need up to two distinct text BufferQueues. This helper | 91 // Current tests only need up to two distinct text BufferQueues. This helper |
92 // conditionally appends buffers to the underlying |text_buffers_a_| and | 92 // conditionally appends buffers to the underlying |buffer_queue_map_| keyed |
93 // |text_buffers_b_| and conditionally inserts these BufferQueues into | 93 // by the respective track ID. If |decode_timestamps_{a,b}| |
94 // |text_map_| keyed by the respective track ID. If |decode_timestamps_{a,b}| | 94 // is NULL, then the corresponding BufferQueue is not changed at all. |
95 // is NULL, then the corresponding BufferQueue is neither appended to nor | |
96 // inserted into |text_map_| (though it may previously have been inserted). | |
97 // Note that key collision on map insertion does not replace the previous | 95 // Note that key collision on map insertion does not replace the previous |
98 // value. | 96 // value. |
99 void GenerateTextBuffers(const int* decode_timestamps_a, | 97 void GenerateTextBuffers(const int* decode_timestamps_a, |
100 const int* decode_timestamps_b) { | 98 const int* decode_timestamps_b) { |
101 if (decode_timestamps_a) { | 99 if (decode_timestamps_a) { |
102 GenerateBuffers(decode_timestamps_a, DemuxerStream::TEXT, kTextTrackIdA, | 100 GenerateBuffers(decode_timestamps_a, DemuxerStream::TEXT, kTextTrackIdA, |
103 &text_buffers_a_); | 101 &buffer_queue_map_[kTextTrackIdA]); |
104 text_map_.insert(std::make_pair(kTextTrackIdA, text_buffers_a_)); | |
105 } | 102 } |
106 | 103 |
107 if (decode_timestamps_b) { | 104 if (decode_timestamps_b) { |
108 GenerateBuffers(decode_timestamps_b, DemuxerStream::TEXT, kTextTrackIdB, | 105 GenerateBuffers(decode_timestamps_b, DemuxerStream::TEXT, kTextTrackIdB, |
109 &text_buffers_b_); | 106 &buffer_queue_map_[kTextTrackIdB]); |
110 text_map_.insert(std::make_pair(kTextTrackIdB, text_buffers_b_)); | |
111 } | 107 } |
112 } | 108 } |
113 | 109 |
114 // Returns a string that describes the sequence of buffers in | 110 // Returns a string that describes the sequence of buffers in |
115 // |merged_buffers_|. The string is a concatenation of space-delimited buffer | 111 // |merged_buffers_|. The string is a concatenation of space-delimited buffer |
116 // descriptors in the same sequence as |merged_buffers_|. Each descriptor is | 112 // descriptors in the same sequence as |merged_buffers_|. Each descriptor is |
117 // the concatenation of | 113 // the concatenation of |
118 // 1) a single character that describes the buffer's type(), e.g. A, V, or T | 114 // 1) a single character that describes the buffer's type(), e.g. A, V, or T |
119 // for audio, video, or text, respectively | 115 // for audio, video, or text, respectively |
120 // 2) the buffer's track_id() | 116 // 2) the buffer's track_id() |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
169 // also verified to match the number of buffers in |audio_buffers_|, | 165 // also verified to match the number of buffers in |audio_buffers_|, |
170 // |video_buffers_|, and |text_map_|, respectively. | 166 // |video_buffers_|, and |text_map_|, respectively. |
171 void VerifyMergeSuccess(const std::string& expected, | 167 void VerifyMergeSuccess(const std::string& expected, |
172 bool verify_type_and_text_track_sequence) { | 168 bool verify_type_and_text_track_sequence) { |
173 // |merged_buffers| may already have some buffers. Count them by type for | 169 // |merged_buffers| may already have some buffers. Count them by type for |
174 // later inclusion in verification. | 170 // later inclusion in verification. |
175 size_t original_audio_in_merged = CountMatchingMergedBuffers(IsAudio); | 171 size_t original_audio_in_merged = CountMatchingMergedBuffers(IsAudio); |
176 size_t original_video_in_merged = CountMatchingMergedBuffers(IsVideo); | 172 size_t original_video_in_merged = CountMatchingMergedBuffers(IsVideo); |
177 size_t original_text_in_merged = CountMatchingMergedBuffers(IsText); | 173 size_t original_text_in_merged = CountMatchingMergedBuffers(IsText); |
178 | 174 |
179 EXPECT_TRUE(MergeBufferQueues(audio_buffers_, video_buffers_, text_map_, | 175 StreamParser::BufferQueueMap buffer_queue_map; |
180 &merged_buffers_)); | 176 for (const auto& it : buffer_queue_map_) { |
wolenetz
2016/08/23 21:31:21
why are we copying bqm into bqm_ here? Why not jus
servolk
2016/08/23 23:56:32
The second parameter of StreamParser::TextBufferQu
| |
177 if (!it.second.empty()) | |
178 buffer_queue_map.insert(std::make_pair(it.first, it.second)); | |
179 } | |
180 EXPECT_TRUE(MergeBufferQueues(buffer_queue_map, &merged_buffers_)); | |
181 | 181 |
182 // Verify resulting contents of |merged_buffers| matches |expected|. | 182 // Verify resulting contents of |merged_buffers| matches |expected|. |
183 EXPECT_EQ(expected, | 183 EXPECT_EQ(expected, |
184 MergedBufferQueueString(verify_type_and_text_track_sequence)); | 184 MergedBufferQueueString(verify_type_and_text_track_sequence)); |
185 | 185 |
186 // Verify that the correct number of each type of buffer is in the merge | 186 // Verify that the correct number of each type of buffer is in the merge |
187 // result. | 187 // result. |
188 size_t audio_in_merged = CountMatchingMergedBuffers(IsAudio); | 188 size_t audio_in_merged = CountMatchingMergedBuffers(IsAudio); |
189 size_t video_in_merged = CountMatchingMergedBuffers(IsVideo); | 189 size_t video_in_merged = CountMatchingMergedBuffers(IsVideo); |
190 size_t text_in_merged = CountMatchingMergedBuffers(IsText); | 190 size_t text_in_merged = CountMatchingMergedBuffers(IsText); |
191 | 191 |
192 EXPECT_GE(audio_in_merged, original_audio_in_merged); | 192 EXPECT_GE(audio_in_merged, original_audio_in_merged); |
193 EXPECT_GE(video_in_merged, original_video_in_merged); | 193 EXPECT_GE(video_in_merged, original_video_in_merged); |
194 EXPECT_GE(text_in_merged, original_text_in_merged); | 194 EXPECT_GE(text_in_merged, original_text_in_merged); |
195 | 195 |
196 EXPECT_EQ(audio_buffers_.size(), | 196 EXPECT_EQ(buffer_queue_map_[kAudioTrackId].size(), |
197 audio_in_merged - original_audio_in_merged); | 197 audio_in_merged - original_audio_in_merged); |
198 EXPECT_EQ(video_buffers_.size(), | 198 EXPECT_EQ(buffer_queue_map_[kVideoTrackId].size(), |
199 video_in_merged - original_video_in_merged); | 199 video_in_merged - original_video_in_merged); |
200 | 200 |
201 size_t expected_text_buffer_count = 0; | 201 size_t expected_text_buffer_count = 0; |
202 for (TextBufferQueueMap::const_iterator itr = text_map_.begin(); | 202 expected_text_buffer_count += buffer_queue_map_[kTextTrackIdA].size(); |
203 itr != text_map_.end(); | 203 expected_text_buffer_count += buffer_queue_map_[kTextTrackIdB].size(); |
204 ++itr) { | |
205 expected_text_buffer_count += itr->second.size(); | |
206 } | |
207 EXPECT_EQ(expected_text_buffer_count, | 204 EXPECT_EQ(expected_text_buffer_count, |
208 text_in_merged - original_text_in_merged); | 205 text_in_merged - original_text_in_merged); |
209 } | 206 } |
210 | 207 |
211 // Verifies that MergeBufferQueues() of the current |audio_buffers_|, | 208 // Verifies that MergeBufferQueues() of the current |audio_buffers_|, |
wolenetz
2016/08/23 21:31:21
nit: update comment. these members no longer exist
servolk
2016/08/23 23:56:31
Done.
| |
212 // |video_buffers_|, |text_map_|, and |merged_buffers_| returns false. | 209 // |video_buffers_|, |text_map_|, and |merged_buffers_| returns false. |
213 void VerifyMergeFailure() { | 210 void VerifyMergeFailure() { |
214 EXPECT_FALSE(MergeBufferQueues(audio_buffers_, video_buffers_, text_map_, | 211 StreamParser::BufferQueueMap buffer_queue_map; |
wolenetz
2016/08/23 21:31:21
ditto: why copy bqm_ into bqm?
servolk
2016/08/23 23:56:32
see above.
| |
215 &merged_buffers_)); | 212 for (const auto& it : buffer_queue_map_) { |
213 if (!it.second.empty()) | |
214 buffer_queue_map.insert(std::make_pair(it.first, it.second)); | |
215 } | |
216 EXPECT_FALSE(MergeBufferQueues(buffer_queue_map, &merged_buffers_)); | |
216 } | 217 } |
217 | 218 |
218 // Helper to allow tests to clear all the input BufferQueues (except | 219 // Helper to allow tests to clear all the input BufferQueues (except |
219 // |merged_buffers_|) and the TextBufferQueueMap that are used in | 220 // |merged_buffers_|) and the BufferQueueMap that are used in |
220 // VerifyMerge{Success/Failure}(). | 221 // VerifyMerge{Success/Failure}(). |
221 void ClearQueuesAndTextMapButKeepAnyMergedBuffers() { | 222 void ClearQueuesAndTextMapButKeepAnyMergedBuffers() { |
wolenetz
2016/08/23 21:31:21
nit: rename seems appropriate (ClearBufferQueuesBu
servolk
2016/08/23 23:56:32
Done.
| |
222 audio_buffers_.clear(); | 223 buffer_queue_map_.clear(); |
223 video_buffers_.clear(); | |
224 text_buffers_a_.clear(); | |
225 text_buffers_b_.clear(); | |
226 text_map_.clear(); | |
227 } | 224 } |
228 | 225 |
229 private: | 226 private: |
230 BufferQueue audio_buffers_; | 227 std::map<StreamParser::TrackId, StreamParser::BufferQueue> buffer_queue_map_; |
wolenetz
2016/08/23 21:31:21
nit: StreamParser::BufferQueueMap ?
servolk
2016/08/23 23:56:31
Done.
| |
231 BufferQueue video_buffers_; | |
232 BufferQueue text_buffers_a_; | |
233 BufferQueue text_buffers_b_; | |
234 BufferQueue merged_buffers_; | 228 BufferQueue merged_buffers_; |
235 TextBufferQueueMap text_map_; | |
236 | 229 |
237 DISALLOW_COPY_AND_ASSIGN(StreamParserTest); | 230 DISALLOW_COPY_AND_ASSIGN(StreamParserTest); |
238 }; | 231 }; |
239 | 232 |
240 TEST_F(StreamParserTest, MergeBufferQueues_AllEmpty) { | 233 TEST_F(StreamParserTest, MergeBufferQueues_AllEmpty) { |
241 std::string expected = ""; | 234 std::string expected = ""; |
242 VerifyMergeSuccess(expected, true); | 235 VerifyMergeSuccess(expected, true); |
243 } | 236 } |
244 | 237 |
245 TEST_F(StreamParserTest, MergeBufferQueues_SingleAudioBuffer) { | 238 TEST_F(StreamParserTest, MergeBufferQueues_SingleAudioBuffer) { |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
375 VerifyMergeSuccess(expected, true); | 368 VerifyMergeSuccess(expected, true); |
376 | 369 |
377 // But appending something with a lower timestamp than the last timestamp | 370 // But appending something with a lower timestamp than the last timestamp |
378 // in the pre-existing merge result should fail. | 371 // in the pre-existing merge result should fail. |
379 int more_audio_timestamps[] = { 106, kEnd }; | 372 int more_audio_timestamps[] = { 106, kEnd }; |
380 GenerateAudioBuffers(more_audio_timestamps); | 373 GenerateAudioBuffers(more_audio_timestamps); |
381 VerifyMergeFailure(); | 374 VerifyMergeFailure(); |
382 } | 375 } |
383 | 376 |
384 } // namespace media | 377 } // namespace media |
OLD | NEW |