avcodec/mpegvideo: Move setting mb_height to ff_mpv_init_context_frame

It is the proper place to set it, directly besides mb_width and
mb_stride. The reason for doing it the way it is done now seems
to be that the code does not create more slice contexts than necessary
(i.e. not more than one per row), so that this number needs to be
known before setting the number of slices. But this can always be
arranged by just moving the code that sets the number of slices.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
pull/388/head
Andreas Rheinhardt 2 years ago
parent 300e31457a
commit 3443330b17
  1. 32
      libavcodec/mpegvideo.c
  2. 6
      libavcodec/mpegvideo_dec.c

@ -526,6 +526,11 @@ int ff_mpv_init_context_frame(MpegEncContext *s)
{ {
int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y; int y_size, c_size, yc_size, i, mb_array_size, mv_table_size, x, y;
if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
s->mb_height = (s->height + 31) / 32 * 2;
else
s->mb_height = (s->height + 15) / 16;
s->mb_width = (s->width + 15) / 16; s->mb_width = (s->width + 15) / 16;
s->mb_stride = s->mb_width + 1; s->mb_stride = s->mb_width + 1;
s->b8_stride = s->mb_width * 2 + 1; s->b8_stride = s->mb_width * 2 + 1;
@ -747,28 +752,12 @@ av_cold int ff_mpv_common_init(MpegEncContext *s)
if (s->encoding && s->avctx->slices) if (s->encoding && s->avctx->slices)
nb_slices = s->avctx->slices; nb_slices = s->avctx->slices;
if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
s->mb_height = (s->height + 31) / 32 * 2;
else
s->mb_height = (s->height + 15) / 16;
if (s->avctx->pix_fmt == AV_PIX_FMT_NONE) { if (s->avctx->pix_fmt == AV_PIX_FMT_NONE) {
av_log(s->avctx, AV_LOG_ERROR, av_log(s->avctx, AV_LOG_ERROR,
"decoding to AV_PIX_FMT_NONE is not supported.\n"); "decoding to AV_PIX_FMT_NONE is not supported.\n");
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
if (nb_slices > MAX_THREADS || (nb_slices > s->mb_height && s->mb_height)) {
int max_slices;
if (s->mb_height)
max_slices = FFMIN(MAX_THREADS, s->mb_height);
else
max_slices = MAX_THREADS;
av_log(s->avctx, AV_LOG_WARNING, "too many threads/slices (%d),"
" reducing to %d\n", nb_slices, max_slices);
nb_slices = max_slices;
}
if ((s->width || s->height) && if ((s->width || s->height) &&
av_image_check_size(s->width, s->height, 0, s->avctx)) av_image_check_size(s->width, s->height, 0, s->avctx))
return AVERROR(EINVAL); return AVERROR(EINVAL);
@ -799,6 +788,17 @@ av_cold int ff_mpv_common_init(MpegEncContext *s)
if ((ret = ff_mpv_init_context_frame(s))) if ((ret = ff_mpv_init_context_frame(s)))
goto fail; goto fail;
if (nb_slices > MAX_THREADS || (nb_slices > s->mb_height && s->mb_height)) {
int max_slices;
if (s->mb_height)
max_slices = FFMIN(MAX_THREADS, s->mb_height);
else
max_slices = MAX_THREADS;
av_log(s->avctx, AV_LOG_WARNING, "too many threads/slices (%d),"
" reducing to %d\n", nb_slices, max_slices);
nb_slices = max_slices;
}
#if FF_API_FLAG_TRUNCATED #if FF_API_FLAG_TRUNCATED
s->parse_context.state = -1; s->parse_context.state = -1;
#endif #endif

@ -208,12 +208,6 @@ int ff_mpv_common_frame_size_change(MpegEncContext *s)
s->next_picture_ptr = s->next_picture_ptr =
s->current_picture_ptr = NULL; s->current_picture_ptr = NULL;
// init
if (s->codec_id == AV_CODEC_ID_MPEG2VIDEO && !s->progressive_sequence)
s->mb_height = (s->height + 31) / 32 * 2;
else
s->mb_height = (s->height + 15) / 16;
if ((s->width || s->height) && if ((s->width || s->height) &&
(err = av_image_check_size(s->width, s->height, 0, s->avctx)) < 0) (err = av_image_check_size(s->width, s->height, 0, s->avctx)) < 0)
goto fail; goto fail;

Loading…
Cancel
Save