[FFmpeg-cvslog] avcodec/mpegvideo: Factor ff_mpv_reallocate_putbitbuffer() out
Michael Niedermayer
git at videolan.org
Fri Jun 19 11:19:14 CEST 2015
ffmpeg | branch: release/2.5 | Michael Niedermayer <michaelni at gmx.at> | Mon May 25 04:12:13 2015 +0200| [2e210e19b1561ca198b635272fcb057373210586] | committer: Carl Eugen Hoyos
avcodec/mpegvideo: Factor ff_mpv_reallocate_putbitbuffer() out
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
(cherry picked from commit 00f3bb2ef2bb25fc41b7a905376f00d104f70185)
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=2e210e19b1561ca198b635272fcb057373210586
---
libavcodec/mpegvideo.h | 1 +
libavcodec/mpegvideo_enc.c | 55 ++++++++++++++++++++++++++------------------
2 files changed, 33 insertions(+), 23 deletions(-)
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index f1a3d8e..40c2698 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -773,6 +773,7 @@ void ff_mpv_encode_init_x86(MpegEncContext *s);
int ff_mpv_encode_end(AVCodecContext *avctx);
int ff_mpv_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
const AVFrame *frame, int *got_packet);
+int ff_mpv_reallocate_putbitbuffer(MpegEncContext *s, size_t threshold, size_t size_increase);
void ff_clean_intra_table_entries(MpegEncContext *s);
void ff_mpeg_draw_horiz_band(MpegEncContext *s, int y, int h);
diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index 00bf65f..f303a35 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -2718,6 +2718,35 @@ static void update_mb_info(MpegEncContext *s, int startcode)
write_mb_info(s);
}
+int ff_mpv_reallocate_putbitbuffer(MpegEncContext *s, size_t threshold, size_t size_increase)
+{
+ if ( s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < threshold
+ && s->slice_context_count == 1
+ && s->pb.buf == s->avctx->internal->byte_buffer) {
+ int lastgob_pos = s->ptr_lastgob - s->pb.buf;
+ int vbv_pos = s->vbv_delay_ptr - s->pb.buf;
+
+ uint8_t *new_buffer = NULL;
+ int new_buffer_size = 0;
+
+ av_fast_padded_malloc(&new_buffer, &new_buffer_size,
+ s->avctx->internal->byte_buffer_size + size_increase);
+ if (!new_buffer)
+ return AVERROR(ENOMEM);
+
+ memcpy(new_buffer, s->avctx->internal->byte_buffer, s->avctx->internal->byte_buffer_size);
+ av_free(s->avctx->internal->byte_buffer);
+ s->avctx->internal->byte_buffer = new_buffer;
+ s->avctx->internal->byte_buffer_size = new_buffer_size;
+ rebase_put_bits(&s->pb, new_buffer, new_buffer_size);
+ s->ptr_lastgob = s->pb.buf + lastgob_pos;
+ s->vbv_delay_ptr = s->pb.buf + vbv_pos;
+ }
+ if (s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < threshold)
+ return AVERROR(EINVAL);
+ return 0;
+}
+
static int encode_thread(AVCodecContext *c, void *arg){
MpegEncContext *s= *(void**)arg;
int mb_x, mb_y, pdif = 0;
@@ -2794,30 +2823,10 @@ static int encode_thread(AVCodecContext *c, void *arg){
// int d;
int dmin= INT_MAX;
int dir;
+ int size_increase = s->avctx->internal->byte_buffer_size/4
+ + s->mb_width*MAX_MB_BYTES;
- if ( s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES
- && s->slice_context_count == 1
- && s->pb.buf == s->avctx->internal->byte_buffer) {
- int new_size = s->avctx->internal->byte_buffer_size
- + s->avctx->internal->byte_buffer_size/4
- + s->mb_width*MAX_MB_BYTES;
- int lastgob_pos = s->ptr_lastgob - s->pb.buf;
- int vbv_pos = s->vbv_delay_ptr - s->pb.buf;
-
- uint8_t *new_buffer = NULL;
- int new_buffer_size = 0;
-
- av_fast_padded_malloc(&new_buffer, &new_buffer_size, new_size);
- if (new_buffer) {
- memcpy(new_buffer, s->avctx->internal->byte_buffer, s->avctx->internal->byte_buffer_size);
- av_free(s->avctx->internal->byte_buffer);
- s->avctx->internal->byte_buffer = new_buffer;
- s->avctx->internal->byte_buffer_size = new_buffer_size;
- rebase_put_bits(&s->pb, new_buffer, new_buffer_size);
- s->ptr_lastgob = s->pb.buf + lastgob_pos;
- s->vbv_delay_ptr = s->pb.buf + vbv_pos;
- }
- }
+ ff_mpv_reallocate_putbitbuffer(s, MAX_MB_BYTES, size_increase);
if(s->pb.buf_end - s->pb.buf - (put_bits_count(&s->pb)>>3) < MAX_MB_BYTES){
av_log(s->avctx, AV_LOG_ERROR, "encoded frame too large\n");
return -1;
More information about the ffmpeg-cvslog
mailing list