---
libavcodec/h264_slice.c | 6 +++---
libavcodec/vdpau.c | 11 +++++++++++
libavcodec/vdpau_h264.c | 29 ++++++++++++++++++++++++++++-
libavcodec/vdpau_internal.h | 3 +++
4 files changed, 45 insertions(+), 4 deletions(-)
diff --git a/libavcodec/h264_slice.c b/libavcodec/h264_slice.c
index fe9c0e9..6379d29 100644
--- a/libavcodec/h264_slice.c
+++ b/libavcodec/h264_slice.c
@@ -970,6 +970,9 @@ static enum AVPixelFormat get_pixel_format(H264Context *h)
*fmt++ = AV_PIX_FMT_YUV420P10;
break;
case 8:
+#if CONFIG_H264_VDPAU_HWACCEL
+ *fmt++ = AV_PIX_FMT_VDPAU;
+#endif
if (CHROMA444(h)) {
if (h->avctx->colorspace == AVCOL_SPC_RGB)
*fmt++ = AV_PIX_FMT_GBRP;
@@ -993,9 +996,6 @@ static enum AVPixelFormat get_pixel_format(H264Context *h)
*fmt++ = AV_PIX_FMT_VDA_VLD;
*fmt++ = AV_PIX_FMT_VDA;
#endif
-#if CONFIG_H264_VDPAU_HWACCEL
- *fmt++ = AV_PIX_FMT_VDPAU;
-#endif
if (h->avctx->codec->pix_fmts)
choices = h->avctx->codec->pix_fmts;
else if (h->avctx->color_range == AVCOL_RANGE_JPEG)
diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c
index 463e600..e22ab1e 100644
--- a/libavcodec/vdpau.c
+++ b/libavcodec/vdpau.c
@@ -70,6 +70,17 @@ int av_vdpau_get_surface_parameters(AVCodecContext *avctx,
VdpChromaType *type,
VdpChromaType t = VDP_CHROMA_TYPE_420;
uint32_t w = avctx->coded_width;
uint32_t h = avctx->coded_height;
+ int val = 0;
+
+ switch (avctx->codec_id)
+ {
+ case AV_CODEC_ID_H264:
+ val = ff_vdpau_h264_get_chroma_type(avctx, &t);
+ break;
+ }
+
+ if (val < 0)
+ return val;
/* See <vdpau/vdpau.h> for per-type alignment constraints. */
switch (t)
diff --git a/libavcodec/vdpau_h264.c b/libavcodec/vdpau_h264.c
index 6774882..578b711 100644
--- a/libavcodec/vdpau_h264.c
+++ b/libavcodec/vdpau_h264.c
@@ -203,10 +203,37 @@ static int vdpau_h264_end_frame(AVCodecContext *avctx)
return 0;
}
+int ff_vdpau_h264_get_chroma_type(const AVCodecContext *avctx,
+ VdpChromaType *type)
+{
+ const H264Context *h = avctx->priv_data;
+
+ switch (h->sps.chroma_format_idc) {
+ case 1:
+ *type = VDP_CHROMA_TYPE_420;
+ break;
+ case 2:
+ *type = VDP_CHROMA_TYPE_422;
+ break;
+ case 3:
+ *type = VDP_CHROMA_TYPE_444;
+ break;
+ default:
+ return AVERROR(ENOSYS);
+ }
+ return 0;
+}
+
static int vdpau_h264_init(AVCodecContext *avctx)
{
VdpDecoderProfile profile;
uint32_t level = avctx->level;
+ VdpChromaType type;
+ int val;
+
+ val = ff_vdpau_h264_get_chroma_type(avctx, &type);
+ if (val < 0)
+ return val;
switch (avctx->profile & ~FF_PROFILE_H264_INTRA) {
case FF_PROFILE_H264_BASELINE:
@@ -235,7 +262,7 @@ static int vdpau_h264_init(AVCodecContext *avctx)
if ((avctx->profile & FF_PROFILE_H264_INTRA) && avctx->level == 11)
level = VDP_DECODER_LEVEL_H264_1b;
- return ff_vdpau_common_init(avctx, profile, level, VDP_CHROMA_TYPE_420);
+ return ff_vdpau_common_init(avctx, profile, level, type);
}
AVHWAccel ff_h264_vdpau_hwaccel = {
diff --git a/libavcodec/vdpau_internal.h b/libavcodec/vdpau_internal.h
index bcdeb90..05b3361 100644
--- a/libavcodec/vdpau_internal.h
+++ b/libavcodec/vdpau_internal.h
@@ -116,4 +116,7 @@ int ff_vdpau_mpeg_end_frame(AVCodecContext *avctx);
int ff_vdpau_add_buffer(struct vdpau_picture_context *pic, const uint8_t *buf,
uint32_t buf_size);
+int ff_vdpau_h264_get_chroma_type(const AVCodecContext *avctx,
+ VdpChromaType *type);
+
#endif /* AVCODEC_VDPAU_INTERNAL_H */
--
2.1.3
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel