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

Side by Side Diff: media/formats/webm/webm_cluster_parser_unittest.cc

Issue 2254093002: Return buffers from StreamParsers in a single unified map (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Restored calling GetBuffers after each Parse in WebM test Created 4 years, 3 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/formats/webm/webm_cluster_parser.cc ('k') | media/formats/webm/webm_stream_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 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 "media/formats/webm/webm_cluster_parser.h" 5 #include "media/formats/webm/webm_cluster_parser.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 std::unique_ptr<Cluster> CreateEncryptedCluster(int bytes_to_write) { 172 std::unique_ptr<Cluster> CreateEncryptedCluster(int bytes_to_write) {
173 CHECK_GT(bytes_to_write, 0); 173 CHECK_GT(bytes_to_write, 0);
174 CHECK_LE(bytes_to_write, static_cast<int>(sizeof(kEncryptedFrame))); 174 CHECK_LE(bytes_to_write, static_cast<int>(sizeof(kEncryptedFrame)));
175 175
176 ClusterBuilder cb; 176 ClusterBuilder cb;
177 cb.SetClusterTimecode(0); 177 cb.SetClusterTimecode(0);
178 cb.AddSimpleBlock(kVideoTrackNum, 0, 0, kEncryptedFrame, bytes_to_write); 178 cb.AddSimpleBlock(kVideoTrackNum, 0, 0, kEncryptedFrame, bytes_to_write);
179 return cb.Finish(); 179 return cb.Finish();
180 } 180 }
181 181
182 bool VerifyBuffers(const WebMClusterParser::BufferQueue& audio_buffers, 182 bool VerifyBuffers(const StreamParser::BufferQueueMap& buffer_queue_map,
183 const WebMClusterParser::BufferQueue& video_buffers,
184 const WebMClusterParser::BufferQueue& text_buffers,
185 const BlockInfo* block_info, 183 const BlockInfo* block_info,
186 int block_count) { 184 int block_count) {
187 int buffer_count = audio_buffers.size() + video_buffers.size() + 185 int buffer_count = 0;
188 text_buffers.size(); 186 for (const auto& it : buffer_queue_map)
187 buffer_count += it.second.size();
189 if (block_count != buffer_count) { 188 if (block_count != buffer_count) {
190 DVLOG(1) << __FUNCTION__ << " : block_count (" << block_count 189 DVLOG(1) << __FUNCTION__ << " : block_count (" << block_count
191 << ") mismatches buffer_count (" << buffer_count << ")"; 190 << ") mismatches buffer_count (" << buffer_count << ")";
192 return false; 191 return false;
193 } 192 }
194 193
195 size_t audio_offset = 0; 194 size_t audio_offset = 0;
196 size_t video_offset = 0; 195 size_t video_offset = 0;
197 size_t text_offset = 0; 196 size_t text_offset = 0;
198 for (int i = 0; i < block_count; i++) { 197 for (int i = 0; i < block_count; i++) {
199 const WebMClusterParser::BufferQueue* buffers = NULL; 198 const StreamParser::BufferQueue* buffers = NULL;
200 size_t* offset; 199 size_t* offset;
201 StreamParserBuffer::Type expected_type = DemuxerStream::UNKNOWN; 200 StreamParserBuffer::Type expected_type = DemuxerStream::UNKNOWN;
202 201
202 const auto& it = buffer_queue_map.find(block_info[i].track_num);
203 EXPECT_NE(buffer_queue_map.end(), it);
204 buffers = &it->second;
203 if (block_info[i].track_num == kAudioTrackNum) { 205 if (block_info[i].track_num == kAudioTrackNum) {
204 buffers = &audio_buffers;
205 offset = &audio_offset; 206 offset = &audio_offset;
206 expected_type = DemuxerStream::AUDIO; 207 expected_type = DemuxerStream::AUDIO;
207 } else if (block_info[i].track_num == kVideoTrackNum) { 208 } else if (block_info[i].track_num == kVideoTrackNum) {
208 buffers = &video_buffers;
209 offset = &video_offset; 209 offset = &video_offset;
210 expected_type = DemuxerStream::VIDEO; 210 expected_type = DemuxerStream::VIDEO;
211 } else if (block_info[i].track_num == kTextTrackNum) { 211 } else if (block_info[i].track_num == kTextTrackNum) {
212 buffers = &text_buffers;
213 offset = &text_offset; 212 offset = &text_offset;
214 expected_type = DemuxerStream::TEXT; 213 expected_type = DemuxerStream::TEXT;
215 } else { 214 } else {
216 LOG(ERROR) << "Unexpected track number " << block_info[i].track_num; 215 LOG(ERROR) << "Unexpected track number " << block_info[i].track_num;
217 return false; 216 return false;
218 } 217 }
219 218
220 if (*offset >= buffers->size()) { 219 if (*offset >= buffers->size()) {
221 DVLOG(1) << __FUNCTION__ << " : Too few buffers (" << buffers->size() 220 DVLOG(1) << __FUNCTION__ << " : Too few buffers (" << buffers->size()
222 << ") for track_num (" << block_info[i].track_num 221 << ") for track_num (" << block_info[i].track_num
(...skipping 10 matching lines...) Expand all
233 EXPECT_EQ(block_info[i].track_num, buffer->track_id()); 232 EXPECT_EQ(block_info[i].track_num, buffer->track_id());
234 EXPECT_EQ(block_info[i].is_key_frame, buffer->is_key_frame()); 233 EXPECT_EQ(block_info[i].is_key_frame, buffer->is_key_frame());
235 } 234 }
236 235
237 return true; 236 return true;
238 } 237 }
239 238
240 bool VerifyBuffers(const std::unique_ptr<WebMClusterParser>& parser, 239 bool VerifyBuffers(const std::unique_ptr<WebMClusterParser>& parser,
241 const BlockInfo* block_info, 240 const BlockInfo* block_info,
242 int block_count) { 241 int block_count) {
243 const WebMClusterParser::TextBufferQueueMap& text_map = 242 StreamParser::BufferQueueMap buffers;
244 parser->GetTextBuffers(); 243 parser->GetBuffers(&buffers);
245 const WebMClusterParser::BufferQueue* text_buffers; 244 return VerifyBuffers(buffers, block_info, block_count);
246 const WebMClusterParser::BufferQueue no_text_buffers;
247 if (!text_map.empty())
248 text_buffers = &(text_map.rbegin()->second);
249 else
250 text_buffers = &no_text_buffers;
251
252 return VerifyBuffers(parser->GetAudioBuffers(),
253 parser->GetVideoBuffers(),
254 *text_buffers,
255 block_info,
256 block_count);
257 } 245 }
258 246
259 bool VerifyTextBuffers(const std::unique_ptr<WebMClusterParser>& parser, 247 bool VerifyTextBuffers(const std::unique_ptr<WebMClusterParser>& parser,
260 const BlockInfo* block_info_ptr, 248 const BlockInfo* block_info_ptr,
261 int block_count, 249 int block_count,
262 int text_track_num, 250 int text_track_num,
263 const WebMClusterParser::BufferQueue& text_buffers) { 251 const WebMClusterParser::BufferQueue& text_buffers) {
264 const BlockInfo* const block_info_end = block_info_ptr + block_count; 252 const BlockInfo* const block_info_end = block_info_ptr + block_count;
265 253
266 typedef WebMClusterParser::BufferQueue::const_iterator TextBufferIter; 254 typedef WebMClusterParser::BufferQueue::const_iterator TextBufferIter;
(...skipping 20 matching lines...) Expand all
287 EXPECT_TRUE(buffer_iter == buffer_end); 275 EXPECT_TRUE(buffer_iter == buffer_end);
288 return true; 276 return true;
289 } 277 }
290 278
291 void VerifyEncryptedBuffer(scoped_refptr<StreamParserBuffer> buffer) { 279 void VerifyEncryptedBuffer(scoped_refptr<StreamParserBuffer> buffer) {
292 EXPECT_TRUE(buffer->decrypt_config()); 280 EXPECT_TRUE(buffer->decrypt_config());
293 EXPECT_EQ(static_cast<unsigned long>(DecryptConfig::kDecryptionKeySize), 281 EXPECT_EQ(static_cast<unsigned long>(DecryptConfig::kDecryptionKeySize),
294 buffer->decrypt_config()->iv().length()); 282 buffer->decrypt_config()->iv().length());
295 } 283 }
296 284
297 void AppendToEnd(const WebMClusterParser::BufferQueue& src, 285 void AppendToEnd(const StreamParser::BufferQueue& src,
298 WebMClusterParser::BufferQueue* dest) { 286 StreamParser::BufferQueue* dest) {
299 for (WebMClusterParser::BufferQueue::const_iterator itr = src.begin(); 287 for (StreamParser::BufferQueue::const_iterator itr = src.begin();
300 itr != src.end(); ++itr) { 288 itr != src.end(); ++itr) {
301 dest->push_back(*itr); 289 dest->push_back(*itr);
302 } 290 }
303 } 291 }
304 292
305 } // namespace 293 } // namespace
306 294
307 class WebMClusterParserTest : public testing::Test { 295 class WebMClusterParserTest : public testing::Test {
308 public: 296 public:
309 WebMClusterParserTest() 297 WebMClusterParserTest()
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
508 int result = parser_->Parse(cluster->data(), cluster->size()); 496 int result = parser_->Parse(cluster->data(), cluster->size());
509 EXPECT_EQ(cluster->size(), result); 497 EXPECT_EQ(cluster->size(), result);
510 ASSERT_TRUE(VerifyBuffers(parser_, kDefaultBlockInfo, block_count)); 498 ASSERT_TRUE(VerifyBuffers(parser_, kDefaultBlockInfo, block_count));
511 } 499 }
512 500
513 TEST_F(WebMClusterParserTest, ParseClusterWithMultipleCalls) { 501 TEST_F(WebMClusterParserTest, ParseClusterWithMultipleCalls) {
514 int block_count = arraysize(kDefaultBlockInfo); 502 int block_count = arraysize(kDefaultBlockInfo);
515 std::unique_ptr<Cluster> cluster( 503 std::unique_ptr<Cluster> cluster(
516 CreateCluster(0, kDefaultBlockInfo, block_count)); 504 CreateCluster(0, kDefaultBlockInfo, block_count));
517 505
518 WebMClusterParser::BufferQueue audio_buffers;
519 WebMClusterParser::BufferQueue video_buffers;
520 const WebMClusterParser::BufferQueue no_text_buffers;
521
522 const uint8_t* data = cluster->data(); 506 const uint8_t* data = cluster->data();
523 int size = cluster->size(); 507 int size = cluster->size();
524 int default_parse_size = 3; 508 int default_parse_size = 3;
525 int parse_size = std::min(default_parse_size, size); 509 int parse_size = std::min(default_parse_size, size);
526 510
511 StreamParser::BufferQueueMap buffers;
527 while (size > 0) { 512 while (size > 0) {
528 int result = parser_->Parse(data, parse_size); 513 int result = parser_->Parse(data, parse_size);
529 ASSERT_GE(result, 0); 514 ASSERT_GE(result, 0);
530 ASSERT_LE(result, parse_size); 515 ASSERT_LE(result, parse_size);
531 516
532 if (result == 0) { 517 if (result == 0) {
533 // The parser needs more data so increase the parse_size a little. 518 // The parser needs more data so increase the parse_size a little.
534 parse_size += default_parse_size; 519 parse_size += default_parse_size;
535 parse_size = std::min(parse_size, size); 520 parse_size = std::min(parse_size, size);
536 continue; 521 continue;
537 } 522 }
538 523
539 AppendToEnd(parser_->GetAudioBuffers(), &audio_buffers); 524 StreamParser::BufferQueueMap bqm;
540 AppendToEnd(parser_->GetVideoBuffers(), &video_buffers); 525 parser_->GetBuffers(&bqm);
526 for (const auto& it : bqm) {
527 AppendToEnd(it.second, &buffers[it.first]);
528 }
541 529
542 parse_size = default_parse_size; 530 parse_size = default_parse_size;
543 531
544 data += result; 532 data += result;
545 size -= result; 533 size -= result;
546 } 534 }
547 ASSERT_TRUE(VerifyBuffers(audio_buffers, video_buffers, 535 ASSERT_TRUE(VerifyBuffers(buffers, kDefaultBlockInfo, block_count));
548 no_text_buffers, kDefaultBlockInfo,
549 block_count));
550 } 536 }
551 537
552 // Verify that both BlockGroups with the BlockDuration before the Block 538 // Verify that both BlockGroups with the BlockDuration before the Block
553 // and BlockGroups with the BlockDuration after the Block are supported 539 // and BlockGroups with the BlockDuration after the Block are supported
554 // correctly. 540 // correctly.
555 // Note: Raw bytes are use here because ClusterBuilder only generates 541 // Note: Raw bytes are use here because ClusterBuilder only generates
556 // one of these scenarios. 542 // one of these scenarios.
557 TEST_F(WebMClusterParserTest, ParseBlockGroup) { 543 TEST_F(WebMClusterParserTest, ParseBlockGroup) {
558 const BlockInfo kBlockInfo[] = { 544 const BlockInfo kBlockInfo[] = {
559 {kAudioTrackNum, 0, 23, false, NULL, 0, true}, 545 {kAudioTrackNum, 0, 23, false, NULL, 0, true},
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
741 727
742 parser_.reset(CreateParserWithKeyIdsAndAudioCodec( 728 parser_.reset(CreateParserWithKeyIdsAndAudioCodec(
743 std::string(), "video_key_id", kUnknownAudioCodec)); 729 std::string(), "video_key_id", kUnknownAudioCodec));
744 730
745 // The encrypted cluster contains just one block, video. 731 // The encrypted cluster contains just one block, video.
746 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated( 732 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(
747 WebMClusterParser::kDefaultVideoBufferDurationInMs)); 733 WebMClusterParser::kDefaultVideoBufferDurationInMs));
748 734
749 int result = parser_->Parse(cluster->data(), cluster->size()); 735 int result = parser_->Parse(cluster->data(), cluster->size());
750 EXPECT_EQ(cluster->size(), result); 736 EXPECT_EQ(cluster->size(), result);
751 ASSERT_EQ(1UL, parser_->GetVideoBuffers().size()); 737 StreamParser::BufferQueueMap buffers;
752 scoped_refptr<StreamParserBuffer> buffer = parser_->GetVideoBuffers()[0]; 738 parser_->GetBuffers(&buffers);
739 EXPECT_EQ(1UL, buffers[kVideoTrackNum].size());
740 scoped_refptr<StreamParserBuffer> buffer = buffers[kVideoTrackNum][0];
753 VerifyEncryptedBuffer(buffer); 741 VerifyEncryptedBuffer(buffer);
754 } 742 }
755 743
756 TEST_F(WebMClusterParserTest, ParseBadEncryptedBlock) { 744 TEST_F(WebMClusterParserTest, ParseBadEncryptedBlock) {
757 std::unique_ptr<Cluster> cluster( 745 std::unique_ptr<Cluster> cluster(
758 CreateEncryptedCluster(sizeof(kEncryptedFrame) - 1)); 746 CreateEncryptedCluster(sizeof(kEncryptedFrame) - 1));
759 747
760 parser_.reset(CreateParserWithKeyIdsAndAudioCodec( 748 parser_.reset(CreateParserWithKeyIdsAndAudioCodec(
761 std::string(), "video_key_id", kUnknownAudioCodec)); 749 std::string(), "video_key_id", kUnknownAudioCodec));
762 int result = parser_->Parse(cluster->data(), cluster->size()); 750 int result = parser_->Parse(cluster->data(), cluster->size());
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
872 860
873 // Send slightly less than the first full cluster so all but the last video 861 // Send slightly less than the first full cluster so all but the last video
874 // block is parsed. Verify the last fully parsed audio and video buffer are 862 // block is parsed. Verify the last fully parsed audio and video buffer are
875 // both missing from the result (parser should hold them aside for duration 863 // both missing from the result (parser should hold them aside for duration
876 // estimation prior to end of cluster detection in the absence of 864 // estimation prior to end of cluster detection in the absence of
877 // DefaultDurations.) 865 // DefaultDurations.)
878 int result = parser_->Parse(cluster1->data(), cluster1->size() - 1); 866 int result = parser_->Parse(cluster1->data(), cluster1->size() - 1);
879 EXPECT_GT(result, 0); 867 EXPECT_GT(result, 0);
880 EXPECT_LT(result, cluster1->size()); 868 EXPECT_LT(result, cluster1->size());
881 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1 - 3)); 869 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1 - 3));
882 EXPECT_EQ(3UL, parser_->GetAudioBuffers().size()); 870 StreamParser::BufferQueueMap buffers;
883 EXPECT_EQ(1UL, parser_->GetVideoBuffers().size()); 871 parser_->GetBuffers(&buffers);
872 EXPECT_EQ(3UL, buffers[kAudioTrackNum].size());
873 EXPECT_EQ(1UL, buffers[kVideoTrackNum].size());
884 874
885 parser_->Reset(); 875 parser_->Reset();
886 876
887 // Now parse the full first cluster and verify all the blocks are parsed. 877 // Now parse the full first cluster and verify all the blocks are parsed.
888 EXPECT_MEDIA_LOG( 878 EXPECT_MEDIA_LOG(
889 WebMSimpleBlockDurationEstimated(kExpectedAudioEstimationInMs)); 879 WebMSimpleBlockDurationEstimated(kExpectedAudioEstimationInMs));
890 EXPECT_MEDIA_LOG( 880 EXPECT_MEDIA_LOG(
891 WebMSimpleBlockDurationEstimated(kExpectedVideoEstimationInMs)); 881 WebMSimpleBlockDurationEstimated(kExpectedVideoEstimationInMs));
892 result = parser_->Parse(cluster1->data(), cluster1->size()); 882 result = parser_->Parse(cluster1->data(), cluster1->size());
893 EXPECT_EQ(cluster1->size(), result); 883 EXPECT_EQ(cluster1->size(), result);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
944 934
945 // Send slightly less than the first full cluster so all but the last video 935 // Send slightly less than the first full cluster so all but the last video
946 // block is parsed. Verify the last fully parsed audio and video buffer are 936 // block is parsed. Verify the last fully parsed audio and video buffer are
947 // both missing from the result (parser should hold them aside for duration 937 // both missing from the result (parser should hold them aside for duration
948 // estimation prior to end of cluster detection in the absence of 938 // estimation prior to end of cluster detection in the absence of
949 // DefaultDurations.) 939 // DefaultDurations.)
950 int result = parser_->Parse(cluster1->data(), cluster1->size() - 1); 940 int result = parser_->Parse(cluster1->data(), cluster1->size() - 1);
951 EXPECT_GT(result, 0); 941 EXPECT_GT(result, 0);
952 EXPECT_LT(result, cluster1->size()); 942 EXPECT_LT(result, cluster1->size());
953 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1 - 3)); 943 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo1, block_count1 - 3));
954 EXPECT_EQ(3UL, parser_->GetAudioBuffers().size()); 944 StreamParser::BufferQueueMap buffers;
955 EXPECT_EQ(1UL, parser_->GetVideoBuffers().size()); 945 parser_->GetBuffers(&buffers);
946 EXPECT_EQ(3UL, buffers[kAudioTrackNum].size());
947 EXPECT_EQ(1UL, buffers[kVideoTrackNum].size());
956 948
957 parser_->Reset(); 949 parser_->Reset();
958 950
959 // Now parse the full first cluster and verify all the blocks are parsed. 951 // Now parse the full first cluster and verify all the blocks are parsed.
960 EXPECT_MEDIA_LOG( 952 EXPECT_MEDIA_LOG(
961 WebMSimpleBlockDurationEstimated(kExpectedAudioEstimationInMs)); 953 WebMSimpleBlockDurationEstimated(kExpectedAudioEstimationInMs));
962 EXPECT_MEDIA_LOG( 954 EXPECT_MEDIA_LOG(
963 WebMSimpleBlockDurationEstimated(kExpectedVideoEstimationInMs)); 955 WebMSimpleBlockDurationEstimated(kExpectedVideoEstimationInMs));
964 result = parser_->Parse(cluster1->data(), cluster1->size()); 956 result = parser_->Parse(cluster1->data(), cluster1->size());
965 EXPECT_EQ(cluster1->size(), result); 957 EXPECT_EQ(cluster1->size(), result);
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1180 int block_count = arraysize(kBlockInfo); 1172 int block_count = arraysize(kBlockInfo);
1181 std::unique_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count)); 1173 std::unique_ptr<Cluster> cluster(CreateCluster(0, kBlockInfo, block_count));
1182 int result = parser_->Parse(cluster->data(), cluster->size()); 1174 int result = parser_->Parse(cluster->data(), cluster->size());
1183 EXPECT_EQ(cluster->size(), result); 1175 EXPECT_EQ(cluster->size(), result);
1184 1176
1185 // Will verify that duration of buffer matches that of BlockDuration. 1177 // Will verify that duration of buffer matches that of BlockDuration.
1186 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count)); 1178 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count));
1187 } 1179 }
1188 1180
1189 } // namespace media 1181 } // namespace media
OLDNEW
« no previous file with comments | « media/formats/webm/webm_cluster_parser.cc ('k') | media/formats/webm/webm_stream_parser.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698