Shaka Packager SDK
Loading...
Searching...
No Matches
nalu_reader.h
1// Copyright 2016 Google LLC. All rights reserved.
2//
3// Use of this source code is governed by a BSD-style
4// license that can be found in the LICENSE file or at
5// https://developers.google.com/open-source/licenses/bsd
6
7#ifndef PACKAGER_MEDIA_CODECS_NALU_READER_H_
8#define PACKAGER_MEDIA_CODECS_NALU_READER_H_
9
10#include <cstdint>
11#include <cstdlib>
12
13#include <packager/macros/classes.h>
14#include <packager/media/base/decrypt_config.h>
15
16namespace shaka {
17namespace media {
18
19// Used as the |nalu_length_size| argument to NaluReader to indicate to use
20// AnnexB byte streams. An AnnexB byte stream starts with 3 or 4 byte start
21// codes instead of a fixed size NAL unit length.
22const uint8_t kIsAnnexbByteStream = 0;
23
26class Nalu {
27 public:
28 enum H264NaluType {
29 H264_Unspecified = 0,
30 H264_NonIDRSlice = 1,
31 H264_IDRSlice = 5,
32 H264_SEIMessage = 6,
33 H264_SPS = 7,
34 H264_PPS = 8,
35 H264_AUD = 9,
36 H264_EOSeq = 10,
37 H264_FillerData = 12,
38 H264_SPSExtension = 13,
39 H264_PrefixNALUnit = 14,
40 H264_SubsetSPS = 15,
41 H264_DepthParameterSet = 16,
42 H264_Reserved17 = 17,
43 H264_Reserved18 = 18,
44 H264_CodedSliceExtension = 20,
45 H264_Reserved22 = 22,
46 };
47 enum H265NaluType {
48 H265_TRAIL_N = 0,
49 H265_TRAIL_R = 1,
50 H265_TSA_N = 2,
51 H265_TSA_R = 3,
52 H265_STSA_N = 4,
53 H265_STSA_R = 5,
54 H265_RASL_R = 9,
55
56 H265_RSV_VCL_N10 = 10,
57 H265_RSV_VCL_R15 = 15,
58
59 H265_BLA_W_LP = 16,
60 H265_IDR_W_RADL = 19,
61 H265_IDR_N_LP = 20,
62 H265_CRA_NUT = 21,
63
64 H265_RSV_IRAP_VCL22 = 22,
65 H265_RSV_IRAP_VCL23 = 23,
66 H265_RSV_VCL31 = 31,
67
68 H265_VPS = 32,
69 H265_SPS = 33,
70 H265_PPS = 34,
71 H265_AUD = 35,
72
73 H265_EOS = 36,
74 H265_EOB = 37,
75 H265_FD = 38,
76
77 H265_PREFIX_SEI = 39,
78
79 H265_RSV_NVCL41 = 41,
80 H265_RSV_NVCL44 = 44,
81 H265_UNSPEC48 = 48,
82 H265_UNSPEC55 = 55,
83 };
84 enum CodecType {
85 kH264,
86 kH265,
87 };
88
89 Nalu();
90
91 [[nodiscard]] bool Initialize(CodecType type,
92 const uint8_t* data,
93 uint64_t size);
94
96 const uint8_t* data() const { return data_; }
97
99 uint64_t header_size() const { return header_size_; }
101 uint64_t payload_size() const { return payload_size_; }
102
103 // H.264 Specific:
104 int ref_idc() const { return ref_idc_; }
105
106 // H.265 Specific:
107 int nuh_layer_id() const { return nuh_layer_id_; }
108 int nuh_temporal_id() const { return nuh_temporal_id_; }
109
112 int type() const { return type_; }
113 bool is_aud() const { return is_aud_; }
114 bool is_vcl() const { return is_vcl_; }
116 bool is_video_slice() const { return is_video_slice_; }
117 bool can_start_access_unit() const { return can_start_access_unit_; }
118
119 private:
120 bool InitializeFromH264(const uint8_t* data, uint64_t size);
121 bool InitializeFromH265(const uint8_t* data, uint64_t size);
122
123 // A pointer to the NALU (i.e. points to the header). This pointer is not
124 // owned by this instance.
125 const uint8_t* data_ = nullptr;
126 // NALU header size (e.g. 1 byte for H.264). Note that it does not include
127 // header extension data in some NAL units.
128 uint64_t header_size_ = 0;
129 // Size of data after the header.
130 uint64_t payload_size_ = 0;
131
132 int ref_idc_ = 0;
133 int nuh_layer_id_ = 0;
134 int nuh_temporal_id_ = 0;
135 int type_ = 0;
136 bool is_aud_ = false;
137 bool is_vcl_ = false;
138 bool is_video_slice_ = false;
139 bool can_start_access_unit_ = false;
140
141 // Don't use DISALLOW_COPY_AND_ASSIGN since it is just numbers and a pointer
142 // it does not own. This allows Nalus to be stored in a vector.
143};
144
149 public:
150 enum Result {
151 kOk,
152 kInvalidStream, // error in stream
153 kEOStream, // end of stream
154 };
155
159 NaluReader(Nalu::CodecType type,
160 uint8_t nal_length_size,
161 const uint8_t* stream,
162 uint64_t stream_size);
163
174 NaluReader(Nalu::CodecType type,
175 uint8_t nal_length_size,
176 const uint8_t* stream,
177 uint64_t stream_size,
178 const std::vector<SubsampleEntry>& subsamples);
179 ~NaluReader();
180
181 // Find offset from start of data to next NALU start code
182 // and size of found start code (3 or 4 bytes).
183 // If no start code is found, offset is pointing to the first unprocessed byte
184 // (i.e. the first byte that was not considered as a possible start of a start
185 // code) and |*start_code_size| is set to 0.
186 // Postconditions:
187 // - |*offset| is between 0 and |data_size| included.
188 // It is strictly less than |data_size| if |data_size| > 0.
189 // - |*start_code_size| is either 0, 3 or 4.
190 static bool FindStartCode(const uint8_t* data,
191 uint64_t data_size,
192 uint64_t* offset,
193 uint8_t* start_code_size);
194
203 static bool FindStartCodeInClearRange(
204 const uint8_t* data,
205 uint64_t data_size,
206 uint64_t* offset,
207 uint8_t* start_code_size,
208 const std::vector<SubsampleEntry>& subsamples);
209
215 Result Advance(Nalu* nalu);
216
218 bool StartsWithStartCode();
219
220 private:
221 enum Format {
222 kAnnexbByteStreamFormat,
223 kNalUnitStreamFormat
224 };
225
226 // Move the stream pointer to the beginning of the next NALU,
227 // i.e. pointing at the next start code.
228 // Return true if a NALU has been found.
229 // If a NALU is found:
230 // - its size in bytes is returned in |*nalu_size| and includes
231 // the start code as well as the trailing zero bits.
232 // - the size in bytes of the start code is returned in |*start_code_size|.
233 bool LocateNaluByStartCode(uint64_t* nalu_size, uint8_t* start_code_size);
234
235 // Pointer to the current NALU in the stream.
236 const uint8_t* stream_;
237 // The remaining size of the stream.
238 uint64_t stream_size_;
239 // The type of NALU being read.
240 Nalu::CodecType nalu_type_;
241 // The number of bytes the prefix length is; only valid if format is
242 // kAnnexbByteStreamFormat.
243 uint8_t nalu_length_size_;
244 // The format of the stream.
245 Format format_;
246
247 // subsamples left in stream_.
248 std::vector<SubsampleEntry> subsamples_;
249
250 DISALLOW_COPY_AND_ASSIGN(NaluReader);
251};
252
253} // namespace media
254} // namespace shaka
255
256#endif // PACKAGER_MEDIA_CODECS_NALU_READER_H_
static bool FindStartCodeInClearRange(const uint8_t *data, uint64_t data_size, uint64_t *offset, uint8_t *start_code_size, const std::vector< SubsampleEntry > &subsamples)
Result Advance(Nalu *nalu)
bool is_video_slice() const
Slice data partition NALs are not considered as slice NALs.
uint64_t header_size() const
The size of the header, e.g. 1 for H.264.
Definition nalu_reader.h:99
const uint8_t * data() const
This is the pointer to the Nalu data, pointing to the header.
Definition nalu_reader.h:96
uint64_t payload_size() const
Size of this Nalu minus header_size().
All the methods that are virtual are virtual for mocking.