diff mbox

[FFmpeg-devel,V2] avcodec/h264_mp4toannexb_bsf: add No IDR frame situation

Message ID A93F7808634B604198C3BDC4BF73E5BC18D4D4@shsmsx102.ccr.corp.intel.com
State New
Headers show

Commit Message

Fu, Linjie Aug. 23, 2018, 8:17 a.m. UTC
-----Original Message-----
From: Fu, Linjie 
Sent: Thursday, August 16, 2018 15:08
To: ffmpeg-devel@ffmpeg.org
Cc: Fu, Linjie <linjie.fu@intel.com>
Subject: [PATCH V2] avcodec/h264_mp4toannexb_bsf: add No IDR frame situation

Fix the live stream encoding problem using qsv when the first frame is not an IDR frame.

Add the extradata information when the IDR frame is missing in the first GOP.

Fix the bug reported in  ticket #6418.

[PATCH V2] Fix the coding style.

Signed-off-by: Linjie Fu <linjie.fu@intel.com>
---
 libavcodec/h264_mp4toannexb_bsf.c | 8 ++++++++
 1 file changed, 8 insertions(+)

--
2.17.1

Ping.
diff mbox

Patch

diff --git a/libavcodec/h264_mp4toannexb_bsf.c b/libavcodec/h264_mp4toannexb_bsf.c
index 794c82e650..fbb9f1fe20 100644
--- a/libavcodec/h264_mp4toannexb_bsf.c
+++ b/libavcodec/h264_mp4toannexb_bsf.c
@@ -33,6 +33,7 @@  typedef struct H264BSFContext {
     int32_t  pps_offset;
     uint8_t  length_size;
     uint8_t  new_idr;
+    uint8_t  new_nal_slice;
     uint8_t  idr_sps_seen;
     uint8_t  idr_pps_seen;
     int      extradata_parsed;
@@ -243,6 +244,7 @@  static int h264_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *out)
                                buf, nal_size, 1)) < 0)
                 goto fail;
             s->new_idr = 0;
+            s->new_nal_slice = 1;
         /* if only SPS has been seen, also insert PPS */
         } else if (s->new_idr && unit_type == H264_NAL_IDR_SLICE && s->idr_sps_seen && !s->idr_pps_seen) {
             if (s->pps_offset == -1) {
@@ -253,6 +255,12 @@  static int h264_mp4toannexb_filter(AVBSFContext *ctx, AVPacket *out)
                                         ctx->par_out->extradata + s->pps_offset, ctx->par_out->extradata_size - s->pps_offset,
                                         buf, nal_size, 1)) < 0)
                 goto fail;
+        } else if (s->new_idr && !s->new_nal_slice && H264_NAL_SLICE == unit_type && !s->idr_sps_seen && !s->idr_pps_seen){
+            av_log(ctx, AV_LOG_WARNING, "first H264_NAL_SLICE when there is no IDR.\n");
+            if ((ret = alloc_and_copy(out, ctx->par_out->extradata, ctx->par_out->extradata_size, buf, nal_size, 1)) < 0)
+                goto fail;
+            s->new_nal_slice = 1;
+            s->new_idr = 0;
         } else {
             if ((ret=alloc_and_copy(out, NULL, 0, buf, nal_size, unit_type == H264_NAL_SPS || unit_type == H264_NAL_PPS)) < 0)
                 goto fail;