diff --git a/libavcodec/Makefile b/libavcodec/Makefile index a44ceec065..6cd18de965 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -733,8 +733,8 @@ OBJS-$(CONFIG_LIBVORBIS_ENCODER) += libvorbisenc.o \ vorbis_data.o vorbis_parser.o xiph.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..9ff2e91bc4 --- /dev/null +++ b/libavcodec/libvpx.c @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2013 Guillaume Martres + * + * This file is part of FFmpeg. + * + * FFmpeg 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. + * + * FFmpeg 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 FFmpeg; 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..2c901f92ef --- /dev/null +++ b/libavcodec/libvpx.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2013 Guillaume Martres + * + * This file is part of FFmpeg. + * + * FFmpeg 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. + * + * FFmpeg 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 FFmpeg; 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 b2471c722b..8d608c3860 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_DR1 | CODEC_CAP_EXPERIMENTAL, + .capabilities = CODEC_CAP_AUTO_THREADS | CODEC_CAP_DR1, }; #endif /* CONFIG_LIBVPX_VP9_DECODER */ diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c index 65586cf02a..8883801e1b 100644 --- a/libavcodec/libvpxenc.c +++ b/libavcodec/libvpxenc.c @@ -31,6 +31,7 @@ #include "avcodec.h" #include "internal.h" #include "libavutil/avassert.h" +#include "libvpx.h" #include "libavutil/base64.h" #include "libavutil/common.h" #include "libavutil/intreadwrite.h" @@ -849,6 +850,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); } @@ -868,7 +872,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,