SmolRTSP 0.2.0
A small, portable, extensible RTSP 1.0 implementation in C99
Loading...
Searching...
No Matches
nal.h
Go to the documentation of this file.
1
8#pragma once
9
10#include <stdbool.h>
11#include <stdint.h>
12
13#include <datatype99.h>
14#include <slice99.h>
15
16#include <smolrtsp/priv/compiler_attrs.h>
17
18#if !defined(SMOLRTSP_WITH_H264) && !defined(SMOLRTSP_WITH_H265) && \
19 !defined(SMOLRTSP_WITH_H266)
20#error "smolrtsp: at least one NAL codec must be enabled at build time."
21#endif
22
23#ifdef SMOLRTSP_WITH_H264
24#include <smolrtsp/nal/h264.h>
25#endif
26#ifdef SMOLRTSP_WITH_H265
27#include <smolrtsp/nal/h265.h>
28#endif
29#ifdef SMOLRTSP_WITH_H266
30#include <smolrtsp/nal/h266.h>
31#endif
32
41// clang-format off
42// `datatype99` is variadic but its variant list cannot contain preprocessor
43// directives, so the (up to 2**3 - 1 = 7) live combinations are enumerated.
44#if defined(SMOLRTSP_WITH_H264) && defined(SMOLRTSP_WITH_H265) && defined(SMOLRTSP_WITH_H266)
46 SmolRTSP_NalHeader,
47 (SmolRTSP_NalHeader_H264, SmolRTSP_H264NalHeader),
48 (SmolRTSP_NalHeader_H265, SmolRTSP_H265NalHeader),
49 (SmolRTSP_NalHeader_H266, SmolRTSP_H266NalHeader)
50);
51#elif defined(SMOLRTSP_WITH_H264) && defined(SMOLRTSP_WITH_H265)
53 SmolRTSP_NalHeader,
54 (SmolRTSP_NalHeader_H264, SmolRTSP_H264NalHeader),
55 (SmolRTSP_NalHeader_H265, SmolRTSP_H265NalHeader)
56);
57#elif defined(SMOLRTSP_WITH_H264) && defined(SMOLRTSP_WITH_H266)
59 SmolRTSP_NalHeader,
60 (SmolRTSP_NalHeader_H264, SmolRTSP_H264NalHeader),
61 (SmolRTSP_NalHeader_H266, SmolRTSP_H266NalHeader)
62);
63#elif defined(SMOLRTSP_WITH_H265) && defined(SMOLRTSP_WITH_H266)
65 SmolRTSP_NalHeader,
66 (SmolRTSP_NalHeader_H265, SmolRTSP_H265NalHeader),
67 (SmolRTSP_NalHeader_H266, SmolRTSP_H266NalHeader)
68);
69#elif defined(SMOLRTSP_WITH_H264)
71 SmolRTSP_NalHeader,
72 (SmolRTSP_NalHeader_H264, SmolRTSP_H264NalHeader)
73);
74#elif defined(SMOLRTSP_WITH_H265)
76 SmolRTSP_NalHeader,
77 (SmolRTSP_NalHeader_H265, SmolRTSP_H265NalHeader)
78);
79#elif defined(SMOLRTSP_WITH_H266)
81 SmolRTSP_NalHeader,
82 (SmolRTSP_NalHeader_H266, SmolRTSP_H266NalHeader)
83);
84#endif
85// clang-format on
86
90uint8_t
91SmolRTSP_NalHeader_unit_type(SmolRTSP_NalHeader self) SMOLRTSP_PRIV_MUST_USE;
92
96size_t SmolRTSP_NalHeader_size(SmolRTSP_NalHeader self) SMOLRTSP_PRIV_MUST_USE;
97
106size_t
107SmolRTSP_NalHeader_fu_size(SmolRTSP_NalHeader self) SMOLRTSP_PRIV_MUST_USE;
108
112bool SmolRTSP_NalHeader_is_vps(SmolRTSP_NalHeader self) SMOLRTSP_PRIV_MUST_USE;
113
117bool SmolRTSP_NalHeader_is_sps(SmolRTSP_NalHeader self) SMOLRTSP_PRIV_MUST_USE;
118
122bool SmolRTSP_NalHeader_is_pps(SmolRTSP_NalHeader self) SMOLRTSP_PRIV_MUST_USE;
123
127bool SmolRTSP_NalHeader_is_coded_slice_idr(SmolRTSP_NalHeader self)
128 SMOLRTSP_PRIV_MUST_USE;
129
133bool SmolRTSP_NalHeader_is_coded_slice_non_idr(SmolRTSP_NalHeader self)
134 SMOLRTSP_PRIV_MUST_USE;
135
144 SmolRTSP_NalHeader self, uint8_t buffer[restrict]);
145
161 SmolRTSP_NalHeader self, uint8_t buffer[restrict], bool is_first_fragment,
162 bool is_last_fragment);
163
167typedef struct {
171 SmolRTSP_NalHeader header;
172
176 U8Slice99 payload;
178
183 bool is_first_fragment, bool is_last_fragment,
184 uint8_t unit_type) SMOLRTSP_PRIV_MUST_USE;
185
195typedef size_t (*SmolRTSP_NalStartCodeTester)(U8Slice99 data);
196
209smolrtsp_determine_start_code(U8Slice99 data) SMOLRTSP_PRIV_MUST_USE;
210
214size_t smolrtsp_test_start_code_3b(U8Slice99 data);
215
219size_t smolrtsp_test_start_code_4b(U8Slice99 data);
H.264 NAL representation.
H.265 NAL representation.
H.266 / VVC NAL representation.
bool SmolRTSP_NalHeader_is_coded_slice_idr(SmolRTSP_NalHeader self) SMOLRTSP_PRIV_MUST_USE
Checks whether self is a coded slice IDR.
uint8_t SmolRTSP_NalHeader_unit_type(SmolRTSP_NalHeader self) SMOLRTSP_PRIV_MUST_USE
A generic NAL header.
SmolRTSP_NalStartCodeTester smolrtsp_determine_start_code(U8Slice99 data) SMOLRTSP_PRIV_MUST_USE
Returns a start code tester for data.
size_t SmolRTSP_NalHeader_fu_size(SmolRTSP_NalHeader self) SMOLRTSP_PRIV_MUST_USE
Computes the size of a fragmentation unit (FU) header self.
size_t SmolRTSP_NalHeader_size(SmolRTSP_NalHeader self) SMOLRTSP_PRIV_MUST_USE
Computes the size of self in bytes.
size_t(* SmolRTSP_NalStartCodeTester)(U8Slice99 data)
A function that tests whether data starts with some start code.
Definition nal.h:195
void SmolRTSP_NalHeader_write_fu_header(SmolRTSP_NalHeader self, uint8_t buffer[restrict], bool is_first_fragment, bool is_last_fragment)
Writes a FU header of self to buffer.
bool SmolRTSP_NalHeader_is_sps(SmolRTSP_NalHeader self) SMOLRTSP_PRIV_MUST_USE
Checks whether self is SPS.
void SmolRTSP_NalHeader_serialize(SmolRTSP_NalHeader self, uint8_t buffer[restrict])
Writes the binary representation of self into buffer.
uint8_t smolrtsp_nal_fu_header(bool is_first_fragment, bool is_last_fragment, uint8_t unit_type) SMOLRTSP_PRIV_MUST_USE
Creates a generic NAL FU header.
bool SmolRTSP_NalHeader_is_vps(SmolRTSP_NalHeader self) SMOLRTSP_PRIV_MUST_USE
Checks whether self is VPS.
bool SmolRTSP_NalHeader_is_pps(SmolRTSP_NalHeader self) SMOLRTSP_PRIV_MUST_USE
Checks whether self is PPS.
size_t smolrtsp_test_start_code_3b(U8Slice99 data)
The 3-byte start code tester (0x000001).
size_t smolrtsp_test_start_code_4b(U8Slice99 data)
The 3-byte start code tester (0x00000001).
bool SmolRTSP_NalHeader_is_coded_slice_non_idr(SmolRTSP_NalHeader self) SMOLRTSP_PRIV_MUST_USE
Checks whether self is a coded slice non-IDR.
datatype99(SmolRTSP_RtpTimestamp,(SmolRTSP_RtpTimestamp_Raw, uint32_t),(SmolRTSP_RtpTimestamp_SysClockUs, uint64_t))
An RTP timestamp.
An H.264 NAL header.
Definition h264.h:34
An H.265 NAL header.
Definition h265.h:33
An H.266 NAL header (RFC 9328 §1.1.4 / VVC spec §7.3.1.2).
Definition h266.h:43
A generic NAL unit (H.264, H.265, or H.266 / VVC).
Definition nal.h:167
SmolRTSP_NalHeader header
The header of this NAL unit.
Definition nal.h:171
U8Slice99 payload
The payload data of this NAL unit (not including the header).
Definition nal.h:176