<p dir="ltr">Hello,</p>
<p dir="ltr">Le 25 sept. 2016 00:58, Vittorio Giovara <vittorio.giovara@gmail.com> a écrit :<br>
><br>
> This effectively bumps the minimum libvpx version to 1.4.<br>
> ---<br>
> Not sure whether the place I added the conversion function is appropriate.<br>
> Also should the new minimum version requirement be enforced? If so, how?<br>
><br>
> Thanks,<br>
>     Vittorio<br>
><br>
> modules/codec/vpx.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++--<br>
> 1 file changed, 75 insertions(+), 2 deletions(-)<br>
><br>
> diff --git a/modules/codec/vpx.c b/modules/codec/vpx.c<br>
> index fbe9995..d0dd57f 100644<br>
> --- a/modules/codec/vpx.c<br>
> +++ b/modules/codec/vpx.c<br>
> @@ -99,8 +99,76 @@ static void vpx_err_msg(vlc_object_t *this, struct vpx_codec_ctx *ctx,<br>
> struct decoder_sys_t<br>
> {<br>
>      struct vpx_codec_ctx ctx;<br>
> +    vpx_codec_caps_t codec_caps;<br>
> };<br>
><br>
> +static const struct<br>
> +{<br>
> +    vlc_fourcc_t     i_chroma;<br>
> +    enum vpx_img_fmt i_chroma_id;<br>
> +    int              i_range;<br>
> +    int              i_bitdepth;<br>
> +    int              i_needs_hack;<br>
> +</p>
<p dir="ltr">Use more optimal types and reduce struct size?<br>
The last three members occupy 96 bits for 4 bits of entropy...</p>
<p dir="ltr">> +} chroma_table[] =<br>
> +{<br>
> +    { VLC_CODEC_I420, VPX_IMG_FMT_I420, 0, 8, 0 },<br>
> +    { VLC_CODEC_I422, VPX_IMG_FMT_I422, 0, 8, 0 },<br>
> +    { VLC_CODEC_I444, VPX_IMG_FMT_I444, 0, 8, 0 },<br>
> +    { VLC_CODEC_I440, VPX_IMG_FMT_I440, 0, 8, 0 },<br>
> +<br>
> +    { VLC_CODEC_J420, VPX_IMG_FMT_I420, 1, 8, 0 },<br>
> +    { VLC_CODEC_J422, VPX_IMG_FMT_I422, 1, 8, 0 },<br>
> +    { VLC_CODEC_J444, VPX_IMG_FMT_I444, 1, 8, 0 },<br>
> +    { VLC_CODEC_J440, VPX_IMG_FMT_I440, 1, 8, 0 },<br>
> +<br>
> +    { VLC_CODEC_YV12, VPX_IMG_FMT_YV12, 0, 8, 0 },<br>
> +    { VLC_CODEC_YUVA, VPX_IMG_FMT_444A, 0, 8, 0 },<br>
> +    { VLC_CODEC_YUYV, VPX_IMG_FMT_YUY2, 0, 8, 0 },<br>
> +    { VLC_CODEC_UYVY, VPX_IMG_FMT_UYVY, 0, 8, 0 },<br>
> +    { VLC_CODEC_YVYU, VPX_IMG_FMT_YVYU, 0, 8, 0 },<br>
> +<br>
> +    { VLC_CODEC_RGB15, VPX_IMG_FMT_RGB555, 0, 8, 0 },<br>
> +    { VLC_CODEC_RGB16, VPX_IMG_FMT_RGB565, 0, 8, 0 },<br>
> +    { VLC_CODEC_RGB24, VPX_IMG_FMT_RGB24, 0, 8, 0 },<br>
> +    { VLC_CODEC_RGB32, VPX_IMG_FMT_RGB32, 0, 8, 0 },<br>
> +<br>
> +    { VLC_CODEC_ARGB, VPX_IMG_FMT_ARGB, 0, 8, 0 },<br>
> +    { VLC_CODEC_BGRA, VPX_IMG_FMT_ARGB_LE, 0, 8, 0 },<br>
> +<br>
> +    { VLC_CODEC_GBR_PLANAR, VPX_IMG_FMT_I444, 0, 8, 1 }<br>
> +    { VLC_CODEC_GBR_PLANAR_10L, VPX_IMG_FMT_I44416, 0, 10, 1 }<br>
> +<br>
> +    { VLC_CODEC_I420_10L, VPX_IMG_FMT_I42016, 0, 10, 0 },<br>
> +    { VLC_CODEC_I422_10L, VPX_IMG_FMT_I42216, 0, 10, 0 },<br>
> +    { VLC_CODEC_I444_10L, VPX_IMG_FMT_I44416, 0, 10, 0 },<br>
> +<br>
> +    { VLC_CODEC_I420_12L, VPX_IMG_FMT_I42016, 0, 12, 0 },<br>
> +    { VLC_CODEC_I422_12L, VPX_IMG_FMT_I42216, 0, 12, 0 },<br>
> +    { VLC_CODEC_I444_12L, VPX_IMG_FMT_I44416, 0, 12, 0 },<br>
> +<br>
> +    { VLC_CODEC_I444_16L, VPX_IMG_FMT_I44416, 0, 16, 0 },<br>
> +<br>
> +    { 0, 0, 0, 0, 0 },<br>
> +};<br>
> +<br>
> +static vlc_fourcc_t FindVlcChroma( struct vpx_image *img, vpx_codec_caps_t codec_caps )<br>
> +{<br>
> +    int hack = (img->fmt & VPX_IMG_FMT_I444) && (img->cs == VPX_CS_SRGB);<br>
> +<br>
> +    if( img->bit_depth > 8 && !(codec_caps & VPX_CODEC_CAP_HIGHBITDEPTH) )<br>
> +        return 0;<br>
> +<br>
> +    for( int i = 0; chroma_table[i].i_chroma != 0; i++ )<br>
> +        if( chroma_table[i].i_chroma_id == img->fmt &&<br>
> +            chroma_table[i].i_range == img->range &&<br>
> +            chroma_table[i].i_bitdepth == img->bit_depth &&<br>
> +            chroma_table[i].i_needs_hack == hack )<br>
> +            return chroma_table[i].i_chroma;<br>
> +<br>
> +    return 0;<br>
> +}<br>
> +<br>
> /****************************************************************************<br>
>   * Decode: the whole thing<br>
>   ****************************************************************************/<br>
> @@ -151,7 +219,9 @@ static picture_t *Decode(decoder_t *dec, block_t **pp_block)<br>
>      mtime_t pts = *pkt_pts;<br>
>      free(pkt_pts);<br>
><br>
> -    if (img->fmt != VPX_IMG_FMT_I420) {<br>
> +    dec->fmt_out.i_codec = FindVlcChroma(img, dec->p_sys->codec_caps);<br>
> +<br>
> +    if( dec->fmt_out.i_codec == 0 ) {<br>
>          msg_Err(dec, "Unsupported output colorspace %d", img->fmt);<br>
>          return NULL;<br>
>      }<br>
> @@ -200,6 +270,7 @@ static int OpenDecoder(vlc_object_t *p_this)<br>
> {<br>
>      decoder_t *dec = (decoder_t *)p_this;<br>
>      const struct vpx_codec_iface *iface;<br>
> +    vpx_codec_caps_t codec_caps = 0;<br>
>      int vp_version;<br>
><br>
>      switch (dec->fmt_in.i_codec)<br>
> @@ -212,6 +283,7 @@ static int OpenDecoder(vlc_object_t *p_this)<br>
> #endif<br>
> #ifdef ENABLE_VP9_DECODER<br>
>      case VLC_CODEC_VP9:<br>
> +        codec_caps = vpx_codec_get_caps(vpx_codec_vp9_cx());<br>
>          iface = &vpx_codec_vp9_dx_algo;<br>
>          vp_version = 9;<br>
>          break;<br>
> @@ -238,12 +310,13 @@ static int OpenDecoder(vlc_object_t *p_this)<br>
>          return VLC_EGENERIC;;<br>
>      }<br>
><br>
> +    dec->p_sys->codec_caps = codec_caps;<br>
> +<br>
>      dec->pf_decode_video = Decode;<br>
><br>
>      dec->fmt_out.i_cat = VIDEO_ES;<br>
>      dec->fmt_out.video.i_width = dec->fmt_in.video.i_width;<br>
>      dec->fmt_out.video.i_height = dec->fmt_in.video.i_height;<br>
> -    dec->fmt_out.i_codec = VLC_CODEC_I420;<br>
><br>
>      return VLC_SUCCESS;<br>
> }<br>
> -- <br>
> 2.10.0<br>
><br>
> _______________________________________________<br>
> vlc-devel mailing list<br>
> To unsubscribe or modify your subscription options:<br>
> https://mailman.videolan.org/listinfo/vlc-devel<br></p>