From 096c87f667ab8cdfc4fd290c80421a80c842adca Mon Sep 17 00:00:00 2001 From: Jason Garrett-Glaser Date: Tue, 24 Nov 2009 15:49:34 +0000 Subject: [PATCH] Add weightp support in API for libx264. ffmpeg can encode baseline profile again. Originally committed as revision 20600 to svn://svn.ffmpeg.org/ffmpeg/trunk --- configure | 4 ++-- ffpresets/libx264-baseline.ffpreset | 1 + ffpresets/libx264-default.ffpreset | 1 + ffpresets/libx264-fastfirstpass.ffpreset | 3 ++- ffpresets/libx264-hq.ffpreset | 1 + ffpresets/libx264-ipod320.ffpreset | 1 + ffpresets/libx264-ipod640.ffpreset | 1 + ffpresets/libx264-lossless_fast.ffpreset | 1 + ffpresets/libx264-lossless_max.ffpreset | 1 + ffpresets/libx264-lossless_medium.ffpreset | 1 + ffpresets/libx264-lossless_slow.ffpreset | 1 + ffpresets/libx264-lossless_slower.ffpreset | 1 + ffpresets/libx264-max.ffpreset | 1 + ffpresets/libx264-normal.ffpreset | 1 + ffpresets/libx264-slowfirstpass.ffpreset | 1 + libavcodec/avcodec.h | 12 +++++++++++- libavcodec/libx264.c | 1 + libavcodec/options.c | 1 + 18 files changed, 30 insertions(+), 4 deletions(-) diff --git a/configure b/configure index 13e53d136..2b7cbd8db 100755 --- a/configure +++ b/configure @@ -2378,8 +2378,8 @@ enabled libspeex && require libspeex speex/speex.h speex_decoder_init -lspeex enabled libtheora && require libtheora theora/theoraenc.h th_info_init -ltheoraenc -ltheoradec -logg enabled libvorbis && require libvorbis vorbis/vorbisenc.h vorbis_info_init -lvorbisenc -lvorbis -logg enabled libx264 && require libx264 x264.h x264_encoder_encode -lx264 -lm && - { check_cpp_condition x264.h "X264_BUILD >= 78" || - die "ERROR: libx264 version must be >= 0.78."; } + { check_cpp_condition x264.h "X264_BUILD >= 79" || + die "ERROR: libx264 version must be >= 0.79."; } enabled libxvid && require libxvid xvid.h xvid_global -lxvidcore enabled mlib && require mediaLib mlib_types.h mlib_VectorSub_S16_U8_Mod -lmlib diff --git a/ffpresets/libx264-baseline.ffpreset b/ffpresets/libx264-baseline.ffpreset index 47664189b..ee7654bde 100644 --- a/ffpresets/libx264-baseline.ffpreset +++ b/ffpresets/libx264-baseline.ffpreset @@ -1,3 +1,4 @@ coder=0 bf=0 flags2=-wpred-dct8x8 +wpredp=0 diff --git a/ffpresets/libx264-default.ffpreset b/ffpresets/libx264-default.ffpreset index 1377530e7..75191e21b 100644 --- a/ffpresets/libx264-default.ffpreset +++ b/ffpresets/libx264-default.ffpreset @@ -19,3 +19,4 @@ refs=3 directpred=1 trellis=1 flags2=+mixed_refs+wpred+dct8x8+fastpskip +wpredp=2 diff --git a/ffpresets/libx264-fastfirstpass.ffpreset b/ffpresets/libx264-fastfirstpass.ffpreset index 20aecf1c8..7278f771e 100644 --- a/ffpresets/libx264-fastfirstpass.ffpreset +++ b/ffpresets/libx264-fastfirstpass.ffpreset @@ -3,7 +3,7 @@ flags=+loop cmp=+chroma partitions=-parti8x8-parti4x4-partp8x8-partp4x4-partb8x8 me_method=dia -subq=1 +subq=2 me_range=16 g=250 keyint_min=25 @@ -19,3 +19,4 @@ refs=1 directpred=3 trellis=0 flags2=-bpyramid-wpred-mixed_refs-dct8x8+fastpskip +wpredp=2 diff --git a/ffpresets/libx264-hq.ffpreset b/ffpresets/libx264-hq.ffpreset index 32b64f179..9c14d8f55 100644 --- a/ffpresets/libx264-hq.ffpreset +++ b/ffpresets/libx264-hq.ffpreset @@ -19,3 +19,4 @@ refs=4 directpred=3 trellis=1 flags2=+wpred+mixed_refs+dct8x8+fastpskip +wpredp=2 diff --git a/ffpresets/libx264-ipod320.ffpreset b/ffpresets/libx264-ipod320.ffpreset index 89441c7de..943b52134 100644 --- a/ffpresets/libx264-ipod320.ffpreset +++ b/ffpresets/libx264-ipod320.ffpreset @@ -4,3 +4,4 @@ flags2=-wpred-dct8x8 level=13 maxrate=768000 bufsize=3000000 +wpredp=0 diff --git a/ffpresets/libx264-ipod640.ffpreset b/ffpresets/libx264-ipod640.ffpreset index fd58e2ad7..1ed3d9fb2 100644 --- a/ffpresets/libx264-ipod640.ffpreset +++ b/ffpresets/libx264-ipod640.ffpreset @@ -5,3 +5,4 @@ flags2=-wpred-dct8x8 level=30 maxrate=10000000 bufsize=10000000 +wpredp=0 diff --git a/ffpresets/libx264-lossless_fast.ffpreset b/ffpresets/libx264-lossless_fast.ffpreset index dcf418afd..ea08d3c00 100644 --- a/ffpresets/libx264-lossless_fast.ffpreset +++ b/ffpresets/libx264-lossless_fast.ffpreset @@ -17,3 +17,4 @@ qdiff=4 directpred=1 flags2=+fastpskip cqp=0 +wpredp=0 diff --git a/ffpresets/libx264-lossless_max.ffpreset b/ffpresets/libx264-lossless_max.ffpreset index b8506c227..8c049c9c9 100644 --- a/ffpresets/libx264-lossless_max.ffpreset +++ b/ffpresets/libx264-lossless_max.ffpreset @@ -18,3 +18,4 @@ refs=16 directpred=1 flags2=+mixed_refs+dct8x8+fastpskip cqp=0 +wpredp=2 diff --git a/ffpresets/libx264-lossless_medium.ffpreset b/ffpresets/libx264-lossless_medium.ffpreset index 99fb6b9d0..558be6c93 100644 --- a/ffpresets/libx264-lossless_medium.ffpreset +++ b/ffpresets/libx264-lossless_medium.ffpreset @@ -17,3 +17,4 @@ qdiff=4 directpred=1 flags2=+fastpskip cqp=0 +wpredp=2 diff --git a/ffpresets/libx264-lossless_slow.ffpreset b/ffpresets/libx264-lossless_slow.ffpreset index 2ecb55b07..ff641cf40 100644 --- a/ffpresets/libx264-lossless_slow.ffpreset +++ b/ffpresets/libx264-lossless_slow.ffpreset @@ -18,3 +18,4 @@ refs=2 directpred=1 flags2=+dct8x8+fastpskip cqp=0 +wpredp=2 diff --git a/ffpresets/libx264-lossless_slower.ffpreset b/ffpresets/libx264-lossless_slower.ffpreset index dd499c7af..854f74b23 100644 --- a/ffpresets/libx264-lossless_slower.ffpreset +++ b/ffpresets/libx264-lossless_slower.ffpreset @@ -18,3 +18,4 @@ refs=4 directpred=1 flags2=+mixed_refs+dct8x8+fastpskip cqp=0 +wpredp=2 diff --git a/ffpresets/libx264-max.ffpreset b/ffpresets/libx264-max.ffpreset index fe498bb29..667ba85fe 100644 --- a/ffpresets/libx264-max.ffpreset +++ b/ffpresets/libx264-max.ffpreset @@ -19,3 +19,4 @@ refs=16 directpred=3 trellis=2 flags2=+wpred+mixed_refs+dct8x8-fastpskip +wpredp=2 diff --git a/ffpresets/libx264-normal.ffpreset b/ffpresets/libx264-normal.ffpreset index c0a6c8ec1..ee790b643 100644 --- a/ffpresets/libx264-normal.ffpreset +++ b/ffpresets/libx264-normal.ffpreset @@ -19,3 +19,4 @@ refs=2 directpred=3 trellis=0 flags2=+wpred+dct8x8+fastpskip +wpredp=2 diff --git a/ffpresets/libx264-slowfirstpass.ffpreset b/ffpresets/libx264-slowfirstpass.ffpreset index 280c336dc..fe073310d 100644 --- a/ffpresets/libx264-slowfirstpass.ffpreset +++ b/ffpresets/libx264-slowfirstpass.ffpreset @@ -19,3 +19,4 @@ refs=1 directpred=3 trellis=0 flags2=+wpred+dct8x8+fastpskip +wpredp=2 diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index ac3b80380..f4fe7d676 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -30,7 +30,7 @@ #include "libavutil/avutil.h" #define LIBAVCODEC_VERSION_MAJOR 52 -#define LIBAVCODEC_VERSION_MINOR 41 +#define LIBAVCODEC_VERSION_MINOR 42 #define LIBAVCODEC_VERSION_MICRO 0 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ @@ -2554,6 +2554,16 @@ typedef struct AVCodecContext { * - decoding: Set by libavcodec, user can override. */ int (*execute2)(struct AVCodecContext *c, int (*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count); + + /** + * explicit P-frame weighted prediction analysis method + * 0: off + * 1: fast blind weighting (one reference duplicate with -1 offset) + * 2: smart weighting (full fade detection analysis) + * - encoding: Set by user. + * - decoding: unused + */ + int weighted_p_pred; } AVCodecContext; /** diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index 3a3f1e517..05c29805d 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -228,6 +228,7 @@ static av_cold int X264_init(AVCodecContext *avctx) x4->params.analyse.i_direct_mv_pred = avctx->directpred; x4->params.analyse.b_weighted_bipred = avctx->flags2 & CODEC_FLAG2_WPRED; + x4->params.analyse.i_weighted_pred = avctx->weighted_p_pred; if (avctx->me_method == ME_EPZS) x4->params.analyse.i_me_method = X264_ME_DIA; diff --git a/libavcodec/options.c b/libavcodec/options.c index dbfdf7068..ded294e1b 100644 --- a/libavcodec/options.c +++ b/libavcodec/options.c @@ -124,6 +124,7 @@ static const AVOption options[]={ {"b_qfactor", "qp factor between p and b frames", OFFSET(b_quant_factor), FF_OPT_TYPE_FLOAT, 1.25, -FLT_MAX, FLT_MAX, V|E}, {"rc_strategy", "ratecontrol method", OFFSET(rc_strategy), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E}, {"b_strategy", "strategy to choose between I/P/B-frames", OFFSET(b_frame_strategy), FF_OPT_TYPE_INT, 0, INT_MIN, INT_MAX, V|E}, +{"wpredp", "weighted prediction analysis method", OFFSET(weighted_p_pred), FF_OPT_TYPE_INT, 0, INT_MIN, INT_MAX, V|E}, {"hurry_up", NULL, OFFSET(hurry_up), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|D}, {"ps", "rtp payload size in bytes", OFFSET(rtp_payload_size), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX, V|E}, {"mv_bits", NULL, OFFSET(mv_bits), FF_OPT_TYPE_INT, DEFAULT, INT_MIN, INT_MAX}, -- 2.11.0