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

Unified Diff: content/common/gpu/media/h264_parser_unittest.cc

Issue 10834071: Add unittest for H264BitReader. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Use FileEnumerator with explicit namespace. 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/common/gpu/media/h264_parser.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/common/gpu/media/h264_parser_unittest.cc
diff --git a/content/common/gpu/media/h264_parser_unittest.cc b/content/common/gpu/media/h264_parser_unittest.cc
index 53d1b3565223c92d1f21aa5634f6c2d0cd9dc3a0..c188bcbdb4aeaa15af4714e6d7f890a16fed5469 100644
--- a/content/common/gpu/media/h264_parser_unittest.cc
+++ b/content/common/gpu/media/h264_parser_unittest.cc
@@ -72,6 +72,216 @@ TEST(H264ParserTest, StreamFileParsing) {
}
}
+TEST(H264ParserTest, MultiStreamFileParsing) {
+ const FilePath::CharType* test_stream_dir =
+ FILE_PATH_LITERAL("content/common/gpu/testdata/");
+ file_util::FileEnumerator files(FilePath(test_stream_dir), false,
+ file_util::FileEnumerator::FILES,
+ FILE_PATH_LITERAL("*.h264"));
+
+ for (FilePath file = files.Next(); !file.empty(); file = files.Next()) {
+ file_util::MemoryMappedFile stream;
+ CHECK(stream.Initialize(file)) << "Couldn't open stream file: "
+ << file.value();
+ DVLOG(1) << "Parsing file: " << file.value();
+
+ H264Parser parser;
+ parser.SetStream(stream.data(), stream.length());
+
+ // Parse until the end of stream/unsupported stream/error in stream is
+ // found.
+ while (true) {
+ content::H264SliceHeader shdr;
+ content::H264SEIMessage sei_msg;
+ H264NALU nalu;
+ H264Parser::Result res = parser.AdvanceToNextNALU(&nalu);
+ if (res == H264Parser::kEOStream)
+ break;
+ ASSERT_EQ(res, H264Parser::kOk);
+
+ int id;
+ switch (nalu.nal_unit_type) {
+ case H264NALU::kIDRSlice:
+ case H264NALU::kNonIDRSlice:
+ ASSERT_EQ(parser.ParseSliceHeader(nalu, &shdr), H264Parser::kOk);
+ break;
+
+ case H264NALU::kSPS:
+ ASSERT_EQ(parser.ParseSPS(&id), H264Parser::kOk);
+ break;
+
+ case H264NALU::kPPS:
+ ASSERT_EQ(parser.ParsePPS(&id), H264Parser::kOk);
+ break;
+
+ case H264NALU::kSEIMessage:
+ ASSERT_EQ(parser.ParseSEI(&sei_msg), H264Parser::kOk);
+ break;
+
+ default:
+ // Skip unsupported NALU.
+ DVLOG(4) << "Skipping unsupported NALU";
+ break;
+ }
+ }
+ }
+}
+
+class H264BitReaderTest : public ::testing::Test {
+ public:
+ H264BitReaderTest() {}
+ ~H264BitReaderTest() {}
Ami GONE FROM CHROMIUM 2012/07/30 23:32:32 These two aren't adding value. In fact I don't ac
xiaomings 2012/07/30 23:59:34 Removed. On 2012/07/30 23:32:32, Ami Fischman wro
+
+ bool Initialize(const uint8* data, off_t size) {
+ return reader_.Initialize(data, size);
+ }
+
+ bool ReadBits(int num_bits, int *out) {
+ return reader_.ReadBits(num_bits, out);
+ }
+
+ off_t NumBitsLeft() {
+ return reader_.NumBitsLeft();
+ }
+
+ bool HasMoreRBSPData() {
+ return reader_.HasMoreRBSPData();
+ }
+
+ private:
+ H264Parser::H264BitReader reader_;
+};
+
+TEST_F(H264BitReaderTest, ReadStreamWithoutEscapeAndTrailingZeroBytes) {
+ const unsigned char rbsp[] = {0x01, 0x23, 0x45, 0x67, 0x89, 0xa0};
+ int dummy = 0;
+
+ EXPECT_TRUE(Initialize(rbsp, sizeof(rbsp)));
+
+ EXPECT_TRUE(ReadBits(1, &dummy));
+ EXPECT_EQ(dummy, 0x00);
+ EXPECT_EQ(NumBitsLeft(), 47);
+ EXPECT_TRUE(HasMoreRBSPData());
+
+ EXPECT_TRUE(ReadBits(8, &dummy));
+ EXPECT_EQ(dummy, 0x02);
+ EXPECT_EQ(NumBitsLeft(), 39);
+ EXPECT_TRUE(HasMoreRBSPData());
+
+ EXPECT_TRUE(ReadBits(31, &dummy));
+ EXPECT_EQ(dummy, 0x23456789);
+ EXPECT_EQ(NumBitsLeft(), 8);
+ EXPECT_TRUE(HasMoreRBSPData());
+
+ EXPECT_TRUE(ReadBits(1, &dummy));
+ EXPECT_EQ(dummy, 1);
+ EXPECT_EQ(NumBitsLeft(), 7);
+ EXPECT_TRUE(HasMoreRBSPData());
+
+ EXPECT_TRUE(ReadBits(1, &dummy));
+ EXPECT_EQ(dummy, 0);
+ EXPECT_EQ(NumBitsLeft(), 6);
+ EXPECT_FALSE(HasMoreRBSPData());
+}
+
+TEST_F(H264BitReaderTest, EmptyStream) {
+ const unsigned char rbsp[] = {0x80, 0x00, 0x00};
+
+ EXPECT_FALSE(Initialize(rbsp, 0));
+ EXPECT_FALSE(Initialize(rbsp, 1));
+ EXPECT_FALSE(Initialize(rbsp, sizeof(rbsp)));
+}
+
+TEST_F(H264BitReaderTest, SingleByteStream) {
+ const unsigned char rbsp[] = {0x18};
+ int dummy = 0;
+
+ EXPECT_TRUE(Initialize(rbsp, sizeof(rbsp)));
+ EXPECT_EQ(NumBitsLeft(), 8);
+ EXPECT_TRUE(HasMoreRBSPData());
+
+ EXPECT_TRUE(ReadBits(4, &dummy));
+ EXPECT_EQ(dummy, 0x01);
+ EXPECT_EQ(NumBitsLeft(), 4);
+ EXPECT_FALSE(HasMoreRBSPData());
+}
+
+TEST_F(H264BitReaderTest, StopBitOccupyFullByte) {
+ const unsigned char rbsp[] = {0xab, 0x80};
+ int dummy = 0;
+
+ EXPECT_TRUE(Initialize(rbsp, sizeof(rbsp)));
+ EXPECT_EQ(NumBitsLeft(), 16);
+ EXPECT_TRUE(HasMoreRBSPData());
+
+ EXPECT_TRUE(ReadBits(8, &dummy));
+ EXPECT_EQ(dummy, 0xab);
+ EXPECT_EQ(NumBitsLeft(), 8);
+ EXPECT_FALSE(HasMoreRBSPData());
+}
+
+TEST_F(H264BitReaderTest, ReadFailure) {
+ const unsigned char rbsp[] = {0x18};
+ int dummy = 0;
+
+ EXPECT_TRUE(Initialize(rbsp, 1));
+ EXPECT_FALSE(ReadBits(5, &dummy));
+}
+
+TEST_F(H264BitReaderTest, MalformedStream) {
+ const unsigned char rbsp[] = {0x00, 0x00, 0x03, 0x00, 0x00};
+
+ EXPECT_FALSE(Initialize(rbsp, 1));
+ EXPECT_FALSE(Initialize(rbsp, sizeof(rbsp)));
+}
+
+TEST_F(H264BitReaderTest, EscapeSequence) {
+ const unsigned char rbsp[] =
+ {0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x03};
+ int dummy = 0;
+
+ EXPECT_TRUE(Initialize(rbsp, sizeof(rbsp)));
+
+ EXPECT_TRUE(ReadBits(8, &dummy));
+ EXPECT_EQ(dummy, 0x00);
+ EXPECT_EQ(NumBitsLeft(), 80);
+ EXPECT_TRUE(HasMoreRBSPData());
+
+ EXPECT_TRUE(ReadBits(24, &dummy));
+ EXPECT_EQ(dummy, 0x00);
+ EXPECT_EQ(NumBitsLeft(), 48);
+ EXPECT_TRUE(HasMoreRBSPData());
+
+ EXPECT_TRUE(ReadBits(15, &dummy));
+ EXPECT_EQ(dummy, 0x01);
+ EXPECT_EQ(NumBitsLeft(), 25);
+ EXPECT_FALSE(HasMoreRBSPData());
+}
+
+TEST_F(H264BitReaderTest, NonEscapeFollowedByStopBit) {
+ const unsigned char rbsp[] = {0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00};
+ int dummy = 0;
+
+ EXPECT_TRUE(Initialize(rbsp, sizeof(rbsp)));
+ EXPECT_TRUE(ReadBits(23, &dummy));
+ EXPECT_EQ(dummy, 0x03);
+ EXPECT_EQ(NumBitsLeft(), 33);
+ EXPECT_FALSE(HasMoreRBSPData());
+}
+
+TEST_F(H264BitReaderTest, TrailingZero) {
+ const unsigned char rbsp[] = {0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00};
+ int dummy = 0;
+
+ EXPECT_TRUE(Initialize(rbsp, sizeof(rbsp)));
+ EXPECT_TRUE(ReadBits(8, &dummy));
+ EXPECT_EQ(dummy, 0x01);
+ EXPECT_TRUE(HasMoreRBSPData());
+ EXPECT_TRUE(ReadBits(15, &dummy));
+ EXPECT_EQ(dummy, 0x01);
+ EXPECT_FALSE(HasMoreRBSPData());
+}
+
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
CommandLine::Init(argc, argv);
@@ -91,4 +301,3 @@ int main(int argc, char **argv) {
return RUN_ALL_TESTS();
}
-
« no previous file with comments | « content/common/gpu/media/h264_parser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698