OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/command_line.h" | |
6 #include "base/files/memory_mapped_file.h" | 5 #include "base/files/memory_mapped_file.h" |
7 #include "base/logging.h" | 6 #include "base/logging.h" |
8 #include "base/strings/string_number_conversions.h" | |
9 #include "base/sys_byteorder.h" | |
10 #include "media/base/test_data_util.h" | 7 #include "media/base/test_data_util.h" |
| 8 #include "media/filters/ivf_parser.h" |
11 #include "media/filters/vp8_parser.h" | 9 #include "media/filters/vp8_parser.h" |
12 #include "testing/gtest/include/gtest/gtest.h" | 10 #include "testing/gtest/include/gtest/gtest.h" |
13 | 11 |
14 namespace media { | 12 namespace media { |
15 | 13 |
16 TEST(Vp8ParserTest, StreamFileParsing) { | 14 TEST(Vp8ParserTest, StreamFileParsing) { |
17 base::FilePath file_path = GetTestDataFilePath("test-25fps.vp8"); | 15 base::FilePath file_path = GetTestDataFilePath("test-25fps.vp8"); |
18 // Number of frames in the test stream to be parsed. | |
19 const int num_frames = 250; | |
20 | |
21 base::MemoryMappedFile stream; | 16 base::MemoryMappedFile stream; |
22 ASSERT_TRUE(stream.Initialize(file_path)) | 17 ASSERT_TRUE(stream.Initialize(file_path)) |
23 << "Couldn't open stream file: " << file_path.MaybeAsASCII(); | 18 << "Couldn't open stream file: " << file_path.MaybeAsASCII(); |
24 | 19 |
25 Vp8Parser parser; | 20 IvfParser ivf_parser; |
| 21 IvfFileHeader ivf_file_header = {}; |
| 22 ASSERT_TRUE( |
| 23 ivf_parser.Initialize(stream.data(), stream.length(), &ivf_file_header)); |
| 24 ASSERT_EQ(ivf_file_header.fourcc, 0x30385056u); // VP80 |
| 25 |
| 26 Vp8Parser vp8_parser; |
| 27 IvfFrameHeader ivf_frame_header = {}; |
| 28 size_t num_parsed_frames = 0; |
26 | 29 |
27 // Parse until the end of stream/unsupported stream/error in stream is found. | 30 // Parse until the end of stream/unsupported stream/error in stream is found. |
28 int num_parsed_frames = 0; | 31 const uint8_t* payload = nullptr; |
29 const uint8_t* stream_ptr = stream.data(); | 32 while (ivf_parser.ParseNextFrame(&ivf_frame_header, &payload)) { |
30 size_t bytes_left = stream.length(); | 33 Vp8FrameHeader fhdr; |
31 // Skip IVF file header. | |
32 const size_t kIvfStreamHeaderLen = 32; | |
33 CHECK_GE(bytes_left, kIvfStreamHeaderLen); | |
34 stream_ptr += kIvfStreamHeaderLen; | |
35 bytes_left -= kIvfStreamHeaderLen; | |
36 | 34 |
37 const size_t kIvfFrameHeaderLen = 12; | 35 ASSERT_TRUE( |
38 while (bytes_left > kIvfFrameHeaderLen) { | 36 vp8_parser.ParseFrame(payload, ivf_frame_header.frame_size, &fhdr)); |
39 Vp8FrameHeader fhdr; | |
40 uint32_t frame_size = | |
41 base::ByteSwapToLE32(*reinterpret_cast<const uint32_t*>(stream_ptr)); | |
42 // Skip IVF frame header. | |
43 stream_ptr += kIvfFrameHeaderLen; | |
44 bytes_left -= kIvfFrameHeaderLen; | |
45 | 37 |
46 ASSERT_TRUE(parser.ParseFrame(stream_ptr, frame_size, &fhdr)); | |
47 | |
48 stream_ptr += frame_size; | |
49 bytes_left -= frame_size; | |
50 ++num_parsed_frames; | 38 ++num_parsed_frames; |
51 } | 39 } |
52 | 40 |
53 DVLOG(1) << "Number of successfully parsed frames before EOS: " | 41 DVLOG(1) << "Number of successfully parsed frames before EOS: " |
54 << num_parsed_frames; | 42 << num_parsed_frames; |
55 | 43 |
56 EXPECT_EQ(num_frames, num_parsed_frames); | 44 EXPECT_EQ(ivf_file_header.num_frames, num_parsed_frames); |
57 } | 45 } |
58 | 46 |
59 } // namespace media | 47 } // namespace media |
OLD | NEW |