static inline int packetize(bool marker, const uint8_t *buf, size_t len, size_t maxlen, uint64_t rtp_ts, videnc_packet_h *pkth, void *arg) { int err = 0; if (len <= maxlen) { err = pkth(marker, rtp_ts, NULL, 0, buf, len, arg); } else { struct h265_nal nal; uint8_t fu_hdr[3]; const size_t flen = maxlen - sizeof(fu_hdr); err = h265_nal_decode(&nal, buf); if (err) { warning("h265: encode: could not decode" " NAL of %zu bytes (%m)\n", len, err); return err; } h265_nal_encode(fu_hdr, H265_NAL_FU, nal.nuh_temporal_id_plus1); fu_hdr[2] = 1<<7 | nal.nal_unit_type; buf+=2; len-=2; while (len > flen) { err |= pkth(false, rtp_ts, fu_hdr, 3, buf, flen, arg); buf += flen; len -= flen; fu_hdr[2] &= ~(1 << 7); /* clear Start bit */ } fu_hdr[2] |= 1<<6; /* set END bit */ err |= pkth(marker, rtp_ts, fu_hdr, 3, buf, len, arg); } return err; }
static int h263_packetize(struct videnc_state *st, struct mbuf *mb, videnc_packet_h *pkth, void *arg) { struct h263_strm h263_strm; struct h263_hdr h263_hdr; size_t pos; int err; /* Decode bit-stream header, used by packetizer */ err = h263_strm_decode(&h263_strm, mb); if (err) return err; h263_hdr_copy_strm(&h263_hdr, &h263_strm); st->mb_frag->pos = st->mb_frag->end = 0; err = h263_hdr_encode(&h263_hdr, st->mb_frag); pos = st->mb_frag->pos; /* Assemble frame into smaller packets */ while (!err) { size_t sz, left = mbuf_get_left(mb); bool last = (left < st->encprm.pktsize); if (!left) break; sz = last ? left : st->encprm.pktsize; st->mb_frag->pos = st->mb_frag->end = pos; err = mbuf_write_mem(st->mb_frag, mbuf_buf(mb), sz); if (err) break; st->mb_frag->pos = 0; err = pkth(last, NULL, 0, mbuf_buf(st->mb_frag), mbuf_get_left(st->mb_frag), arg); mbuf_advance(mb, sz); } return err; }
static int general_packetize(struct mbuf *mb, size_t pktsize, videnc_packet_h *pkth, void *arg) { int err = 0; /* Assemble frame into smaller packets */ while (!err) { size_t sz, left = mbuf_get_left(mb); bool last = (left < pktsize); if (!left) break; sz = last ? left : pktsize; err = pkth(last, NULL, 0, mbuf_buf(mb), sz, arg); mbuf_advance(mb, sz); } return err; }