40 #define RTPENC_AV1_SEARCH_SEQ_HEADER 1
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) {
120 rem_size -= num_lebs;
123 if (obu_size > (uint32_t) rem_size) {
127 rem_size -= obu_size;
129 #else // RTPENC_AV1_SEARCH_SEQ_HEADER
132 #endif // RTPENC_AV1_SEARCH_SEQ_HEADER
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;