From: Jaroslav Kysela Date: Mon, 24 Nov 2014 17:08:54 +0000 (+0100) Subject: transcode: h264 - merge the meta data to output packet X-Git-Tag: v4.1~690 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bb07ead99b104d5e5007d2f5271062bdc21f1940;p=thirdparty%2Ftvheadend.git transcode: h264 - merge the meta data to output packet --- diff --git a/src/plumbing/transcoding.c b/src/plumbing/transcoding.c index e9f5428aa..e455e42fd 100644 --- a/src/plumbing/transcoding.c +++ b/src/plumbing/transcoding.c @@ -51,6 +51,7 @@ typedef struct transcoder_stream { streaming_component_type_t ts_type; streaming_target_t *ts_target; LIST_ENTRY(transcoder_stream) ts_link; + int ts_first; void (*ts_handle_pkt) (struct transcoder *, struct transcoder_stream *, th_pkt_t *); void (*ts_destroy) (struct transcoder *, struct transcoder_stream *); @@ -861,7 +862,15 @@ send_video_packet(transcoder_t *t, transcoder_stream_t *ts, th_pkt_t *pkt, if (!octx->coded_frame) return; - n = pkt_alloc(epkt->data, epkt->size, epkt->pts, epkt->dts); + if (ts->ts_type == SCT_H264 && octx->extradata_size && + (ts->ts_first || octx->coded_frame->pict_type == AV_PICTURE_TYPE_I)) { + n = pkt_alloc(NULL, octx->extradata_size + epkt->size, epkt->pts, epkt->dts); + memcpy(pktbuf_ptr(n->pkt_payload), octx->extradata, octx->extradata_size); + memcpy(pktbuf_ptr(n->pkt_payload) + octx->extradata_size, epkt->data, epkt->size); + ts->ts_first = 0; + } else { + n = pkt_alloc(epkt->data, epkt->size, epkt->pts, epkt->dts); + } switch (octx->coded_frame->pict_type) { case AV_PICTURE_TYPE_I: