Module: libav
Branch: master
Commit: d7dcd825dea3681c69a35b3147a3b42f1bf078dd

Author:    James Almer <jamr...@gmail.com>
Committer: Anton Khirnov <an...@khirnov.net>
Date:      Fri Apr 14 10:53:52 2017 -0300

extract_extradata_bsf: make sure all needed parameter set NALUs were found

This mimics the behavior of the now unused h264/hevc parser's split()
function and fixes decoding some files when extract_extradata bsf is
enabled.

Signed-off-by: James Almer <jamr...@gmail.com>
Signed-off-by: Anton Khirnov <an...@khirnov.net>

---

 libavcodec/extract_extradata_bsf.c | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/libavcodec/extract_extradata_bsf.c 
b/libavcodec/extract_extradata_bsf.c
index 20b3080..20840bd 100644
--- a/libavcodec/extract_extradata_bsf.c
+++ b/libavcodec/extract_extradata_bsf.c
@@ -65,7 +65,7 @@ static int extract_extradata_h2645(AVBSFContext *ctx, 
AVPacket *pkt,
     int extradata_size = 0;
     const int *extradata_nal_types;
     int nb_extradata_nal_types;
-    int i, ret = 0;
+    int i, has_sps = 0, has_vps = 0, ret = 0;
 
     if (ctx->par_in->codec_id == AV_CODEC_ID_HEVC) {
         extradata_nal_types    = extradata_nal_types_hevc;
@@ -82,11 +82,20 @@ static int extract_extradata_h2645(AVBSFContext *ctx, 
AVPacket *pkt,
 
     for (i = 0; i < h2645_pkt.nb_nals; i++) {
         H2645NAL *nal = &h2645_pkt.nals[i];
-        if (val_in_array(extradata_nal_types, nb_extradata_nal_types, 
nal->type))
+        if (val_in_array(extradata_nal_types, nb_extradata_nal_types, 
nal->type)) {
             extradata_size += nal->raw_size + 3;
+            if (ctx->par_in->codec_id == AV_CODEC_ID_HEVC) {
+                if (nal->type == HEVC_NAL_SPS) has_sps = 1;
+                if (nal->type == HEVC_NAL_VPS) has_vps = 1;
+            } else {
+                if (nal->type == H264_NAL_SPS) has_sps = 1;
+            }
+        }
     }
 
-    if (extradata_size) {
+    if (extradata_size &&
+        ((ctx->par_in->codec_id == AV_CODEC_ID_HEVC && has_sps && has_vps) ||
+         (ctx->par_in->codec_id == AV_CODEC_ID_H264 && has_sps))) {
         AVBufferRef *filtered_buf;
         uint8_t *extradata, *filtered_data;
 

_______________________________________________
libav-commits mailing list
libav-commits@libav.org
https://lists.libav.org/mailman/listinfo/libav-commits

Reply via email to