avcodec/nvdec: correctly set intra_pic_flag for h264/hevc
authorTimo Rothenpieler <timo@rothenpieler.org>
Fri, 13 Apr 2018 17:39:24 +0000 (19:39 +0200)
committerTimo Rothenpieler <timo@rothenpieler.org>
Sun, 15 Apr 2018 09:26:46 +0000 (11:26 +0200)
libavcodec/nvdec_h264.c
libavcodec/nvdec_hevc.c

index 35f54f2..25b3032 100644 (file)
@@ -74,7 +74,7 @@ static int nvdec_h264_start_frame(AVCodecContext *avctx,
         .bottom_field_flag = h->picture_structure == PICT_BOTTOM_FIELD,
         .second_field      = FIELD_PICTURE(h) && !h->first_field,
         .ref_pic_flag      = h->nal_ref_idc != 0,
-        .intra_pic_flag    = 0,
+        .intra_pic_flag    = 1,
 
         .CodecSpecific.h264 = {
             .log2_max_frame_num_minus4            = sps->log2_max_frame_num - 4,
@@ -132,6 +132,9 @@ static int nvdec_h264_decode_slice(AVCodecContext *avctx, const uint8_t *buffer,
                                    uint32_t size)
 {
     NVDECContext *ctx = avctx->internal->hwaccel_priv_data;
+    CUVIDPICPARAMS *pp = &ctx->pic_params;
+    const H264Context *h = avctx->priv_data;
+    const H264SliceContext *sl = &h->slice_ctx[0];
     void *tmp;
 
     tmp = av_fast_realloc(ctx->bitstream, &ctx->bitstream_allocated,
@@ -152,6 +155,9 @@ static int nvdec_h264_decode_slice(AVCodecContext *avctx, const uint8_t *buffer,
     ctx->bitstream_len += size + 3;
     ctx->nb_slices++;
 
+    if (sl->slice_type != AV_PICTURE_TYPE_I && sl->slice_type != AV_PICTURE_TYPE_SI)
+        pp->intra_pic_flag = 0;
+
     return 0;
 }
 
index e89256d..0089631 100644 (file)
@@ -93,7 +93,7 @@ static int nvdec_hevc_start_frame(AVCodecContext *avctx,
         .FrameHeightInMbs  = sps->height / 16,
         .CurrPicIdx        = cf->idx,
         .ref_pic_flag      = 1,
-        .intra_pic_flag    = 0,
+        .intra_pic_flag    = IS_IRAP(s),
 
         .CodecSpecific.hevc = {
             .pic_width_in_luma_samples                    = sps->width,