xref: /aosp_15_r20/external/webrtc/common_video/h264/h264_common.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef COMMON_VIDEO_H264_H264_COMMON_H_
12*d9f75844SAndroid Build Coastguard Worker #define COMMON_VIDEO_H264_H264_COMMON_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <stddef.h>
15*d9f75844SAndroid Build Coastguard Worker #include <stdint.h>
16*d9f75844SAndroid Build Coastguard Worker 
17*d9f75844SAndroid Build Coastguard Worker #include <vector>
18*d9f75844SAndroid Build Coastguard Worker 
19*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/buffer.h"
20*d9f75844SAndroid Build Coastguard Worker 
21*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
22*d9f75844SAndroid Build Coastguard Worker 
23*d9f75844SAndroid Build Coastguard Worker namespace H264 {
24*d9f75844SAndroid Build Coastguard Worker // The size of a full NALU start sequence {0 0 0 1}, used for the first NALU
25*d9f75844SAndroid Build Coastguard Worker // of an access unit, and for SPS and PPS blocks.
26*d9f75844SAndroid Build Coastguard Worker const size_t kNaluLongStartSequenceSize = 4;
27*d9f75844SAndroid Build Coastguard Worker 
28*d9f75844SAndroid Build Coastguard Worker // The size of a shortened NALU start sequence {0 0 1}, that may be used if
29*d9f75844SAndroid Build Coastguard Worker // not the first NALU of an access unit or an SPS or PPS block.
30*d9f75844SAndroid Build Coastguard Worker const size_t kNaluShortStartSequenceSize = 3;
31*d9f75844SAndroid Build Coastguard Worker 
32*d9f75844SAndroid Build Coastguard Worker // The size of the NALU type byte (1).
33*d9f75844SAndroid Build Coastguard Worker const size_t kNaluTypeSize = 1;
34*d9f75844SAndroid Build Coastguard Worker 
35*d9f75844SAndroid Build Coastguard Worker enum NaluType : uint8_t {
36*d9f75844SAndroid Build Coastguard Worker   kSlice = 1,
37*d9f75844SAndroid Build Coastguard Worker   kIdr = 5,
38*d9f75844SAndroid Build Coastguard Worker   kSei = 6,
39*d9f75844SAndroid Build Coastguard Worker   kSps = 7,
40*d9f75844SAndroid Build Coastguard Worker   kPps = 8,
41*d9f75844SAndroid Build Coastguard Worker   kAud = 9,
42*d9f75844SAndroid Build Coastguard Worker   kEndOfSequence = 10,
43*d9f75844SAndroid Build Coastguard Worker   kEndOfStream = 11,
44*d9f75844SAndroid Build Coastguard Worker   kFiller = 12,
45*d9f75844SAndroid Build Coastguard Worker   kPrefix = 14,
46*d9f75844SAndroid Build Coastguard Worker   kStapA = 24,
47*d9f75844SAndroid Build Coastguard Worker   kFuA = 28
48*d9f75844SAndroid Build Coastguard Worker };
49*d9f75844SAndroid Build Coastguard Worker 
50*d9f75844SAndroid Build Coastguard Worker enum SliceType : uint8_t { kP = 0, kB = 1, kI = 2, kSp = 3, kSi = 4 };
51*d9f75844SAndroid Build Coastguard Worker 
52*d9f75844SAndroid Build Coastguard Worker struct NaluIndex {
53*d9f75844SAndroid Build Coastguard Worker   // Start index of NALU, including start sequence.
54*d9f75844SAndroid Build Coastguard Worker   size_t start_offset;
55*d9f75844SAndroid Build Coastguard Worker   // Start index of NALU payload, typically type header.
56*d9f75844SAndroid Build Coastguard Worker   size_t payload_start_offset;
57*d9f75844SAndroid Build Coastguard Worker   // Length of NALU payload, in bytes, counting from payload_start_offset.
58*d9f75844SAndroid Build Coastguard Worker   size_t payload_size;
59*d9f75844SAndroid Build Coastguard Worker };
60*d9f75844SAndroid Build Coastguard Worker 
61*d9f75844SAndroid Build Coastguard Worker // Returns a vector of the NALU indices in the given buffer.
62*d9f75844SAndroid Build Coastguard Worker std::vector<NaluIndex> FindNaluIndices(const uint8_t* buffer,
63*d9f75844SAndroid Build Coastguard Worker                                        size_t buffer_size);
64*d9f75844SAndroid Build Coastguard Worker 
65*d9f75844SAndroid Build Coastguard Worker // Get the NAL type from the header byte immediately following start sequence.
66*d9f75844SAndroid Build Coastguard Worker NaluType ParseNaluType(uint8_t data);
67*d9f75844SAndroid Build Coastguard Worker 
68*d9f75844SAndroid Build Coastguard Worker // Methods for parsing and writing RBSP. See section 7.4.1 of the H264 spec.
69*d9f75844SAndroid Build Coastguard Worker //
70*d9f75844SAndroid Build Coastguard Worker // The following sequences are illegal, and need to be escaped when encoding:
71*d9f75844SAndroid Build Coastguard Worker // 00 00 00 -> 00 00 03 00
72*d9f75844SAndroid Build Coastguard Worker // 00 00 01 -> 00 00 03 01
73*d9f75844SAndroid Build Coastguard Worker // 00 00 02 -> 00 00 03 02
74*d9f75844SAndroid Build Coastguard Worker // And things in the source that look like the emulation byte pattern (00 00 03)
75*d9f75844SAndroid Build Coastguard Worker // need to have an extra emulation byte added, so it's removed when decoding:
76*d9f75844SAndroid Build Coastguard Worker // 00 00 03 -> 00 00 03 03
77*d9f75844SAndroid Build Coastguard Worker //
78*d9f75844SAndroid Build Coastguard Worker // Decoding is simply a matter of finding any 00 00 03 sequence and removing
79*d9f75844SAndroid Build Coastguard Worker // the 03 emulation byte.
80*d9f75844SAndroid Build Coastguard Worker 
81*d9f75844SAndroid Build Coastguard Worker // Parse the given data and remove any emulation byte escaping.
82*d9f75844SAndroid Build Coastguard Worker std::vector<uint8_t> ParseRbsp(const uint8_t* data, size_t length);
83*d9f75844SAndroid Build Coastguard Worker 
84*d9f75844SAndroid Build Coastguard Worker // Write the given data to the destination buffer, inserting and emulation
85*d9f75844SAndroid Build Coastguard Worker // bytes in order to escape any data the could be interpreted as a start
86*d9f75844SAndroid Build Coastguard Worker // sequence.
87*d9f75844SAndroid Build Coastguard Worker void WriteRbsp(const uint8_t* bytes, size_t length, rtc::Buffer* destination);
88*d9f75844SAndroid Build Coastguard Worker }  // namespace H264
89*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
90*d9f75844SAndroid Build Coastguard Worker 
91*d9f75844SAndroid Build Coastguard Worker #endif  // COMMON_VIDEO_H264_H264_COMMON_H_
92