X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fvdpau_h264.c;h=d03d127ee5a37a8863aeb47cb7807f6b281d7718;hb=89a13998a1b5074411dff5a461dce3837057b0b8;hp=5ed1fffe09f974ccad229bd537a468c64a285350;hpb=559fa0d41b5cf8f7e1ba89d1ac70e74712eb2816;p=ffmpeg diff --git a/libavcodec/vdpau_h264.c b/libavcodec/vdpau_h264.c index 5ed1fffe09f..d03d127ee5a 100644 --- a/libavcodec/vdpau_h264.c +++ b/libavcodec/vdpau_h264.c @@ -51,7 +51,7 @@ static void vdpau_h264_clear_rf(VdpReferenceFrameH264 *rf) static void vdpau_h264_set_rf(VdpReferenceFrameH264 *rf, H264Picture *pic, int pic_structure) { - VdpVideoSurface surface = ff_vdpau_get_surface_id(&pic->f); + VdpVideoSurface surface = ff_vdpau_get_surface_id(pic->f); if (pic_structure == 0) pic_structure = pic->reference; @@ -88,7 +88,7 @@ static void vdpau_h264_set_reference_frames(AVCodecContext *avctx) if (!pic || !pic->reference) continue; pic_frame_idx = pic->long_ref ? pic->pic_id : pic->frame_num; - surface_ref = ff_vdpau_get_surface_id(&pic->f); + surface_ref = ff_vdpau_get_surface_id(pic->f); rf2 = &info->referenceFrames[0]; while (rf2 != rf) { @@ -123,6 +123,9 @@ static int vdpau_h264_start_frame(AVCodecContext *avctx, H264Picture *pic = h->cur_pic_ptr; struct vdpau_picture_context *pic_ctx = pic->hwaccel_picture_private; VdpPictureInfoH264 *info = &pic_ctx->info.h264; +#ifdef VDP_DECODER_PROFILE_H264_HIGH_444_PREDICTIVE + VdpPictureInfoH264Predictive *info2 = &pic_ctx->info.h264_predictive; +#endif /* init VdpPictureInfoH264 */ info->slice_count = 0; @@ -149,6 +152,10 @@ static int vdpau_h264_start_frame(AVCodecContext *avctx, info->log2_max_pic_order_cnt_lsb_minus4 = h->sps.poc_type ? 0 : h->sps.log2_max_poc_lsb - 4; info->delta_pic_order_always_zero_flag = h->sps.delta_pic_order_always_zero_flag; info->direct_8x8_inference_flag = h->sps.direct_8x8_inference_flag; +#ifdef VDP_DECODER_PROFILE_H264_HIGH_444_PREDICTIVE + info2->qpprime_y_zero_transform_bypass_flag = h->sps.transform_bypass; + info2->separate_colour_plane_flag = h->sps.residual_color_transform_flag; +#endif info->entropy_coding_mode_flag = h->pps.cabac; info->pic_order_present_flag = h->pps.pic_order_present; info->deblocking_filter_control_present_flag = h->pps.deblocking_filter_parameters_present; @@ -191,15 +198,16 @@ static int vdpau_h264_decode_slice(AVCodecContext *avctx, static int vdpau_h264_end_frame(AVCodecContext *avctx) { H264Context *h = avctx->priv_data; + H264SliceContext *sl = &h->slice_ctx[0]; H264Picture *pic = h->cur_pic_ptr; struct vdpau_picture_context *pic_ctx = pic->hwaccel_picture_private; int val; - val = ff_vdpau_common_end_frame(avctx, &pic->f, pic_ctx); + val = ff_vdpau_common_end_frame(avctx, pic->f, pic_ctx); if (val < 0) return val; - ff_h264_draw_horiz_band(h, 0, h->avctx->height); + ff_h264_draw_horiz_band(h, sl, 0, h->avctx->height); return 0; } @@ -227,6 +235,18 @@ static int vdpau_h264_init(AVCodecContext *avctx) case FF_PROFILE_H264_EXTENDED: profile = VDP_DECODER_PROFILE_H264_EXTENDED; break; +#endif + case FF_PROFILE_H264_HIGH_10: + /* XXX: High 10 can be treated as High so long as only 8-bits per + * formats are supported. */ + profile = VDP_DECODER_PROFILE_H264_HIGH; + break; +#ifdef VDP_DECODER_PROFILE_H264_HIGH_444_PREDICTIVE + case FF_PROFILE_H264_HIGH_422: + case FF_PROFILE_H264_HIGH_444_PREDICTIVE: + case FF_PROFILE_H264_CAVLC_444: + profile = VDP_DECODER_PROFILE_H264_HIGH_444_PREDICTIVE; + break; #endif default: return AVERROR(ENOTSUP);