Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
H264 parser: add the rest of frame (after 01Ex start code), fixes#2482
  • Loading branch information
perexg committed Nov 22, 2014
1 parent 1a622c1 commit 3081776
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 10 deletions.
11 changes: 11 additions & 0 deletions src/packet.c
Expand Up @@ -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;
}
2 changes: 2 additions & 0 deletions src/packet.h
Expand Up @@ -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; }

Expand Down
26 changes: 16 additions & 10 deletions src/parsers/parsers.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down

0 comments on commit 3081776

Please sign in to comment.