diff options
author | kcwu <kcwu@chromium.org> | 2015-08-10 05:00:12 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-08-10 12:00:50 +0000 |
commit | 0cc8eab5c0edb6438345dd1cb8483373923c3951 (patch) | |
tree | 29344101775cf3ec4491dbd956901719b4715fc4 /media | |
parent | 931ac45fdae7fa148a2768aac6332a65c61d9697 (diff) | |
download | chromium_src-0cc8eab5c0edb6438345dd1cb8483373923c3951.zip chromium_src-0cc8eab5c0edb6438345dd1cb8483373923c3951.tar.gz chromium_src-0cc8eab5c0edb6438345dd1cb8483373923c3951.tar.bz2 |
Add VP9 raw bits reader
TEST=media_unittests
BUG=509500
Review URL: https://codereview.chromium.org/1258083003
Cr-Commit-Position: refs/heads/master@{#342607}
Diffstat (limited to 'media')
-rw-r--r-- | media/BUILD.gn | 3 | ||||
-rw-r--r-- | media/filters/vp9_raw_bits_reader.cc | 49 | ||||
-rw-r--r-- | media/filters/vp9_raw_bits_reader.h | 62 | ||||
-rw-r--r-- | media/filters/vp9_raw_bits_reader_unittest.cc | 66 | ||||
-rw-r--r-- | media/media.gyp | 3 |
5 files changed, 183 insertions, 0 deletions
diff --git a/media/BUILD.gn b/media/BUILD.gn index 6861395..310cf4c 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn @@ -220,6 +220,8 @@ component("media") { "filters/vp8_bool_decoder.h", "filters/vp8_parser.cc", "filters/vp8_parser.h", + "filters/vp9_raw_bits_reader.cc", + "filters/vp9_raw_bits_reader.h", "filters/webvtt_util.h", "filters/wsola_internals.cc", "filters/wsola_internals.h", @@ -570,6 +572,7 @@ test("media_unittests") { "filters/video_renderer_algorithm_unittest.cc", "filters/vp8_bool_decoder_unittest.cc", "filters/vp8_parser_unittest.cc", + "filters/vp9_raw_bits_reader_unittest.cc", "formats/common/offset_byte_queue_unittest.cc", "formats/webm/cluster_builder.cc", "formats/webm/cluster_builder.h", diff --git a/media/filters/vp9_raw_bits_reader.cc b/media/filters/vp9_raw_bits_reader.cc new file mode 100644 index 0000000..47014fd --- /dev/null +++ b/media/filters/vp9_raw_bits_reader.cc @@ -0,0 +1,49 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/filters/vp9_raw_bits_reader.h" + +#include <limits.h> + +#include "base/logging.h" +#include "media/base/bit_reader.h" + +namespace media { + +Vp9RawBitsReader::Vp9RawBitsReader() : valid_(true) {} + +Vp9RawBitsReader::~Vp9RawBitsReader() {} + +void Vp9RawBitsReader::Initialize(const uint8_t* data, size_t size) { + DCHECK(data); + reader_.reset(new BitReader(data, size)); + valid_ = true; +} + +int Vp9RawBitsReader::ReadBit() { + DCHECK(reader_); + int value = 0; + valid_ = valid_ && reader_->ReadBits(1, &value); + return value; +} + +int Vp9RawBitsReader::ReadLiteral(int bits) { + DCHECK(reader_); + int value = 0; + DCHECK_LT(static_cast<size_t>(bits), sizeof(value) * 8); + valid_ = valid_ && reader_->ReadBits(bits, &value); + return value; +} + +int Vp9RawBitsReader::ReadSignedLiteral(int bits) { + int value = ReadLiteral(bits); + return ReadBit() ? -value : value; +} + +size_t Vp9RawBitsReader::GetBytesRead() const { + DCHECK(reader_); + return (reader_->bits_read() + 7) / 8; +} + +} // namespace media diff --git a/media/filters/vp9_raw_bits_reader.h b/media/filters/vp9_raw_bits_reader.h new file mode 100644 index 0000000..38f54a3 --- /dev/null +++ b/media/filters/vp9_raw_bits_reader.h @@ -0,0 +1,62 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_FILTERS_VP9_RAW_BITS_READER_ +#define MEDIA_FILTERS_VP9_RAW_BITS_READER_ + +#include <stddef.h> +#include <stdint.h> + +#include "base/macros.h" +#include "base/memory/scoped_ptr.h" +#include "media/base/media_export.h" + +namespace media { + +class BitReader; + +// A class to read raw bits stream. See VP9 spec, "RAW-BITS DECODING" section +// for detail. +class MEDIA_EXPORT Vp9RawBitsReader { + public: + Vp9RawBitsReader(); + ~Vp9RawBitsReader(); + + // |data| is the input buffer with |size| bytes. + void Initialize(const uint8_t* data, size_t size); + + // Returns true if none of the reads since the last Initialize() call has + // gone beyond the end of available data. + bool IsValid() const { return valid_; } + + // Returns how many bytes were read since the last Initialize() call. + // Partial bytes will be counted as one byte. For example, it will return 1 + // if 3 bits were read. + size_t GetBytesRead() const; + + // Reads one bit. + // If the read goes beyond the end of buffer, the return value is undefined. + int ReadBit(); + + // Reads a literal with |bits| bits. + // If the read goes beyond the end of buffer, the return value is undefined. + int ReadLiteral(int bits); + + // Reads a signed literal with |bits| bits (not including the sign bit). + // If the read goes beyond the end of buffer, the return value is undefined. + int ReadSignedLiteral(int bits); + + private: + scoped_ptr<BitReader> reader_; + + // Indicates if none of the reads since the last Initialize() call has gone + // beyond the end of available data. + bool valid_; + + DISALLOW_COPY_AND_ASSIGN(Vp9RawBitsReader); +}; + +} // namespace media + +#endif // MEDIA_FILTERS_VP9_RAW_BITS_READER_ diff --git a/media/filters/vp9_raw_bits_reader_unittest.cc b/media/filters/vp9_raw_bits_reader_unittest.cc new file mode 100644 index 0000000..d798f22 --- /dev/null +++ b/media/filters/vp9_raw_bits_reader_unittest.cc @@ -0,0 +1,66 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/filters/vp9_raw_bits_reader.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace media { + +TEST(Vp9RawBitsReaderTest, ReadBit) { + uint8_t data[] = {0xf1}; + Vp9RawBitsReader reader; + reader.Initialize(data, 1); + + EXPECT_TRUE(reader.IsValid()); + EXPECT_EQ(0u, reader.GetBytesRead()); + EXPECT_EQ(1, reader.ReadBit()); + EXPECT_EQ(1u, reader.GetBytesRead()); + EXPECT_EQ(1, reader.ReadBit()); + EXPECT_EQ(1, reader.ReadBit()); + EXPECT_EQ(1, reader.ReadBit()); + EXPECT_EQ(0, reader.ReadBit()); + EXPECT_EQ(0, reader.ReadBit()); + EXPECT_EQ(0, reader.ReadBit()); + EXPECT_EQ(1, reader.ReadBit()); + EXPECT_TRUE(reader.IsValid()); + + // The return value is undefined. + ignore_result(reader.ReadBit()); + EXPECT_FALSE(reader.IsValid()); + EXPECT_EQ(1u, reader.GetBytesRead()); +} + +TEST(Vp9RawBitsReader, ReadLiteral) { + uint8_t data[] = {0x3d, 0x67, 0x9a}; + Vp9RawBitsReader reader; + reader.Initialize(data, 3); + + EXPECT_TRUE(reader.IsValid()); + EXPECT_EQ(0x03, reader.ReadLiteral(4)); + EXPECT_EQ(0xd679, reader.ReadLiteral(16)); + EXPECT_TRUE(reader.IsValid()); + + // The return value is undefined. + ignore_result(reader.ReadLiteral(8)); + EXPECT_FALSE(reader.IsValid()); + EXPECT_EQ(3u, reader.GetBytesRead()); +} + +TEST(Vp9RawBitsReader, ReadSignedLiteral) { + uint8_t data[] = {0x3d, 0x67, 0x9a}; + Vp9RawBitsReader reader; + reader.Initialize(data, 3); + + EXPECT_TRUE(reader.IsValid()); + EXPECT_EQ(-0x03, reader.ReadSignedLiteral(4)); + EXPECT_EQ(-0x5679, reader.ReadSignedLiteral(15)); + EXPECT_TRUE(reader.IsValid()); + + // The return value is undefined. + ignore_result(reader.ReadSignedLiteral(7)); + EXPECT_FALSE(reader.IsValid()); + EXPECT_EQ(3u, reader.GetBytesRead()); +} + +} // namespace media diff --git a/media/media.gyp b/media/media.gyp index a6bfe01..3c53ad2 100644 --- a/media/media.gyp +++ b/media/media.gyp @@ -561,6 +561,8 @@ 'filters/vp8_bool_decoder.h', 'filters/vp8_parser.cc', 'filters/vp8_parser.h', + 'filters/vp9_raw_bits_reader.cc', + 'filters/vp9_raw_bits_reader.h', 'filters/vpx_video_decoder.cc', 'filters/vpx_video_decoder.h', 'filters/webvtt_util.h', @@ -1265,6 +1267,7 @@ 'filters/video_renderer_algorithm_unittest.cc', 'filters/vp8_bool_decoder_unittest.cc', 'filters/vp8_parser_unittest.cc', + 'filters/vp9_raw_bits_reader_unittest.cc', 'capture/webm_muxer_unittest.cc', 'formats/common/offset_byte_queue_unittest.cc', 'formats/webm/cluster_builder.cc', |