diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c
index 7578e62a8639be48df786fcd8af0b1a46c69c27a..6f9afa9fcc15b048f17bfcc8351e253149b2774b 100644
--- a/libavcodec/vdpau.c
+++ b/libavcodec/vdpau.c
@@ -288,7 +288,9 @@ int ff_vdpau_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
 
 #if FF_API_BUFS_VDPAU
 FF_DISABLE_DEPRECATION_WARNINGS
-    hwctx->info = pic_ctx->info;
+    av_assert0(sizeof(hwctx->info) >= sizeof(pic_ctx->info));
+    memset(&hwctx->info, 0, sizeof(hwctx->info));
+    memcpy(&hwctx->info, &pic_ctx->info, sizeof(pic_ctx->info));
     hwctx->bitstream_buffers = pic_ctx->bitstream_buffers;
     hwctx->bitstream_buffers_used = pic_ctx->bitstream_buffers_used;
     hwctx->bitstream_buffers_allocated = pic_ctx->bitstream_buffers_allocated;
diff --git a/libavcodec/vdpau_h264.c b/libavcodec/vdpau_h264.c
index 0b2c0466b4672645da30076fc71cc296718142e6..1736bbd1787f91a7c1e6d1b05a9d22dc65916429 100644
--- a/libavcodec/vdpau_h264.c
+++ b/libavcodec/vdpau_h264.c
@@ -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;
@@ -227,6 +234,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);
diff --git a/libavcodec/vdpau_internal.h b/libavcodec/vdpau_internal.h
index e1ea4306f2a18ad20b70bf8494f375e91ac70096..e5fe63dd197c102eacd66f53f4e2ec2054ee89e7 100644
--- a/libavcodec/vdpau_internal.h
+++ b/libavcodec/vdpau_internal.h
@@ -44,16 +44,17 @@ static inline uintptr_t ff_vdpau_get_surface_id(AVFrame *pic)
 
 struct vdpau_picture_context;
 #if CONFIG_VDPAU
-#if !FF_API_BUFS_VDPAU
-union AVVDPAUPictureInfo {
+union VDPAUPictureInfo {
     VdpPictureInfoH264        h264;
     VdpPictureInfoMPEG1Or2    mpeg;
     VdpPictureInfoVC1          vc1;
     VdpPictureInfoMPEG4Part2 mpeg4;
+#ifdef VDP_DECODER_PROFILE_H264_HIGH_444_PREDICTIVE
+    VdpPictureInfoH264Predictive h264_predictive;
+#endif
 };
-#else
+
 #include "vdpau.h"
-#endif
 
 typedef struct VDPAUHWContext {
     AVVDPAUContext context;
@@ -92,7 +93,7 @@ struct vdpau_picture_context {
     /**
      * VDPAU picture information.
      */
-    union AVVDPAUPictureInfo info;
+    union VDPAUPictureInfo info;
 
     /**
      * Allocated size of the bitstream_buffers table.