[vlc-devel] [PATCH 1/2] vpx: Decode additional profiles and high bit depth formats
Rémi Denis-Courmont
remi at remlab.net
Tue Sep 27 02:30:08 CEST 2016
Le lundi 26 septembre 2016, 11:42:57 Vittorio Giovara a écrit :
> This effectively bumps the minimum libvpx version to 1.4.
> ---
> Updated following review.
> Vittorio
>
> configure.ac | 4 +--
> modules/codec/vpx.c | 72
> +++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 72
> insertions(+), 4 deletions(-)
>
> diff --git a/configure.ac b/configure.ac
> index 08a41fe..936b1f0 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -2631,7 +2631,7 @@ dnl
> AC_ARG_ENABLE(vpx,
> AS_HELP_STRING([--enable-vpx],[libvpx VP8/VP9 encoder and decoder
> (default auto)])) AS_IF([test "${enable_vpx}" != "no"],[
> - PKG_CHECK_MODULES([VPX], [vpx] , [
> + PKG_CHECK_MODULES([VPX], [vpx >= 1.4.0], [
> VLC_ADD_PLUGIN([vpx])
> VLC_ADD_CPPFLAGS([vpx], [${VPX_CFLAGS}])
> VLC_ADD_LIBS([vpx], [${VPX_LIBS}])
> @@ -2649,7 +2649,7 @@ AS_IF([test "${enable_vpx}" != "no"],[
> ], [], [${VPX_LIBS}])
> ], [
> AS_IF([test "${enable_vpx}" = "yes"],[
> - AC_MSG_ERROR([libvpx was not found])
> + AC_MSG_ERROR([libvpx 1.4.0 or higher was not found])
> ])])
> ])
>
> diff --git a/modules/codec/vpx.c b/modules/codec/vpx.c
> index fbe9995..4bc3925 100644
> --- a/modules/codec/vpx.c
> +++ b/modules/codec/vpx.c
> @@ -99,8 +99,69 @@ static void vpx_err_msg(vlc_object_t *this, struct
> vpx_codec_ctx *ctx, struct decoder_sys_t
> {
> struct vpx_codec_ctx ctx;
> + vpx_codec_caps_t codec_caps;
> };
>
> +static const struct
> +{
> + vlc_fourcc_t i_chroma;
> + enum vpx_img_fmt i_chroma_id;
> + uint8_t i_bitdepth;
> + uint8_t i_needs_hack;
> +
> +} chroma_table[] =
> +{
> + { VLC_CODEC_I420, VPX_IMG_FMT_I420, 8, 0 },
> + { VLC_CODEC_I422, VPX_IMG_FMT_I422, 8, 0 },
> + { VLC_CODEC_I444, VPX_IMG_FMT_I444, 8, 0 },
> + { VLC_CODEC_I440, VPX_IMG_FMT_I440, 8, 0 },
> +
> + { VLC_CODEC_YV12, VPX_IMG_FMT_YV12, 8, 0 },
> + { VLC_CODEC_YUVA, VPX_IMG_FMT_444A, 8, 0 },
> + { VLC_CODEC_YUYV, VPX_IMG_FMT_YUY2, 8, 0 },
> + { VLC_CODEC_UYVY, VPX_IMG_FMT_UYVY, 8, 0 },
> + { VLC_CODEC_YVYU, VPX_IMG_FMT_YVYU, 8, 0 },
> +
> + { VLC_CODEC_RGB15, VPX_IMG_FMT_RGB555, 8, 0 },
> + { VLC_CODEC_RGB16, VPX_IMG_FMT_RGB565, 8, 0 },
> + { VLC_CODEC_RGB24, VPX_IMG_FMT_RGB24, 8, 0 },
> + { VLC_CODEC_RGB32, VPX_IMG_FMT_RGB32, 8, 0 },
> +
> + { VLC_CODEC_ARGB, VPX_IMG_FMT_ARGB, 8, 0 },
> + { VLC_CODEC_BGRA, VPX_IMG_FMT_ARGB_LE, 8, 0 },
> +
> + { VLC_CODEC_GBR_PLANAR, VPX_IMG_FMT_I444, 8, 1 },
> + { VLC_CODEC_GBR_PLANAR_10L, VPX_IMG_FMT_I44416, 10, 1 },
> +
> + { VLC_CODEC_I420_10L, VPX_IMG_FMT_I42016, 10, 0 },
> + { VLC_CODEC_I422_10L, VPX_IMG_FMT_I42216, 10, 0 },
> + { VLC_CODEC_I444_10L, VPX_IMG_FMT_I44416, 10, 0 },
> +
> + { VLC_CODEC_I420_12L, VPX_IMG_FMT_I42016, 12, 0 },
> + { VLC_CODEC_I422_12L, VPX_IMG_FMT_I42216, 12, 0 },
> + { VLC_CODEC_I444_12L, VPX_IMG_FMT_I44416, 12, 0 },
> +
> + { VLC_CODEC_I444_16L, VPX_IMG_FMT_I44416, 16, 0 },
> +
> + { 0, 0, 0, 0 },
Remove that and..
> +};
> +
> +static vlc_fourcc_t FindVlcChroma( struct vpx_image *img, vpx_codec_caps_t
> codec_caps ) +{
> + uint8_t hack = (img->fmt & VPX_IMG_FMT_I444) && (img->cs ==
> VPX_CS_SRGB); +
> + if( img->bit_depth > 8 && !(codec_caps & VPX_CODEC_CAP_HIGHBITDEPTH) )
> + return 0;
> +
> + for( int i = 0; chroma_table[i].i_chroma != 0; i++ )
...use array size as boundary (ARRAY_SIZE macro might help).
> + if( chroma_table[i].i_chroma_id == img->fmt &&
> + chroma_table[i].i_bitdepth == img->bit_depth &&
> + chroma_table[i].i_needs_hack == hack )
> + return chroma_table[i].i_chroma;
> +
> + return 0;
> +}
> +
> /**************************************************************************
> ** * Decode: the whole thing
>
> ***************************************************************************
> */ @@ -151,7 +212,9 @@ static picture_t *Decode(decoder_t *dec, block_t
> **pp_block) mtime_t pts = *pkt_pts;
> free(pkt_pts);
>
> - if (img->fmt != VPX_IMG_FMT_I420) {
> + dec->fmt_out.i_codec = FindVlcChroma(img, dec->p_sys->codec_caps);
> +
> + if( dec->fmt_out.i_codec == 0 ) {
> msg_Err(dec, "Unsupported output colorspace %d", img->fmt);
> return NULL;
> }
> @@ -169,6 +232,8 @@ static picture_t *Decode(decoder_t *dec, block_t
> **pp_block) dec->fmt_out.video.i_sar_den = 1;
> }
>
> + v->b_color_range_full = img->range == VPX_CR_FULL_RANGE;
> +
> picture_t *pic = decoder_NewPicture(dec);
> if (!pic)
> return NULL;
> @@ -200,6 +265,7 @@ static int OpenDecoder(vlc_object_t *p_this)
> {
> decoder_t *dec = (decoder_t *)p_this;
> const struct vpx_codec_iface *iface;
> + vpx_codec_caps_t codec_caps = 0;
> int vp_version;
>
> switch (dec->fmt_in.i_codec)
> @@ -212,6 +278,7 @@ static int OpenDecoder(vlc_object_t *p_this)
> #endif
> #ifdef ENABLE_VP9_DECODER
> case VLC_CODEC_VP9:
> + codec_caps = vpx_codec_get_caps(vpx_codec_vp9_cx());
> iface = &vpx_codec_vp9_dx_algo;
> vp_version = 9;
> break;
> @@ -238,12 +305,13 @@ static int OpenDecoder(vlc_object_t *p_this)
> return VLC_EGENERIC;;
> }
>
> + dec->p_sys->codec_caps = codec_caps;
> +
> dec->pf_decode_video = Decode;
>
> dec->fmt_out.i_cat = VIDEO_ES;
> dec->fmt_out.video.i_width = dec->fmt_in.video.i_width;
> dec->fmt_out.video.i_height = dec->fmt_in.video.i_height;
> - dec->fmt_out.i_codec = VLC_CODEC_I420;
>
> return VLC_SUCCESS;
> }
--
Rémi Denis-Courmont
http://www.remlab.net/
More information about the vlc-devel
mailing list