44 int last_packet_of_frame = 0;
46 const uint8_t *obu_ptr = frame_buf;
47 int start_new_packet = 0;
48 unsigned int num_obus = 0;
50 uint8_t *pkt_ptr =
NULL;
52 const uint8_t *curr_obu_ptr =
NULL;
53 uint32_t curr_elem_size = 0;
54 int curr_obu_hdr = -1;
55 int curr_obu_ext = -1;
56 const uint8_t *last_obu_ptr =
NULL;
57 uint32_t last_elem_size = 0;
58 int last_obu_hdr = -1;
59 int last_obu_ext = -1;
88#if RTPENC_AV1_SEARCH_SEQ_HEADER
98 const uint8_t *buf_ptr = frame_buf;
99 while (rem_size > 0) {
101 uint8_t obu_hdr = *buf_ptr++;
115 num_lebs =
parse_leb(
ctx, buf_ptr, rem_size, &obu_size);
120 rem_size -= num_lebs;
123 if (obu_size > (uint32_t) rem_size) {
127 rem_size -= obu_size;
135 pkt_ptr = rtp_ctx->
buf + 1;
137#ifdef RTPENC_AV1_VERBOSE_TRACE
148 uint8_t obu_hdr = *obu_ptr++;
162 ext_byte = *obu_ptr++;
185 if (obu_size > 0xfffffffd) {
201 last_packet_of_frame = 1;
202 goto flush_last_packet;
209 if ((last_obu_ext >= 0) && (curr_obu_ext != last_obu_ext)) {
210 start_new_packet = 1;
214 last_obu_ptr = curr_obu_ptr;
215 last_elem_size = curr_elem_size;
216 last_obu_hdr = curr_obu_hdr;
217 last_obu_ext = curr_obu_ext;
219 curr_obu_ptr = obu_ptr;
220 curr_elem_size = obu_size + 1 + ((ext_byte >= 0) ? 1 : 0);
221 curr_obu_hdr = obu_hdr;
222 curr_obu_ext = ext_byte;
227 unsigned int first_elem_with_size = last_elem_size +
calc_leb_size(last_elem_size);
230 if (!last_packet_of_frame && (first_elem_with_size + 10 < rem_pkt_size)) {
231 num_lebs =
write_leb(pkt_ptr, last_elem_size);
233 rem_pkt_size -= num_lebs;
235 if ((num_obus >= 3) && (last_packet_of_frame || (first_elem_with_size <= rem_pkt_size))) {
237 num_lebs =
write_leb(pkt_ptr, last_elem_size);
239 rem_pkt_size -= num_lebs;
242 start_new_packet = 1;
246 if (last_obu_hdr >= 0) {
247 *pkt_ptr++ = last_obu_hdr;
250 if (last_obu_ext >= 0) {
251 *pkt_ptr++ = last_obu_ext;
257 memcpy(pkt_ptr, last_obu_ptr, last_elem_size);
258 pkt_ptr += last_elem_size;
259 rem_pkt_size -= last_elem_size;
263 if (start_new_packet || last_packet_of_frame) {
267 rtp_ctx->
buf[0] = aggr_hdr;
269#ifdef RTPENC_AV1_VERBOSE_TRACE
281 pkt_ptr = rtp_ctx->
buf + 1;
286 if (last_packet_of_frame) {
292 if ((curr_elem_size > rem_pkt_size) ||
293 ((num_obus >= 3) && (curr_elem_size +
calc_leb_size(curr_elem_size)) > rem_pkt_size)) {
294 uint32_t frag_size = rem_pkt_size;
301 frag_size -= num_lebs;
307 rem_pkt_size -= num_lebs;
311 *pkt_ptr++ = curr_obu_hdr;
314 if (curr_obu_ext >= 0) {
315 *pkt_ptr++ = curr_obu_ext;
327 memcpy(pkt_ptr, curr_obu_ptr, rem_pkt_size);
328 pkt_ptr += rem_pkt_size;
329 curr_obu_ptr += rem_pkt_size;
330 curr_elem_size -= rem_pkt_size;
337 rtp_ctx->
buf[0] = aggr_hdr;
339#ifdef RTPENC_AV1_VERBOSE_TRACE
350 pkt_ptr = rtp_ctx->
buf + 1;
354 }
while (curr_elem_size > rem_pkt_size);
355 start_new_packet = 0;
360 last_packet_of_frame = 1;
361 goto flush_last_packet;
void av_hex_dump_log(void *avcl, int level, const uint8_t *buf, int size)
Send a nice hexadecimal dump of a buffer to the log.
static unsigned int parse_leb(void *logctx, const uint8_t *buf_ptr, uint32_t buffer_size, uint32_t *obu_size)
securely parse LEB bytes and return the resulting encoded length
static void write_leb_n(uint8_t *lebptr, uint32_t length, unsigned int num_lebs)
write out fixed number of LEB bytes (may have "unused" bytes)