| Index: webrtc/common_video/h264/h264_common.h
|
| diff --git a/webrtc/common_video/h264/h264_common.h b/webrtc/common_video/h264/h264_common.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c5cbd55d15d6421a0d53544cadef521f4c8ad9a2
|
| --- /dev/null
|
| +++ b/webrtc/common_video/h264/h264_common.h
|
| @@ -0,0 +1,89 @@
|
| +/*
|
| + * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
| + *
|
| + * Use of this source code is governed by a BSD-style license
|
| + * that can be found in the LICENSE file in the root of the source
|
| + * tree. An additional intellectual property rights grant can be found
|
| + * in the file PATENTS. All contributing project authors may
|
| + * be found in the AUTHORS file in the root of the source tree.
|
| + */
|
| +
|
| +#ifndef WEBRTC_COMMON_VIDEO_H264_H264_COMMON_H_
|
| +#define WEBRTC_COMMON_VIDEO_H264_H264_COMMON_H_
|
| +
|
| +#include <memory>
|
| +#include <vector>
|
| +
|
| +#include "webrtc/base/common.h"
|
| +#include "webrtc/base/buffer.h"
|
| +
|
| +namespace webrtc {
|
| +
|
| +namespace H264 {
|
| +// The size of a full NALU start sequence {0 0 0 1}, used for the first NALU
|
| +// of an access unit, and for SPS and PPS blocks.
|
| +const size_t kNaluLongStartSequenceSize = 4;
|
| +
|
| +// The size of a shortened NALU start sequence {0 0 1}, that may be used if
|
| +// not the first NALU of an access unit or an SPS or PPS block.
|
| +const size_t kNaluShortStartSequenceSize = 3;
|
| +
|
| +// The size of the NALU type byte (1).
|
| +const size_t kNaluTypeSize = 1;
|
| +
|
| +enum NaluType : uint8_t {
|
| + kSlice = 1,
|
| + kIdr = 5,
|
| + kSei = 6,
|
| + kSps = 7,
|
| + kPps = 8,
|
| + kAud = 9,
|
| + kEndOfSequence = 10,
|
| + kEndOfStream = 11,
|
| + kFiller = 12,
|
| + kStapA = 24,
|
| + kFuA = 28
|
| +};
|
| +
|
| +enum SliceType : uint8_t { kP = 0, kB = 1, kI = 2, kSp = 3, kSi = 4 };
|
| +
|
| +struct NaluIndex {
|
| + // Start index of NALU, including start sequence.
|
| + size_t start_offset;
|
| + // Start index of NALU payload, typically type header.
|
| + size_t payload_start_offset;
|
| + // Length of NALU payload, in bytes, counting from payload_start_offset.
|
| + size_t payload_size;
|
| +};
|
| +
|
| +// Returns a vector of the NALU indices in the given buffer.
|
| +std::vector<NaluIndex> FindNaluIndices(const uint8_t* buffer,
|
| + size_t buffer_size);
|
| +
|
| +// Get the NAL type from the header byte immediately following start sequence.
|
| +NaluType ParseNaluType(uint8_t data);
|
| +
|
| +// Methods for parsing and writing RBSP. See section 7.4.1 of the H264 spec.
|
| +//
|
| +// The following sequences are illegal, and need to be escaped when encoding:
|
| +// 00 00 00 -> 00 00 03 00
|
| +// 00 00 01 -> 00 00 03 01
|
| +// 00 00 02 -> 00 00 03 02
|
| +// And things in the source that look like the emulation byte pattern (00 00 03)
|
| +// need to have an extra emulation byte added, so it's removed when decoding:
|
| +// 00 00 03 -> 00 00 03 03
|
| +//
|
| +// Decoding is simply a matter of finding any 00 00 03 sequence and removing
|
| +// the 03 emulation byte.
|
| +
|
| +// Parse the given data and remove any emulation byte escaping.
|
| +std::unique_ptr<rtc::Buffer> ParseRbsp(const uint8_t* data, size_t length);
|
| +
|
| +// Write the given data to the destination buffer, inserting and emulation
|
| +// bytes in order to escape any data the could be interpreted as a start
|
| +// sequence.
|
| +void WriteRbsp(const uint8_t* bytes, size_t length, rtc::Buffer* destination);
|
| +} // namespace H264
|
| +} // namespace webrtc
|
| +
|
| +#endif // WEBRTC_COMMON_VIDEO_H264_H264_COMMON_H_
|
|
|