From e1319aa1c1be9b64117c19170344fb78841dd67c Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Fri, 10 Jul 2015 14:45:14 +0200 Subject: [PATCH] libx264: Add support for the MPEG2 encoder --- configure | 6 +++++- libavcodec/Makefile | 1 + libavcodec/allcodecs.c | 1 + libavcodec/libx264.c | 49 ++++++++++++++++++++++++++++++++++++------ 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/configure b/configure index 28115d3adb..31b97c3ee0 100755 --- a/configure +++ b/configure @@ -1607,6 +1607,7 @@ CONFIG_EXTRA=" imdct15 intrax8 jpegtables + libx262 lgplv3 lpc me_cmp @@ -2108,6 +2109,7 @@ libvpx_vp9_decoder_deps="libvpx" libvpx_vp9_encoder_deps="libvpx" libwavpack_encoder_deps="libwavpack" libwebp_encoder_deps="libwebp" +libx262_encoder_deps="libx262" libx264_encoder_deps="libx264" libx265_encoder_deps="libx265" libxavs_encoder_deps="libxavs" @@ -4351,7 +4353,9 @@ enabled libwavpack && require libwavpack wavpack/wavpack.h WavpackOpenFil enabled libwebp && require_pkg_config libwebp webp/encode.h WebPGetEncoderVersion enabled libx264 && require_pkg_config x264 "stdint.h x264.h" x264_encoder_encode && { check_cpp_condition x264.h "X264_BUILD >= 118" || - die "ERROR: libx264 version must be >= 0.118."; } + die "ERROR: libx264 version must be >= 0.118."; } && + { check_cpp_condition x264.h "X264_MPEG2" && + enable libx262; } enabled libx265 && require_pkg_config x265 x265.h x265_api_get && { check_cpp_condition x265.h "X265_BUILD >= 57" || die "ERROR: libx265 version must be >= 57."; } diff --git a/libavcodec/Makefile b/libavcodec/Makefile index d933ffd77f..008207b000 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -671,6 +671,7 @@ 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_LIBWEBP_ENCODER) += libwebpenc.o +OBJS-$(CONFIG_LIBX262_ENCODER) += libx264.o OBJS-$(CONFIG_LIBX264_ENCODER) += libx264.o OBJS-$(CONFIG_LIBX265_ENCODER) += libx265.o OBJS-$(CONFIG_LIBXAVS_ENCODER) += libxavs.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index a3f1550f2f..9fdbe8fc19 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -473,6 +473,7 @@ void avcodec_register_all(void) REGISTER_ENCDEC (LIBVPX_VP9, libvpx_vp9); REGISTER_ENCODER(LIBWAVPACK, libwavpack); REGISTER_ENCODER(LIBWEBP, libwebp); + REGISTER_ENCODER(LIBX262, libx262); REGISTER_ENCODER(LIBX264, libx264); REGISTER_ENCODER(LIBX265, libx265); REGISTER_ENCODER(LIBXAVS, libxavs); diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index 7c502fd53b..5d257ef889 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -323,7 +323,14 @@ static av_cold int X264_init(AVCodecContext *avctx) { X264Context *x4 = avctx->priv_data; +#if CONFIG_LIBX262_ENCODER + if (avctx->codec_id == AV_CODEC_ID_MPEG2VIDEO) { + x4->params.b_mpeg2 = 1; + x264_param_default_mpeg2(&x4->params); + } else +#else x264_param_default(&x4->params); +#endif x4->params.b_deblocking_filter = avctx->flags & CODEC_FLAG_LOOP_FILTER; @@ -663,13 +670,6 @@ static const AVOption options[] = { { NULL }, }; -static const AVClass class = { - .class_name = "libx264", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; - static const AVCodecDefault x264_defaults[] = { { "b", "0" }, { "bf", "-1" }, @@ -698,6 +698,14 @@ static const AVCodecDefault x264_defaults[] = { { NULL }, }; +#if CONFIG_LIBX264_ENCODER +static const AVClass class = { + .class_name = "libx264", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + AVCodec ff_libx264_encoder = { .name = "libx264", .long_name = NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"), @@ -714,3 +722,30 @@ AVCodec ff_libx264_encoder = { .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, }; +#endif + +#if CONFIG_LIBX262_ENCODER +static const AVClass X262_class = { + .class_name = "libx262", + .item_name = av_default_item_name, + .option = options, + .version = LIBAVUTIL_VERSION_INT, +}; + +AVCodec ff_libx262_encoder = { + .name = "libx262", + .long_name = NULL_IF_CONFIG_SMALL("libx262 MPEG2VIDEO"), + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_MPEG2VIDEO, + .priv_data_size = sizeof(X264Context), + .init = X264_init, + .encode2 = X264_frame, + .close = X264_close, + .capabilities = CODEC_CAP_DELAY | CODEC_CAP_AUTO_THREADS, + .priv_class = &X262_class, + .defaults = x264_defaults, + .pix_fmts = pix_fmts_8bit, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | + FF_CODEC_CAP_INIT_CLEANUP, +}; +#endif