Commit e05fda99 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit 'f8716a14'

* commit 'f8716a14':
  mpegvideo: Rework frame_size_alloc function

Conflicts:
	libavcodec/mpegvideo.c
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents db8ae37a f8716a14
...@@ -361,16 +361,16 @@ av_cold void ff_mpv_idct_init(MpegEncContext *s) ...@@ -361,16 +361,16 @@ av_cold void ff_mpv_idct_init(MpegEncContext *s)
ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan); ff_init_scantable(s->idsp.idct_permutation, &s->intra_v_scantable, ff_alternate_vertical_scan);
} }
static int frame_size_alloc(MpegEncContext *s, int linesize) int ff_mpeg_framesize_alloc(AVCodecContext *avctx, MotionEstContext *me,
ScratchpadContext *sc, int linesize)
{ {
int alloc_size = FFALIGN(FFABS(linesize) + 64, 32); int alloc_size = FFALIGN(FFABS(linesize) + 64, 32);
ScratchpadContext *sc = &s->sc;
if (s->avctx->hwaccel || s->avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU) if (avctx->hwaccel || avctx->codec->capabilities & CODEC_CAP_HWACCEL_VDPAU)
return 0; return 0;
if (linesize < 24) { if (linesize < 24) {
av_log(s->avctx, AV_LOG_ERROR, "Image too small, temporary buffers cannot function\n"); av_log(avctx, AV_LOG_ERROR, "Image too small, temporary buffers cannot function\n");
return AVERROR_PATCHWELCOME; return AVERROR_PATCHWELCOME;
} }
...@@ -380,15 +380,15 @@ static int frame_size_alloc(MpegEncContext *s, int linesize) ...@@ -380,15 +380,15 @@ static int frame_size_alloc(MpegEncContext *s, int linesize)
// at uvlinesize. It supports only YUV420 so 24x24 is enough // at uvlinesize. It supports only YUV420 so 24x24 is enough
// linesize * interlaced * MBsize // linesize * interlaced * MBsize
// we also use this buffer for encoding in encode_mb_internal() needig an additional 32 lines // we also use this buffer for encoding in encode_mb_internal() needig an additional 32 lines
FF_ALLOCZ_ARRAY_OR_GOTO(s->avctx, s->sc.edge_emu_buffer, alloc_size, 4 * 68, FF_ALLOCZ_ARRAY_OR_GOTO(avctx, sc->edge_emu_buffer, alloc_size, 4 * 68,
fail); fail);
FF_ALLOCZ_ARRAY_OR_GOTO(s->avctx, s->me.scratchpad, alloc_size, 4 * 16 * 2, FF_ALLOCZ_ARRAY_OR_GOTO(avctx, me->scratchpad, alloc_size, 4 * 16 * 2,
fail) fail)
s->me.temp = s->me.scratchpad; me->temp = me->scratchpad;
sc->rd_scratchpad = s->me.scratchpad; sc->rd_scratchpad = me->scratchpad;
sc->b_scratchpad = s->me.scratchpad; sc->b_scratchpad = me->scratchpad;
sc->obmc_scratchpad = s->me.scratchpad + 16; sc->obmc_scratchpad = me->scratchpad + 16;
return 0; return 0;
fail: fail:
...@@ -468,7 +468,8 @@ static int alloc_frame_buffer(MpegEncContext *s, Picture *pic) ...@@ -468,7 +468,8 @@ static int alloc_frame_buffer(MpegEncContext *s, Picture *pic)
} }
if (!s->sc.edge_emu_buffer && if (!s->sc.edge_emu_buffer &&
(ret = frame_size_alloc(s, pic->f->linesize[0])) < 0) { (ret = ff_mpeg_framesize_alloc(s->avctx, &s->me, &s->sc,
pic->f->linesize[0])) < 0) {
av_log(s->avctx, AV_LOG_ERROR, av_log(s->avctx, AV_LOG_ERROR,
"get_buffer() failed to allocate context scratch buffers.\n"); "get_buffer() failed to allocate context scratch buffers.\n");
ff_mpeg_unref_picture(s->avctx, pic); ff_mpeg_unref_picture(s->avctx, pic);
...@@ -847,7 +848,8 @@ int ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src) ...@@ -847,7 +848,8 @@ int ff_update_duplicate_context(MpegEncContext *dst, MpegEncContext *src)
FFSWAP(void *, dst->pblocks[4], dst->pblocks[5]); FFSWAP(void *, dst->pblocks[4], dst->pblocks[5]);
} }
if (!dst->sc.edge_emu_buffer && if (!dst->sc.edge_emu_buffer &&
(ret = frame_size_alloc(dst, dst->linesize)) < 0) { (ret = ff_mpeg_framesize_alloc(dst->avctx, &dst->me,
&dst->sc, dst->linesize)) < 0) {
av_log(dst->avctx, AV_LOG_ERROR, "failed to allocate context " av_log(dst->avctx, AV_LOG_ERROR, "failed to allocate context "
"scratch buffers.\n"); "scratch buffers.\n");
return ret; return ret;
...@@ -978,7 +980,8 @@ do {\ ...@@ -978,7 +980,8 @@ do {\
// linesize dependend scratch buffer allocation // linesize dependend scratch buffer allocation
if (!s->sc.edge_emu_buffer) if (!s->sc.edge_emu_buffer)
if (s1->linesize) { if (s1->linesize) {
if (frame_size_alloc(s, s1->linesize) < 0) { if (ff_mpeg_framesize_alloc(s->avctx, &s->me,
&s->sc, s1->linesize) < 0) {
av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate context " av_log(s->avctx, AV_LOG_ERROR, "Failed to allocate context "
"scratch buffers.\n"); "scratch buffers.\n");
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
......
...@@ -750,6 +750,8 @@ void ff_mpv_motion(MpegEncContext *s, ...@@ -750,6 +750,8 @@ void ff_mpv_motion(MpegEncContext *s,
*/ */
int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared); int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared);
int ff_mpeg_framesize_alloc(AVCodecContext *avctx, MotionEstContext *me,
ScratchpadContext *sc, int linesize);
/** /**
* permute block according to permuatation. * permute block according to permuatation.
* @param last last non zero element in scantable order * @param last last non zero element in scantable order
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment