[vlc-commits] hw: vaapi: choose va formats/chromas from vlc chromas
Thomas Guillem
git at videolan.org
Tue Nov 7 11:52:49 CET 2017
vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Sun Sep 3 10:34:43 2017 +0200| [fc1226e3a8b64b6f9a62afddb142c217ee9db882] | committer: Thomas Guillem
hw: vaapi: choose va formats/chromas from vlc chromas
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=fc1226e3a8b64b6f9a62afddb142c217ee9db882
---
modules/codec/avcodec/vaapi.c | 3 ++-
modules/hw/vaapi/chroma.c | 3 +--
modules/hw/vaapi/filters.c | 4 ++--
modules/hw/vaapi/vlc_vaapi.c | 34 +++++++++++++++++++++++----
modules/hw/vaapi/vlc_vaapi.h | 5 ++--
modules/video_output/opengl/converter_vaapi.c | 2 +-
6 files changed, 37 insertions(+), 14 deletions(-)
diff --git a/modules/codec/avcodec/vaapi.c b/modules/codec/avcodec/vaapi.c
index 58d40df563..5aa6ad6ae5 100644
--- a/modules/codec/avcodec/vaapi.c
+++ b/modules/codec/avcodec/vaapi.c
@@ -334,9 +334,10 @@ static int CreateDRM(vlc_va_t *va, AVCodecContext *ctx, enum PixelFormat pix_fmt
.i_visible_width = ctx->coded_width,
.i_visible_height = ctx->coded_height
};
+
VASurfaceID *surfaces;
sys->pool = vlc_vaapi_PoolNew(o, sys->va_inst, sys->hw_ctx.display, count,
- &surfaces, &vfmt, VA_RT_FORMAT_YUV420, 0);
+ &surfaces, &vfmt, false);
if (!sys->pool)
goto error;
diff --git a/modules/hw/vaapi/chroma.c b/modules/hw/vaapi/chroma.c
index b3df2ecc7b..15a38afcf7 100644
--- a/modules/hw/vaapi/chroma.c
+++ b/modules/hw/vaapi/chroma.c
@@ -304,8 +304,7 @@ vlc_vaapi_OpenChroma(vlc_object_t *obj)
filter_sys->dest_pics =
vlc_vaapi_PoolNew(obj, filter_sys->va_inst, filter_sys->dpy,
DEST_PICS_POOL_SZ, &filter_sys->va_surface_ids,
- &filter->fmt_out.video, VA_RT_FORMAT_YUV420,
- VA_FOURCC_NV12);
+ &filter->fmt_out.video, true);
if (!filter_sys->dest_pics)
{
vlc_vaapi_FilterReleaseInstance(filter, filter_sys->va_inst);
diff --git a/modules/hw/vaapi/filters.c b/modules/hw/vaapi/filters.c
index 5c4fd38be2..ba00dbe1c0 100755
--- a/modules/hw/vaapi/filters.c
+++ b/modules/hw/vaapi/filters.c
@@ -383,14 +383,14 @@ Open(filter_t * filter,
vlc_vaapi_PoolNew(VLC_OBJECT(filter), filter_sys->va.inst,
filter_sys->va.dpy, DEST_PICS_POOL_SZ,
&filter_sys->va.surface_ids, &filter->fmt_out.video,
- VA_RT_FORMAT_YUV420, VA_FOURCC_NV12);
+ true);
if (!filter_sys->dest_pics)
goto error;
filter_sys->va.conf =
vlc_vaapi_CreateConfigChecked(VLC_OBJECT(filter), filter_sys->va.dpy,
VAProfileNone, VAEntrypointVideoProc,
- VA_FOURCC_NV12);
+ filter->fmt_out.video.i_chroma);
if (filter_sys->va.conf == VA_INVALID_ID)
goto error;
diff --git a/modules/hw/vaapi/vlc_vaapi.c b/modules/hw/vaapi/vlc_vaapi.c
index 7dfe2aea45..59d520aafb 100644
--- a/modules/hw/vaapi/vlc_vaapi.c
+++ b/modules/hw/vaapi/vlc_vaapi.c
@@ -55,6 +55,20 @@
} \
} while (0)
+static void
+vlc_chroma_to_vaapi(int i_vlc_chroma, unsigned *va_rt_format, int *va_fourcc)
+{
+ switch (i_vlc_chroma)
+ {
+ case VLC_CODEC_VAAPI_420:
+ *va_rt_format = VA_RT_FORMAT_YUV420;
+ *va_fourcc = VA_FOURCC_NV12;
+ break;
+ default:
+ vlc_assert_unreachable();
+ }
+}
+
/**************************
* VA instance management *
**************************/
@@ -369,8 +383,15 @@ error:
VAConfigID
vlc_vaapi_CreateConfigChecked(vlc_object_t *o, VADisplay dpy,
VAProfile i_profile, VAEntrypoint entrypoint,
- int va_force_fourcc)
+ int i_force_vlc_chroma)
{
+ int va_force_fourcc = 0;
+ if (i_force_vlc_chroma != 0)
+ {
+ unsigned unused;
+ vlc_chroma_to_vaapi(i_force_vlc_chroma, &unused, &va_force_fourcc);
+ }
+
if (!IsVaProfileSupported(dpy, i_profile))
{
msg_Err(o, "profile(%d) is not supported", i_profile);
@@ -514,9 +535,12 @@ pic_sys_ctx_destroy_cb(struct picture_context_t *opaque)
picture_pool_t *
vlc_vaapi_PoolNew(vlc_object_t *o, struct vlc_vaapi_instance *va_inst,
VADisplay dpy, unsigned count, VASurfaceID **render_targets,
- const video_format_t *restrict fmt,
- unsigned va_rt_format, int va_force_fourcc)
+ const video_format_t *restrict fmt, bool b_force_fourcc)
{
+ unsigned va_rt_format;
+ int va_fourcc;
+ vlc_chroma_to_vaapi(fmt->i_chroma, &va_rt_format, &va_fourcc);
+
struct pic_sys_vaapi_instance *instance =
malloc(sizeof(*instance) + count * sizeof(VASurfaceID));
if (!instance)
@@ -531,10 +555,10 @@ vlc_vaapi_PoolNew(vlc_object_t *o, struct vlc_vaapi_instance *va_inst,
.type = VASurfaceAttribPixelFormat,
.flags = VA_SURFACE_ATTRIB_SETTABLE,
.value.type = VAGenericValueTypeInteger,
- .value.value.i = va_force_fourcc,
+ .value.value.i = b_force_fourcc ? va_fourcc : 0,
}
};
- if (va_force_fourcc != 0)
+ if (b_force_fourcc)
{
attribs = fourcc_attribs;
num_attribs = 1;
diff --git a/modules/hw/vaapi/vlc_vaapi.h b/modules/hw/vaapi/vlc_vaapi.h
index a497a12746..08b55b626b 100644
--- a/modules/hw/vaapi/vlc_vaapi.h
+++ b/modules/hw/vaapi/vlc_vaapi.h
@@ -173,15 +173,14 @@ vlc_vaapi_EndPicture(vlc_object_t *o, VADisplay dpy, VAContextID ctx);
VAConfigID
vlc_vaapi_CreateConfigChecked(vlc_object_t *o, VADisplay dpy,
VAProfile i_profile, VAEntrypoint entrypoint,
- int va_force_fourcc);
+ int i_force_vlc_chroma);
/* Create a pool backed by VASurfaceID. render_targets will destroyed once
* the pool and every pictures are released. */
picture_pool_t *
vlc_vaapi_PoolNew(vlc_object_t *o, struct vlc_vaapi_instance *vainst,
VADisplay dpy, unsigned count, VASurfaceID **render_targets,
- const video_format_t *restrict fmt,
- unsigned va_rt_format, int va_force_fourcc);
+ const video_format_t *restrict fmt, bool b_force_fourcc);
/* Get render targets from a pic_sys allocated by the vaapi pool (see
* vlc_vaapi_PoolNew()) */
diff --git a/modules/video_output/opengl/converter_vaapi.c b/modules/video_output/opengl/converter_vaapi.c
index 20fe855182..17c9a03bf7 100644
--- a/modules/video_output/opengl/converter_vaapi.c
+++ b/modules/video_output/opengl/converter_vaapi.c
@@ -231,7 +231,7 @@ tc_vaegl_get_pool(const opengl_tex_converter_t *tc, unsigned requested_count)
picture_pool_t *pool =
vlc_vaapi_PoolNew(VLC_OBJECT(tc->gl), priv->vainst, priv->vadpy,
requested_count, &priv->va_surface_ids, &tc->fmt,
- VA_RT_FORMAT_YUV420, VA_FOURCC_NV12);
+ true);
if (!pool)
return NULL;
More information about the vlc-commits
mailing list