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

Unified Diff: media/filters/h264_bitstream_buffer.h

Issue 333253002: Add VaapiVideoEncodeAccelerator for HW-accelerated video encode. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 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
Index: media/filters/h264_bitstream_buffer.h
diff --git a/media/filters/h264_bitstream_buffer.h b/media/filters/h264_bitstream_buffer.h
new file mode 100644
index 0000000000000000000000000000000000000000..1f3d74518e6221a5d7c0f48fa432622e60a6f43c
--- /dev/null
+++ b/media/filters/h264_bitstream_buffer.h
@@ -0,0 +1,120 @@
+// Copyright (c) 2014 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.
+//
+// This file contains an implementation of a H264BitstreamBuffer class for
+// constructing raw bitstream buffers containing NAL units in
+// H.264 Annex-B stream format.
+// See H.264 spec Annex B and chapter 7for more details.
+
+#ifndef MEDIA_FILTERS_H264_BITSTREAM_BUFFER_H_
+#define MEDIA_FILTERS_H264_BITSTREAM_BUFFER_H_
+
+#include "base/gtest_prod_util.h"
+#include "base/numerics/safe_conversions.h"
+#include "media/base/video_frame.h"
+#include "media/filters/h264_parser.h"
+
+namespace media {
+
+// Holds one or more NALUs as a raw bitstream buffer in H.264 Annex-B format.
+// Note that this class currently does NOT insert emulation prevention
+// three-byte sequences (spec 7.3.1).
+class MEDIA_EXPORT H264BitstreamBuffer {
+ public:
+ H264BitstreamBuffer();
+ ~H264BitstreamBuffer();
+
+ // Discard all data and reset the buffer for reuse.
+ void Reset();
+
+ // Append |num_bits| bits to the stream from |val|.
+ // |val| is interpreted in the host endianness.
+ template <typename T>
+ void AppendBits(size_t num_bits, T val) {
+ DCHECK_GE(val, 0);
+ AppendU64(num_bits, static_cast<uint64>(val));
+ }
+
+ void AppendBits(size_t num_bits, bool val) {
+ DCHECK_EQ(num_bits, 1);
+ AppendBool(val);
+ }
+
+ // Append a one-bit bool/flag value |val| to the stream.
+ void AppendBool(bool val);
+
+ // Append a signed value in |val| in Exp-Golomb code.
+ void AppendSE(int val);
+
+ // Append an unsigned value in |val| in Exp-Golomb code.
+ void AppendUE(unsigned int val);
+
+ // Start a new NALU of type |nalu_type| and with given |nal_ref_idc|
+ // (see spec). Note, that until FinishNALU() is called, some of the bits
+ // may not be flushed into the buffer and the data will not be correctly
+ // aligned with trailing bits.
+ void BeginNALU(H264NALU::Type nalu_type, int nal_ref_idc);
+
+ // Finish current NALU. This will flush any cached bits and correctly align
+ // the buffer with RBSP trailing bits. This MUST be called for the stream
+ // returned by data() to be correct.
+ void FinishNALU();
+
+ // Return number of full bytes in the stream. Note that FinishNALU() has to
+ // be called to flush cached bits, or the return value will not include them.
+ size_t BytesInBuffer();
+
+ // Return a pointer to the stream. FinishNALU() must be called before
+ // accessing the stream, otherwise some bits may still be cached and not
+ // in the buffer.
+ uint8* data();
+
+ private:
+ FRIEND_TEST_ALL_PREFIXES(H264BitstreamBufferAppendBitsTest,
+ AppendAndVerifyBits);
+
+ // Allocate additional memory (kGrowBytes bytes) for the buffer.
+ void Grow();
+
+ // Append |num_bits| bits from U64 value |val| (in host endianness).
+ void AppendU64(size_t num_bits, uint64 val);
+
+ // Flush any cached bits in the reg with byte granularity, i.e. enough
+ // bytes to flush all pending bits, but not more.
+ void FlushReg();
+
+ typedef uint64 RegType;
+ enum {
+ // Sizes of reg_.
+ kRegByteSize = sizeof(RegType),
+ kRegBitSize = kRegByteSize * 8,
+ // Amount of bytes to grow the buffer by when we run out of
+ // previously-allocated memory for it.
+ kGrowBytes = 4096,
+ };
+
+ COMPILE_ASSERT(kGrowBytes >= kRegByteSize,
+ kGrowBytes_must_be_larger_than_kRegByteSize);
+
+ // Unused bits left in reg_.
+ size_t bits_left_in_reg_;
+
+ // Cache for appended bits. Bits are flushed to data_ with kRegByteSize
+ // granularity, i.e. when reg_ becomes full, or when an explicit FlushReg()
+ // is called.
+ RegType reg_;
+
+ // Current capacity of data_, in bytes.
+ size_t capacity_;
+
+ // Current byte offset in data_ (points to the start of unwritten bits).
+ size_t pos_;
+
+ // Buffer for stream data.
+ uint8* data_;
+};
+
+} // namespace media
+
+#endif // MEDIA_FILTERS_H264_BITSTREAM_BUFFER_H_

Powered by Google App Engine
This is Rietveld 408576698