diff --git a/src/packet.c b/src/packet.c index 3dd617de..bbab7c92 100644 --- a/src/packet.c +++ b/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; +} diff --git a/src/packet.h b/src/packet.h index b5c2bcad..cf5a0f1e 100644 --- a/src/packet.h +++ b/src/packet.h @@ -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; } diff --git a/src/parsers/parsers.c b/src/parsers/parsers.c index a637941a..d088414c 100644 --- a/src/parsers/parsers.c +++ b/src/parsers/parsers.c @@ -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; }