From 9aa053ceded5550b2e538578af383fd89d82364c Mon Sep 17 00:00:00 2001 From: Guillaume Martres Date: Fri, 15 Nov 2013 23:28:30 +0100 Subject: [PATCH] libvpx: do not mark VP9 as experimental when using libvpx >= 1.3.0 Signed-off-by: Diego Biurrun --- libavcodec/Makefile | 4 ++-- libavcodec/libvpx.c | 35 +++++++++++++++++++++++++++++++++++ libavcodec/libvpx.h | 28 ++++++++++++++++++++++++++++ libavcodec/libvpxdec.c | 6 +++++- libavcodec/libvpxenc.c | 6 +++++- 5 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 libavcodec/libvpx.c create mode 100644 libavcodec/libvpx.h diff --git a/libavcodec/Makefile b/libavcodec/Makefile index a4314bb3db..4a304ec320 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -611,8 +611,8 @@ OBJS-$(CONFIG_LIBVORBIS_ENCODER) += libvorbis.o \ vorbis_data.o vorbis_parser.o OBJS-$(CONFIG_LIBVPX_VP8_DECODER) += libvpxdec.o OBJS-$(CONFIG_LIBVPX_VP8_ENCODER) += libvpxenc.o -OBJS-$(CONFIG_LIBVPX_VP9_DECODER) += libvpxdec.o -OBJS-$(CONFIG_LIBVPX_VP9_ENCODER) += libvpxenc.o +OBJS-$(CONFIG_LIBVPX_VP9_DECODER) += libvpxdec.o libvpx.o +OBJS-$(CONFIG_LIBVPX_VP9_ENCODER) += libvpxenc.o libvpx.o OBJS-$(CONFIG_LIBWAVPACK_ENCODER) += libwavpackenc.o OBJS-$(CONFIG_LIBX264_ENCODER) += libx264.o OBJS-$(CONFIG_LIBXAVS_ENCODER) += libxavs.o diff --git a/libavcodec/libvpx.c b/libavcodec/libvpx.c new file mode 100644 index 0000000000..20f44841f2 --- /dev/null +++ b/libavcodec/libvpx.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2013 Guillaume Martres + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + +#include "libvpx.h" + +int ff_vp9_check_experimental(AVCodecContext *avctx) +{ + 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; + } + return 0; +} diff --git a/libavcodec/libvpx.h b/libavcodec/libvpx.h new file mode 100644 index 0000000000..cb1ed0959f --- /dev/null +++ b/libavcodec/libvpx.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2013 Guillaume Martres + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_LIBVPX_H +#define AVCODEC_LIBVPX_H + +#include "avcodec.h" + +int ff_vp9_check_experimental(AVCodecContext *avctx); + +#endif /* AVCODEC_LIBVPX_H */ diff --git a/libavcodec/libvpxdec.c b/libavcodec/libvpxdec.c index d65f7f95ce..6052207b76 100644 --- a/libavcodec/libvpxdec.c +++ b/libavcodec/libvpxdec.c @@ -31,6 +31,7 @@ #include "libavutil/imgutils.h" #include "avcodec.h" #include "internal.h" +#include "libvpx.h" typedef struct VP8DecoderContext { struct vpx_codec_ctx decoder; @@ -132,6 +133,9 @@ 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); } @@ -144,6 +148,6 @@ AVCodec ff_libvpx_vp9_decoder = { .init = vp9_init, .close = vp8_free, .decode = vp8_decode, - .capabilities = CODEC_CAP_AUTO_THREADS | CODEC_CAP_EXPERIMENTAL, + .capabilities = CODEC_CAP_AUTO_THREADS, }; #endif /* CONFIG_LIBVPX_VP9_DECODER */ diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c index 9996afc74c..ce8ea33149 100644 --- a/libavcodec/libvpxenc.c +++ b/libavcodec/libvpxenc.c @@ -30,6 +30,7 @@ #include "avcodec.h" #include "internal.h" +#include "libvpx.h" #include "libavutil/base64.h" #include "libavutil/common.h" #include "libavutil/mathematics.h" @@ -605,6 +606,9 @@ 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); } @@ -624,7 +628,7 @@ AVCodec ff_libvpx_vp9_encoder = { .init = vp9_init, .encode2 = vp8_encode, .close = vp8_free, - .capabilities = CODEC_CAP_DELAY | CODEC_CAP_AUTO_THREADS | CODEC_CAP_EXPERIMENTAL, + .capabilities = CODEC_CAP_DELAY | CODEC_CAP_AUTO_THREADS, .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, .priv_class = &class_vp9, .defaults = defaults,