99 LOGI(
"Starting H264 RTP Encoder");
108 LOGI(
"Stopping H264 RTP Encoder");
119 const char *
mime()
override {
return "video/H264"; }
131 size_t write(
const uint8_t *data,
size_t len)
override {
137 if (offsets.
empty()) {
138 LOGW(
"H264RtpEncoder: no NAL units found in %u byte buffer", (
unsigned)len);
148 size_t nonParamNalCount = 0;
149 for (
size_t i = 0; i < offsets.
size(); i++) {
150 const uint8_t *nal = data + offsets[i];
151 uint8_t type = nal[0] & 0x1F;
154 }
else if (type == 7) {
157 }
else if (type == 8) {
165 size_t totalNals = nonParamNalCount + (injectParams ? 2 : 0);
172 for (
size_t i = 0; i < offsets.
size(); i++) {
173 const uint8_t *nal = data + offsets[i];
174 uint8_t type = nal[0] & 0x1F;
175 if (type == 7 || type == 8)
continue;
176 emitNal(nal, lengths[i], ++nalIndex == totalNals);
203 for (
size_t i = from; i + 2 < len; i++) {
204 if (data[i] == 0 && data[i + 1] == 0 &&
206 (i + 3 < len && data[i + 2] == 0 && data[i + 3] == 1))) {
220 if (
start == len)
break;
222 size_t scSize = (data[
start + 2] == 1) ? 3 : 4;
223 size_t nalStart =
start + scSize;
224 if (nalStart >= len)
break;
227 size_t nalEnd = next;
229 size_t nalLen = nalEnd - nalStart;
241 if (len >= 4 &&
p_format !=
nullptr) {
243 snprintf(hex,
sizeof(hex),
"%02X%02X%02X", nal[1], nal[2], nal[3]);
264 out.reserve(4 * ((len + 2) / 3));
267 uint32_t octetA = i < len ? data[i++] : 0;
268 uint32_t octetB = i < len ? data[i++] : 0;
269 uint32_t octetC = i < len ? data[i++] : 0;
270 uint32_t triple = (octetA << 16) | (octetB << 8) | octetC;
277 for (
int p = 0; p < padding; p++) {
278 out.setCharAt(out.length() - 1 - p,
'=');
290 void emitNal(
const uint8_t *nal,
size_t nalLen,
bool isLastOfFrame) {
291 if (nalLen == 0)
return;
299 uint8_t nalHeader = nal[0];
300 uint8_t nalType = nalHeader & 0x1F;
301 uint8_t nri = nalHeader & 0x60;
304 LOGE(
"H264RtpEncoder: maxFragmentSize too small for FU-A fragmentation");
311 while (pos < nalLen) {
312 size_t chunk = nalLen - pos;
313 if (chunk > maxPayload) chunk = maxPayload;
314 bool end = (pos + chunk >= nalLen);
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define LOGE(...)
Definition AudioLoggerIDF.h:30