On 27/05/15 1:15 PM, Vittorio Giovara wrote:
> Bump the minimum libvpx version to 1.4.0 so that all pixel
> formats are present. Add new VP9 profiles.
> 
> Signed-off-by: Vittorio Giovara <vittorio.giov...@gmail.com>
> ---
> Modified as requested.
> Vittorio
> 
>  configure              | 23 +++++++++++++++------
>  libavcodec/avcodec.h   |  4 ++++
>  libavcodec/libvpx.c    | 56 
> ++++++++++++++++++++++++++++++++++++++++++--------
>  libavcodec/libvpx.h    |  3 ++-
>  libavcodec/libvpxdec.c |  7 ++-----
>  libavcodec/libvpxenc.c | 32 +++++++++++++++++++++--------
>  libavcodec/version.h   |  2 +-
>  7 files changed, 97 insertions(+), 30 deletions(-)
> 
> diff --git a/configure b/configure
> index 863e33b..e26fc54 100755
> --- a/configure
> +++ b/configure
> @@ -4274,12 +4274,23 @@ enabled libvo_aacenc      && require libvo_aacenc 
> vo-aacenc/voAAC.h voGetAACEncA
>  enabled libvo_amrwbenc    && require libvo_amrwbenc vo-amrwbenc/enc_if.h 
> E_IF_init -lvo-amrwbenc
>  enabled libvorbis         && require libvorbis vorbis/vorbisenc.h 
> vorbis_info_init -lvorbisenc -lvorbis -logg
>  enabled libvpx            && {
> -    enabled libvpx_vp8_decoder && { check_lib2 "vpx/vpx_decoder.h 
> vpx/vp8dx.h" vpx_codec_dec_init_ver -lvpx ||
> -                                    die "ERROR: libvpx decoder version must 
> be >=0.9.1"; }
> -    enabled libvpx_vp8_encoder && { check_lib2 "vpx/vpx_encoder.h 
> vpx/vp8cx.h" "vpx_codec_enc_init_ver VPX_CQ" -lvpx ||
> -                                    die "ERROR: libvpx encoder version must 
> be >=0.9.6"; }
> -    enabled libvpx_vp9_decoder && { check_lib2 "vpx/vpx_decoder.h 
> vpx/vp8dx.h" "vpx_codec_vp9_dx" -lvpx || disable libvpx_vp9_decoder; }
> -    enabled libvpx_vp9_encoder && { check_lib2 "vpx/vpx_encoder.h 
> vpx/vp8cx.h" "vpx_codec_vp9_cx" -lvpx || disable libvpx_vp9_encoder; } }
> +    enabled libvpx_vp8_decoder && {
> +        require "vpx >= 1.4.0" vpx/vpx_decoder.h vpx_codec_dec_init_ver 
> -lvpx ||
> +            die "ERROR: libvpx encoder version must be >=1.4.0";

As Luca said, require_pkg_config. If you use require, "vpx >= 1.4.0" is just 
used as a name
to report a failure. It does not check for that version.
Also, all require functions terminate configure with an error if the check 
fails, so these
custom die calls are dead code. If you want to use your own custom error, use 
use_pkg_config
instead.

> +    }
> +    enabled libvpx_vp8_encoder && {
> +        require "vpx >= 1.4.0" vpx/vpx_encoder.h vpx_codec_enc_init_ver 
> -lvpx ||
> +            die "ERROR: libvpx encoder version must be >=1.4.0";
> +    }
> +    enabled libvpx_vp9_decoder && {
> +        require "vpx >= 1.4.0" vpx/vpx_decoder.h vpx_codec_dec_init_ver 
> -lvpx ||
> +            disable libvpx_vp9_decoder;
> +    }
> +    enabled libvpx_vp9_encoder && {
> +        require "vpx >= 1.4.0" vpx/vpx_encoder.h vpx_codec_enc_init_ver 
> -lvpx ||
> +            disable libvpx_vp9_encoder;
> +    }
> +}
>  enabled libwavpack        && require libwavpack wavpack/wavpack.h 
> WavpackOpenFileOutput  -lwavpack
>  enabled libwebp           && require_pkg_config libwebp webp/encode.h 
> WebPGetEncoderVersion
>  enabled libx264           && require_pkg_config x264 "stdint.h x264.h" 
> x264_encoder_encode &&
> diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
> index 3440126..16af20c 100644
> --- a/libavcodec/avcodec.h
> +++ b/libavcodec/avcodec.h
> @@ -2702,6 +2702,10 @@ typedef struct AVCodecContext {
>  #define FF_PROFILE_JPEG2000_DCINEMA_2K              3
>  #define FF_PROFILE_JPEG2000_DCINEMA_4K              4
>  
> +#define FF_PROFILE_VP9_0                            0
> +#define FF_PROFILE_VP9_1                            1
> +#define FF_PROFILE_VP9_2                            2
> +#define FF_PROFILE_VP9_3                            3

Even if it's a simple change, credit where credit is due would be nice.

>  
>  #define FF_PROFILE_HEVC_MAIN                        1
>  #define FF_PROFILE_HEVC_MAIN_10                     2
> diff --git a/libavcodec/libvpx.c b/libavcodec/libvpx.c
> index 20f4484..603ed13 100644
> --- a/libavcodec/libvpx.c
> +++ b/libavcodec/libvpx.c
> @@ -22,14 +22,54 @@
>  
>  #include "libvpx.h"
>  
> -int ff_vp9_check_experimental(AVCodecContext *avctx)
> +enum AVPixelFormat ff_vpx_imgfmt_to_pixfmt(vpx_img_fmt_t img)
>  {
> -    if (avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL &&
> -        (vpx_codec_version_major() < 1 ||
> -         (vpx_codec_version_major() == 1 && vpx_codec_version_minor() < 3))) 
> {
> -        av_log(avctx, AV_LOG_ERROR,
> -               "Non-experimental support of VP9 requires libvpx >= 1.3.0\n");
> -        return AVERROR_EXPERIMENTAL;
> +    switch (img) {
> +    case VPX_IMG_FMT_RGB24:     return AV_PIX_FMT_RGB24;
> +    case VPX_IMG_FMT_RGB565:    return AV_PIX_FMT_RGB565BE;
> +    case VPX_IMG_FMT_RGB555:    return AV_PIX_FMT_RGB555BE;
> +    case VPX_IMG_FMT_UYVY:      return AV_PIX_FMT_UYVY422;
> +    case VPX_IMG_FMT_YUY2:      return AV_PIX_FMT_YUYV422;
> +    case VPX_IMG_FMT_YVYU:      return AV_PIX_FMT_YVYU422;
> +    case VPX_IMG_FMT_BGR24:     return AV_PIX_FMT_BGR24;
> +    case VPX_IMG_FMT_ARGB:      return AV_PIX_FMT_ARGB;
> +    case VPX_IMG_FMT_ARGB_LE:   return AV_PIX_FMT_BGRA;
> +    case VPX_IMG_FMT_RGB565_LE: return AV_PIX_FMT_RGB565LE;
> +    case VPX_IMG_FMT_RGB555_LE: return AV_PIX_FMT_RGB555LE;
> +    case VPX_IMG_FMT_I420:      return AV_PIX_FMT_YUV420P;
> +    case VPX_IMG_FMT_I422:      return AV_PIX_FMT_YUV422P;
> +    case VPX_IMG_FMT_I444:      return AV_PIX_FMT_YUV444P;
> +    case VPX_IMG_FMT_I440:      return AV_PIX_FMT_YUV440P;
> +    case VPX_IMG_FMT_444A:      return AV_PIX_FMT_YUVA444P;
> +    case VPX_IMG_FMT_I42016:    return AV_PIX_FMT_YUV420P16BE;
> +    case VPX_IMG_FMT_I42216:    return AV_PIX_FMT_YUV422P16BE;
> +    case VPX_IMG_FMT_I44416:    return AV_PIX_FMT_YUV444P16BE;
> +    default:                    return AV_PIX_FMT_NONE;
> +    }
> +}
> +
> +vpx_img_fmt_t ff_vpx_pixfmt_to_imgfmt(enum AVPixelFormat pix)
> +{
> +    switch (pix) {
> +    case AV_PIX_FMT_RGB24:        return VPX_IMG_FMT_RGB24;
> +    case AV_PIX_FMT_RGB565BE:     return VPX_IMG_FMT_RGB565;
> +    case AV_PIX_FMT_RGB555BE:     return VPX_IMG_FMT_RGB555;
> +    case AV_PIX_FMT_UYVY422:      return VPX_IMG_FMT_UYVY;
> +    case AV_PIX_FMT_YUYV422:      return VPX_IMG_FMT_YUY2;
> +    case AV_PIX_FMT_YVYU422:      return VPX_IMG_FMT_YVYU;
> +    case AV_PIX_FMT_BGR24:        return VPX_IMG_FMT_BGR24;
> +    case AV_PIX_FMT_ARGB:         return VPX_IMG_FMT_ARGB;
> +    case AV_PIX_FMT_BGRA:         return VPX_IMG_FMT_ARGB_LE;
> +    case AV_PIX_FMT_RGB565LE:     return VPX_IMG_FMT_RGB565_LE;
> +    case AV_PIX_FMT_RGB555LE:     return VPX_IMG_FMT_RGB555_LE;
> +    case AV_PIX_FMT_YUV420P:      return VPX_IMG_FMT_I420;
> +    case AV_PIX_FMT_YUV422P:      return VPX_IMG_FMT_I422;
> +    case AV_PIX_FMT_YUV444P:      return VPX_IMG_FMT_I444;
> +    case AV_PIX_FMT_YUV440P:      return VPX_IMG_FMT_I440;
> +    case AV_PIX_FMT_YUVA444P:     return VPX_IMG_FMT_444A;
> +    case AV_PIX_FMT_YUV420P16BE:  return VPX_IMG_FMT_I42016;
> +    case AV_PIX_FMT_YUV422P16BE:  return VPX_IMG_FMT_I42216;
> +    case AV_PIX_FMT_YUV444P16BE:  return VPX_IMG_FMT_I44416;

You're not checking for img->bit_depth. Did you test decoding samples using 
these color
spaces?

> +    default:                      return VPX_IMG_FMT_NONE;
>      }
> -    return 0;
>  }
> diff --git a/libavcodec/libvpx.h b/libavcodec/libvpx.h
> index cb1ed09..b990b76 100644
> --- a/libavcodec/libvpx.h
> +++ b/libavcodec/libvpx.h
> @@ -23,6 +23,7 @@
>  
>  #include "avcodec.h"
>  
> -int ff_vp9_check_experimental(AVCodecContext *avctx);
> +enum AVPixelFormat ff_vpx_imgfmt_to_pixfmt(vpx_img_fmt_t img);
> +vpx_img_fmt_t ff_vpx_pixfmt_to_imgfmt(enum AVPixelFormat pix);
>  
>  #endif /* AVCODEC_LIBVPX_H */
> diff --git a/libavcodec/libvpxdec.c b/libavcodec/libvpxdec.c
> index 6052207..47c8067 100644
> --- a/libavcodec/libvpxdec.c
> +++ b/libavcodec/libvpxdec.c
> @@ -56,7 +56,6 @@ static av_cold int vpx_init(AVCodecContext *avctx,
>          return AVERROR(EINVAL);
>      }
>  
> -    avctx->pix_fmt = AV_PIX_FMT_YUV420P;
>      return 0;
>  }
>  
> @@ -82,7 +81,8 @@ static int vp8_decode(AVCodecContext *avctx,
>      }
>  
>      if ((img = vpx_codec_get_frame(&ctx->decoder, &iter))) {
> -        if (img->fmt != VPX_IMG_FMT_I420) {
> +        avctx->pix_fmt = ff_vpx_imgfmt_to_pixfmt(img->fmt);
> +        if (avctx->pix_fmt == AV_PIX_FMT_NONE) {
>              av_log(avctx, AV_LOG_ERROR, "Unsupported output colorspace 
> (%d)\n",
>                     img->fmt);
>              return AVERROR_INVALIDDATA;
> @@ -133,9 +133,6 @@ AVCodec ff_libvpx_vp8_decoder = {
>  #if CONFIG_LIBVPX_VP9_DECODER
>  static av_cold int vp9_init(AVCodecContext *avctx)
>  {
> -    int ret;
> -    if ((ret = ff_vp9_check_experimental(avctx)))
> -        return ret;
>      return vpx_init(avctx, &vpx_codec_vp9_dx_algo);
>  }
>  
> diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c
> index 4164769..16d239d 100644
> --- a/libavcodec/libvpxenc.c
> +++ b/libavcodec/libvpxenc.c
> @@ -220,7 +220,7 @@ static av_cold int vpx_init(AVCodecContext *avctx,
>                              const struct vpx_codec_iface *iface)
>  {
>      VP8Context *ctx = avctx->priv_data;
> -    struct vpx_codec_enc_cfg enccfg;
> +    struct vpx_codec_enc_cfg enccfg = { 0 };
>      int res;
>  
>      av_log(avctx, AV_LOG_INFO, "%s\n", vpx_codec_version_str());
> @@ -321,8 +321,12 @@ static av_cold int vpx_init(AVCodecContext *avctx,
>      /* 0-3: For non-zero values the encoder increasingly optimizes for 
> reduced
>         complexity playback on low powered devices at the expense of encode
>         quality. */
> -   if (avctx->profile != FF_PROFILE_UNKNOWN)
> -       enccfg.g_profile = avctx->profile;
> +    if (avctx->profile != FF_PROFILE_UNKNOWN)
> +        enccfg.g_profile = avctx->profile;
> +    else if (avctx->pix_fmt == AV_PIX_FMT_YUV440P)
> +        avctx->profile = enccfg.g_profile = FF_PROFILE_VP9_0;
> +    else
> +        avctx->profile = enccfg.g_profile = FF_PROFILE_VP9_1;

This is wrong.

Profile 0 = 8 bit yuv420p
Profile 1 = 8 bit yuv422/440/444p
Profile 2 = 10/12 bit yuv420p
Profile 3 = 10/12 bit yuv422/440/444p

>  
>      enccfg.g_error_resilient = ctx->error_resilient;
>  
> @@ -361,8 +365,8 @@ static av_cold int vpx_init(AVCodecContext *avctx,
>      codecctl_int(avctx, VP8E_SET_CQ_LEVEL,          ctx->crf);
>  
>      //provide dummy value to initialize wrapper, values will be updated each 
> _encode()
> -    vpx_img_wrap(&ctx->rawimg, VPX_IMG_FMT_I420, avctx->width, 
> avctx->height, 1,
> -                 (unsigned char*)1);
> +    vpx_img_wrap(&ctx->rawimg, ff_vpx_pixfmt_to_imgfmt(avctx->pix_fmt),
> +                 avctx->width, avctx->height, 1, (unsigned char *)1);
>  
>      avctx->coded_frame = av_frame_alloc();
>      if (!avctx->coded_frame) {
> @@ -620,9 +624,6 @@ AVCodec ff_libvpx_vp8_encoder = {
>  #if CONFIG_LIBVPX_VP9_ENCODER
>  static av_cold int vp9_init(AVCodecContext *avctx)
>  {
> -    int ret;
> -    if ((ret = ff_vp9_check_experimental(avctx)))
> -        return ret;
>      return vpx_init(avctx, &vpx_codec_vp9_cx_algo);
>  }
>  
> @@ -633,6 +634,14 @@ static const AVClass class_vp9 = {
>      .version    = LIBAVUTIL_VERSION_INT,
>  };
>  
> +static const AVProfile profiles[] = {
> +    { FF_PROFILE_VP9_0, "Profile 0" },
> +    { FF_PROFILE_VP9_1, "Profile 1" },
> +    { FF_PROFILE_VP9_2, "Profile 2" },
> +    { FF_PROFILE_VP9_3, "Profile 3" },
> +    { FF_PROFILE_UNKNOWN },
> +};
> +
>  AVCodec ff_libvpx_vp9_encoder = {
>      .name           = "libvpx-vp9",
>      .long_name      = NULL_IF_CONFIG_SMALL("libvpx VP9"),
> @@ -643,7 +652,12 @@ AVCodec ff_libvpx_vp9_encoder = {
>      .encode2        = vp8_encode,
>      .close          = vp8_free,
>      .capabilities   = CODEC_CAP_DELAY | CODEC_CAP_AUTO_THREADS,
> -    .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, 
> AV_PIX_FMT_NONE },
> +    .pix_fmts       = (const enum AVPixelFormat[]) {
> +        AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P,
> +        AV_PIX_FMT_YUV440P,
> +        AV_PIX_FMT_NONE,

What's the point setting up all those pix_fmts above if you're not allowing 
their usage
here?

> +    },
> +    .profiles       = NULL_IF_CONFIG_SMALL(profiles),
>      .priv_class     = &class_vp9,
>      .defaults       = defaults,
>  };
> diff --git a/libavcodec/version.h b/libavcodec/version.h
> index c57bd85..6105a63 100644
> --- a/libavcodec/version.h
> +++ b/libavcodec/version.h
> @@ -29,7 +29,7 @@
>  #include "libavutil/version.h"
>  
>  #define LIBAVCODEC_VERSION_MAJOR 56
> -#define LIBAVCODEC_VERSION_MINOR 25
> +#define LIBAVCODEC_VERSION_MINOR 26
>  #define LIBAVCODEC_VERSION_MICRO  0
>  
>  #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
> 

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to