H264 parser: add the rest of frame (after 01Ex start code), fixes#2482
This commit is contained in:
parent
1a622c1b67
commit
3081776240
3 changed files with 29 additions and 10 deletions
11
src/packet.c
11
src/packet.c
|
@ -205,3 +205,14 @@ pktbuf_make(void *data, size_t size)
|
|||
pb->pb_data = data;
|
||||
return pb;
|
||||
}
|
||||
|
||||
pktbuf_t *
|
||||
pktbuf_append(pktbuf_t *pb, const void *data, size_t size)
|
||||
{
|
||||
if (pb == NULL)
|
||||
return pktbuf_alloc(data, size);
|
||||
pb->pb_data = realloc(pb->pb_data, pb->pb_size + size);
|
||||
memcpy(pb->pb_data + pb->pb_size, data, size);
|
||||
pb->pb_size += size;
|
||||
return pb;
|
||||
}
|
||||
|
|
|
@ -113,6 +113,8 @@ pktbuf_t *pktbuf_alloc(const void *data, size_t size);
|
|||
|
||||
pktbuf_t *pktbuf_make(void *data, size_t size);
|
||||
|
||||
pktbuf_t *pktbuf_append(pktbuf_t *pb, const void *data, size_t size);
|
||||
|
||||
static inline size_t pktbuf_len(pktbuf_t *pb) { return pb->pb_size; }
|
||||
static inline uint8_t *pktbuf_ptr(pktbuf_t *pb) { return pb->pb_data; }
|
||||
|
||||
|
|
|
@ -1159,10 +1159,23 @@ parse_h264(service_t *t, elementary_stream_t *st, size_t len,
|
|||
|
||||
if(sc >= 0x000001e0 && sc <= 0x000001ef) {
|
||||
/* System start codes for video */
|
||||
if(len >= 9){
|
||||
if(len >= 9) {
|
||||
uint16_t plen = buf[4] << 8 | buf[5];
|
||||
if(plen >= 0xffe9) st->es_incomplete =1;
|
||||
parse_pes_header(t, st, buf + 6, len - 6);
|
||||
th_pkt_t *pkt = st->es_curpkt;
|
||||
if(plen >= 0xffe9) st->es_incomplete = 1;
|
||||
l2 = parse_pes_header(t, st, buf + 6, len - 6);
|
||||
|
||||
if (pkt) {
|
||||
if (l2 + 1 <= len - 6) {
|
||||
/* This is the rest of this frame. */
|
||||
/* Do not include trailing zero. */
|
||||
pkt->pkt_payload = pktbuf_append(pkt->pkt_payload, buf + 6 + l2, len - 6 - l2 - 1);
|
||||
}
|
||||
|
||||
parser_deliver(t, st, pkt, st->es_buf.sb_err);
|
||||
|
||||
st->es_curpkt = NULL;
|
||||
}
|
||||
}
|
||||
st->es_prevdts = st->es_curdts;
|
||||
return 1;
|
||||
|
@ -1250,13 +1263,6 @@ parse_h264(service_t *t, elementary_stream_t *st, size_t len,
|
|||
st->es_buf.sb_ptr - 4);
|
||||
sbuf_steal_data(&st->es_buf);
|
||||
}
|
||||
|
||||
parser_deliver(t, st, pkt, st->es_buf.sb_err);
|
||||
|
||||
st->es_curpkt = NULL;
|
||||
|
||||
st->es_curdts = PTS_UNSET;
|
||||
st->es_curpts = PTS_UNSET;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue