static int dec_h263(struct vidcodec_st *st, struct vidframe *frame, bool eof, struct mbuf *src) { struct h263_hdr h263_hdr; int err; if (!src) return 0; err = h263_hdr_decode(&h263_hdr, src); if (err) return err; if (!st->got_keyframe && h263_hdr.i == I_FRAME) st->got_keyframe = true; return ffdecode(st, frame, eof, src); }
int decode_h263(struct viddec_state *st, struct vidframe *frame, bool marker, uint16_t seq, struct mbuf *src) { struct h263_hdr hdr; int err; if (!st || !frame) return EINVAL; if (!src) return 0; (void)seq; err = h263_hdr_decode(&hdr, src); if (err) return err; #if 0 debug(".....[%s seq=%5u ] MODE %s -" " SBIT=%u EBIT=%u I=%s" " (%5u/%5u bytes)\n", marker ? "M" : " ", seq, h263_hdr_mode(&hdr) == H263_MODE_A ? "A" : "B", hdr.sbit, hdr.ebit, hdr.i ? "Inter" : "Intra", mbuf_get_left(src), st->mb->end); #endif if (!hdr.i) st->got_keyframe = true; #if 0 if (st->mb->pos == 0) { uint8_t *p = mbuf_buf(src); if (p[0] != 0x00 || p[1] != 0x00) { warning("invalid PSC detected (%02x %02x)\n", p[0], p[1]); return EPROTO; } } #endif /* * The H.263 Bit-stream can be fragmented on bit-level, * indicated by SBIT and EBIT. Example: * * 8 bit 2 bit * .--------.--. * Packet 1 | | | * SBIT=0 '--------'--' * EBIT=6 * .------.--------.--------. * Packet 2 | | | | * SBIT=2 '------'--------'--------' * EBIT=0 6bit 8bit 8bit * */ if (hdr.sbit > 0) { const uint8_t mask = (1 << (8 - hdr.sbit)) - 1; const uint8_t sbyte = mbuf_read_u8(src) & mask; st->mb->buf[st->mb->end - 1] |= sbyte; } return ffdecode(st, frame, marker, src); }