libpromeki 1.0.0-alpha
PROfessional MEdia toolKIt
 
Loading...
Searching...
No Matches
h264bitstream.h
Go to the documentation of this file.
1
8#pragma once
9
10
11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
13#include <cstdint>
14#include <functional>
15#include <promeki/function.h>
16#include <promeki/namespace.h>
17#include <promeki/buffer.h>
18#include <promeki/bufferview.h>
19#include <promeki/error.h>
20#include <promeki/list.h>
21
22PROMEKI_NAMESPACE_BEGIN
23
73class H264Bitstream {
74 public:
86 struct NalUnit {
87 BufferView view;
88 uint8_t header0 = 0;
89 uint8_t header1 = 0;
90 };
91
98 using Visitor = Function<Error(const NalUnit &)>;
99
117 static Error forEachAnnexBNal(const BufferView &in, const Visitor &visit);
118
135 static Error forEachAvccNal(const BufferView &in, uint8_t lenSize, const Visitor &visit);
136
158 static Error annexBToAvcc(const BufferView &in, uint8_t lenSize, Buffer &outBuf);
159
186 static Error annexBToAvccFiltered(const BufferView &in, uint8_t lenSize,
187 const Function<bool(const NalUnit &)> &keep,
188 Buffer &outBuf);
189
204 static Error avccToAnnexB(const BufferView &in, uint8_t lenSize, Buffer &outBuf);
205
223 static Error wrapNalsAsAnnexB(const List<BufferView> &nals, Buffer &outBuf);
224
239 struct SpsInfo {
240 uint32_t width = 0;
241 uint32_t height = 0;
242 uint8_t chromaFormatIdc = 1;
243 uint8_t bitDepthLumaMinus8 = 0;
244 uint8_t bitDepthChromaMinus8 = 0;
245 };
246
274 static Error parseSpsResolution(const BufferView &sps, SpsInfo &out);
275};
276
320struct AvcDecoderConfig {
321 uint8_t configurationVersion = 1;
322 uint8_t avcProfileIndication = 0;
323 uint8_t profileCompatibility = 0;
324 uint8_t avcLevelIndication = 0;
325 uint8_t lengthSizeMinusOne = 3;
326 List<Buffer> sps;
327 List<Buffer> pps;
328
352 static Error fromAnnexB(const BufferView &au, AvcDecoderConfig &out);
353
364 static Error parse(const BufferView &payload, AvcDecoderConfig &out);
365
376 Error serialize(Buffer &outBuf) const;
377
386 Error toAnnexB(Buffer &outBuf) const;
387
398 static bool isIdrAnnexB(const BufferView &au);
399};
400
401PROMEKI_NAMESPACE_END
402
403#endif // PROMEKI_ENABLE_PROAV