From eb56833d6a315c5a914654449e0d03f0ed65a4c5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sat, 26 Jul 2014 13:02:23 +0300 Subject: [PATCH] vdpau: add support for 4:4:4 chroma sampling --- modules/hw/vdpau/adjust.c | 5 +++-- modules/hw/vdpau/chroma.c | 24 ++++++++++++++++++++---- modules/hw/vdpau/deinterlace.c | 5 +++-- modules/hw/vdpau/display.c | 3 ++- modules/hw/vdpau/picture.c | 3 ++- modules/hw/vdpau/sharpen.c | 5 +++-- 6 files changed, 33 insertions(+), 12 deletions(-) diff --git a/modules/hw/vdpau/adjust.c b/modules/hw/vdpau/adjust.c index 9153e3ddd9..d150579d35 100644 --- a/modules/hw/vdpau/adjust.c +++ b/modules/hw/vdpau/adjust.c @@ -125,8 +125,9 @@ static int Open(vlc_object_t *obj) { filter_t *filter = (filter_t *)obj; - if (filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_422 - && filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_420) + if (filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_420 + && filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_422 + && filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_444) return VLC_EGENERIC; if (!video_format_IsSimilar(&filter->fmt_in.video, &filter->fmt_out.video)) return VLC_EGENERIC; diff --git a/modules/hw/vdpau/chroma.c b/modules/hw/vdpau/chroma.c index 126cf294f4..70ce32f6a0 100644 --- a/modules/hw/vdpau/chroma.c +++ b/modules/hw/vdpau/chroma.c @@ -329,7 +329,8 @@ static picture_t *VideoExport(filter_t *filter, picture_t *src, picture_t *dst) pitches[i] = dst->p[i].i_pitch; } if (dst->format.i_chroma == VLC_CODEC_I420 - || dst->format.i_chroma == VLC_CODEC_I422) + || dst->format.i_chroma == VLC_CODEC_I422 + || dst->format.i_chroma == VLC_CODEC_I444) { planes[1] = dst->p[2].p_pixels; planes[2] = dst->p[1].p_pixels; @@ -378,7 +379,9 @@ static picture_t *VideoImport(filter_t *filter, picture_t *src) planes[i] = src->p[i].p_pixels; pitches[i] = src->p[i].i_pitch; } - if (src->format.i_chroma == VLC_CODEC_I420) + if (src->format.i_chroma == VLC_CODEC_I420 + || src->format.i_chroma == VLC_CODEC_I422 + || src->format.i_chroma == VLC_CODEC_I444) { planes[1] = src->p[2].p_pixels; planes[2] = src->p[1].p_pixels; @@ -396,8 +399,21 @@ static picture_t *VideoImport(filter_t *filter, picture_t *src) /* Wrap surface into a picture */ video_format_t fmt = src->format; - fmt.i_chroma = (sys->chroma == VDP_CHROMA_TYPE_420) - ? VLC_CODEC_VDPAU_VIDEO_420 : VLC_CODEC_VDPAU_VIDEO_422; + + switch (sys->chroma) + { + case VDP_CHROMA_TYPE_420: + fmt.i_chroma = VLC_CODEC_VDPAU_VIDEO_420; + break; + case VDP_CHROMA_TYPE_422: + fmt.i_chroma = VLC_CODEC_VDPAU_VIDEO_422; + break; + case VDP_CHROMA_TYPE_444: + fmt.i_chroma = VLC_CODEC_VDPAU_VIDEO_444; + break; + default: + assert(0); + } picture_t *dst = picture_NewFromFormat(&fmt); if (unlikely(dst == NULL)) diff --git a/modules/hw/vdpau/deinterlace.c b/modules/hw/vdpau/deinterlace.c index 44d7f25aff..cb30070a4d 100644 --- a/modules/hw/vdpau/deinterlace.c +++ b/modules/hw/vdpau/deinterlace.c @@ -98,8 +98,9 @@ static int Open(vlc_object_t *obj) { filter_t *filter = (filter_t *)obj; - if (filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_422 - && filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_420) + if (filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_420 + && filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_422 + && filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_444) return VLC_EGENERIC; if (!video_format_IsSimilar(&filter->fmt_in.video, &filter->fmt_out.video)) return VLC_EGENERIC; diff --git a/modules/hw/vdpau/display.c b/modules/hw/vdpau/display.c index 18a68d3b0c..54e1cb8846 100644 --- a/modules/hw/vdpau/display.c +++ b/modules/hw/vdpau/display.c @@ -477,7 +477,8 @@ static int Open(vlc_object_t *obj) video_format_ApplyRotation(&fmt, &vd->fmt); if (fmt.i_chroma == VLC_CODEC_VDPAU_VIDEO_420 - || fmt.i_chroma == VLC_CODEC_VDPAU_VIDEO_422) + || fmt.i_chroma == VLC_CODEC_VDPAU_VIDEO_422 + || fmt.i_chroma == VLC_CODEC_VDPAU_VIDEO_444) ; else if (vlc_fourcc_to_vdp_ycc(fmt.i_chroma, &chroma, &format)) diff --git a/modules/hw/vdpau/picture.c b/modules/hw/vdpau/picture.c index 7c865ed1ff..b881140326 100644 --- a/modules/hw/vdpau/picture.c +++ b/modules/hw/vdpau/picture.c @@ -96,7 +96,8 @@ VdpStatus vlc_vdp_video_attach(vdp_t *vdp, VdpVideoSurface surface, return VDP_STATUS_RESOURCES; assert(pic->format.i_chroma == VLC_CODEC_VDPAU_VIDEO_420 - || pic->format.i_chroma == VLC_CODEC_VDPAU_VIDEO_422); + || pic->format.i_chroma == VLC_CODEC_VDPAU_VIDEO_422 + || pic->format.i_chroma == VLC_CODEC_VDPAU_VIDEO_444); assert(!picture_IsReferenced(pic)); assert(pic->context == NULL); pic->context = field; diff --git a/modules/hw/vdpau/sharpen.c b/modules/hw/vdpau/sharpen.c index bbdc6dfce8..0470990516 100644 --- a/modules/hw/vdpau/sharpen.c +++ b/modules/hw/vdpau/sharpen.c @@ -82,8 +82,9 @@ static int Open(vlc_object_t *obj) { filter_t *filter = (filter_t *)obj; - if (filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_422 - && filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_420) + if (filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_420 + && filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_422 + && filter->fmt_in.video.i_chroma != VLC_CODEC_VDPAU_VIDEO_444) return VLC_EGENERIC; if (!video_format_IsSimilar(&filter->fmt_in.video, &filter->fmt_out.video)) return VLC_EGENERIC; -- 2.39.2