diff options
-rw-r--r-- | libavcodec/utvideoenc.c | 36 | ||||
-rw-r--r-- | tests/fate/utvideo.mak | 2 |
2 files changed, 34 insertions, 4 deletions
diff --git a/libavcodec/utvideoenc.c b/libavcodec/utvideoenc.c index 47a4f3a25f..b63858d611 100644 --- a/libavcodec/utvideoenc.c +++ b/libavcodec/utvideoenc.c @@ -58,7 +58,7 @@ static av_cold int utvideo_encode_close(AVCodecContext *avctx) static av_cold int utvideo_encode_init(AVCodecContext *avctx) { UtvideoContext *c = avctx->priv_data; - int i; + int i, subsampled_height; uint32_t original_format; c->avctx = avctx; @@ -132,6 +132,26 @@ static av_cold int utvideo_encode_init(AVCodecContext *avctx) return AVERROR_OPTION_NOT_FOUND; } + /* + * Check the asked slice count for obviously invalid + * values (> 256 or negative). + */ + if (avctx->slices > 256 || avctx->slices < 0) { + av_log(avctx, AV_LOG_ERROR, + "Slice count %d is not supported in Ut Video (theoretical range is 0-256).\n", + avctx->slices); + return AVERROR(EINVAL); + } + + /* Check that the slice count is not larger than the subsampled height */ + subsampled_height = avctx->height >> av_pix_fmt_desc_get(avctx->pix_fmt)->log2_chroma_h; + if (avctx->slices > subsampled_height) { + av_log(avctx, AV_LOG_ERROR, + "Slice count %d is larger than the subsampling-applied height %d.\n", + avctx->slices, subsampled_height); + return AVERROR(EINVAL); + } + avctx->coded_frame = av_frame_alloc(); if (!avctx->coded_frame) { @@ -181,9 +201,19 @@ static av_cold int utvideo_encode_init(AVCodecContext *avctx) /* * Set how many slices are going to be used. - * Set one slice for now. + * By default uses multiple slices depending on the subsampled height. + * This enables multithreading in the official decoder. */ - c->slices = 1; + if (!avctx->slices) { + c->slices = subsampled_height / 120; + + if (!c->slices) + c->slices = 1; + else if (c->slices > 256) + c->slices = 256; + } else { + c->slices = avctx->slices; + } /* Set compression mode */ c->compression = COMP_HUFF; diff --git a/tests/fate/utvideo.mak b/tests/fate/utvideo.mak index 161674fe4c..e1ef7ecbd6 100644 --- a/tests/fate/utvideo.mak +++ b/tests/fate/utvideo.mak @@ -28,7 +28,7 @@ fate-utvideo_yuv422_median: CMD = framecrc -i $(TARGET_SAMPLES)/utvideo/utvideo_ FATE_SAMPLES_AVCONV-$(call DEMDEC, AVI, UTVIDEO) += $(FATE_UTVIDEO) fate-utvideo: $(FATE_UTVIDEO) -fate-utvideoenc%: CMD = framemd5 -f image2 -vcodec pgmyuv -i $(TARGET_PATH)/tests/vsynth1/%02d.pgm -vcodec utvideo -f avi -sws_flags +accurate_rnd+bitexact ${OPTS} +fate-utvideoenc%: CMD = framemd5 -f image2 -vcodec pgmyuv -i $(TARGET_PATH)/tests/vsynth1/%02d.pgm -vcodec utvideo -slices 1 -f avi -sws_flags +accurate_rnd+bitexact ${OPTS} FATE_UTVIDEOENC += fate-utvideoenc_rgba_left fate-utvideoenc_rgba_left: OPTS = -pix_fmt rgba -pred left |