From 2aa72ecccc0610f49d3883e401202e95afc5d2a4 Mon Sep 17 00:00:00 2001 From: James Zern Date: Fri, 22 Oct 2010 18:09:14 +0000 Subject: [PATCH] Add new -slices option and use it for libvpx and libx264. Patch by James Zern, jzern google Originally committed as revision 25551 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/avcodec.h | 11 ++++++++++- libavcodec/libvpxenc.c | 1 + libavcodec/libx264.c | 2 ++ libavcodec/options.c | 1 + 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 4bddbaa4aa..705259ed2a 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -31,7 +31,7 @@ #include "libavutil/cpu.h" #define LIBAVCODEC_VERSION_MAJOR 52 -#define LIBAVCODEC_VERSION_MINOR 92 +#define LIBAVCODEC_VERSION_MINOR 93 #define LIBAVCODEC_VERSION_MICRO 0 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ @@ -2744,6 +2744,15 @@ typedef struct AVCodecContext { * - decoding: unused */ int lpc_passes; + + /** + * Number of slices. + * Indicates number of picture subdivisions. Used for parallelized + * decoding. + * - encoding: Set by user + * - decoding: unused + */ + int slices; } AVCodecContext; /** diff --git a/libavcodec/libvpxenc.c b/libavcodec/libvpxenc.c index 77a3bbf2a0..4e16c723f2 100644 --- a/libavcodec/libvpxenc.c +++ b/libavcodec/libvpxenc.c @@ -310,6 +310,7 @@ static av_cold int vp8_init(AVCodecContext *avctx) av_log(avctx, AV_LOG_DEBUG, "vpx_codec_control\n"); codecctl_int(avctx, VP8E_SET_CPUUSED, cpuused); codecctl_int(avctx, VP8E_SET_NOISE_SENSITIVITY, avctx->noise_reduction); + codecctl_int(avctx, VP8E_SET_TOKEN_PARTITIONS, av_log2(avctx->slices)); //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, diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index 8387f41286..7ce04a62cc 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -294,6 +294,8 @@ static av_cold int X264_init(AVCodecContext *avctx) x4->params.b_interlaced = avctx->flags & CODEC_FLAG_INTERLACED_DCT; + x4->params.i_slice_count = avctx->slices; + if (avctx->flags & CODEC_FLAG_GLOBAL_HEADER) x4->params.b_repeat_headers = 0; diff --git a/libavcodec/options.c b/libavcodec/options.c index 6969d429ee..ef7573c794 100644 --- a/libavcodec/options.c +++ b/libavcodec/options.c @@ -425,6 +425,7 @@ static const AVOption options[]={ {"levinson", NULL, 0, FF_OPT_TYPE_CONST, AV_LPC_TYPE_LEVINSON, INT_MIN, INT_MAX, A|E, "lpc_type"}, {"cholesky", NULL, 0, FF_OPT_TYPE_CONST, AV_LPC_TYPE_CHOLESKY, INT_MIN, INT_MAX, A|E, "lpc_type"}, {"lpc_passes", "number of passes to use for Cholesky factorization during LPC analysis", OFFSET(lpc_passes), FF_OPT_TYPE_INT, -1, INT_MIN, INT_MAX, A|E}, +{"slices", "number of slices, used in parallelized decoding", OFFSET(slices), FF_OPT_TYPE_INT, 0, 0, INT_MAX, V|E}, {NULL}, };