summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavcodec/cyuv.c5
-rw-r--r--libavcodec/dv.c5
-rw-r--r--libavcodec/huffyuv.c6
-rw-r--r--libavcodec/indeo3.c5
-rw-r--r--libavcodec/mpegvideo.c22
5 files changed, 27 insertions, 16 deletions
diff --git a/libavcodec/cyuv.c b/libavcodec/cyuv.c
index 1bf676a434..267f7c2303 100644
--- a/libavcodec/cyuv.c
+++ b/libavcodec/cyuv.c
@@ -98,6 +98,9 @@ static int cyuv_decode_frame(AVCodecContext *avctx,
/* pixel data starts 48 bytes in, after 3x16-byte tables */
stream_ptr = 48;
+ if(s->frame.data[0])
+ avctx->release_buffer(avctx, &s->frame);
+
s->frame.reference = 0;
if(avctx->get_buffer(avctx, &s->frame) < 0) {
fprintf(stderr, "get_buffer() failed\n");
@@ -159,8 +162,6 @@ static int cyuv_decode_frame(AVCodecContext *avctx,
*data_size=sizeof(AVFrame);
*(AVFrame*)data= s->frame;
- avctx->release_buffer(avctx, &s->frame);
-
return buf_size;
}
diff --git a/libavcodec/dv.c b/libavcodec/dv.c
index 2d89a3cce7..32d4c3a271 100644
--- a/libavcodec/dv.c
+++ b/libavcodec/dv.c
@@ -580,6 +580,9 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
else
avctx->aspect_ratio = 4.0 / 3.0;
+ if(s->picture.data[0])
+ avctx->release_buffer(avctx, &s->picture);
+
s->picture.reference= 0;
if(avctx->get_buffer(avctx, &s->picture) < 0) {
fprintf(stderr, "get_buffer() failed\n");
@@ -617,8 +620,6 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
*data_size = sizeof(AVFrame);
*(AVFrame*)data= s->picture;
- avctx->release_buffer(avctx, &s->picture);
-
return packet_size;
}
diff --git a/libavcodec/huffyuv.c b/libavcodec/huffyuv.c
index a4193fdea4..c00f9a2bb1 100644
--- a/libavcodec/huffyuv.c
+++ b/libavcodec/huffyuv.c
@@ -737,6 +737,9 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8
init_get_bits(&s->gb, s->bitstream_buffer, buf_size*8);
+ if(p->data[0])
+ avctx->release_buffer(avctx, p);
+
p->reference= 0;
if(avctx->get_buffer(avctx, p) < 0){
fprintf(stderr, "get_buffer() failed\n");
@@ -943,9 +946,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8
emms_c();
*picture= *p;
-
- avctx->release_buffer(avctx, p);
-
*data_size = sizeof(AVFrame);
return (get_bits_count(&s->gb)+31)/32*4;
diff --git a/libavcodec/indeo3.c b/libavcodec/indeo3.c
index 133b9513cb..327b24d0da 100644
--- a/libavcodec/indeo3.c
+++ b/libavcodec/indeo3.c
@@ -1056,6 +1056,9 @@ static int indeo3_decode_frame(AVCodecContext *avctx,
iv_decode_frame(s, buf, buf_size);
+ if(s->frame.data[0])
+ avctx->release_buffer(avctx, &s->frame);
+
s->frame.reference = 0;
if(avctx->get_buffer(avctx, &s->frame) < 0) {
fprintf(stderr, "get_buffer() failed\n");
@@ -1089,8 +1092,6 @@ static int indeo3_decode_frame(AVCodecContext *avctx,
*data_size=sizeof(AVFrame);
*(AVFrame*)data= s->frame;
- avctx->release_buffer(avctx, &s->frame);
-
return buf_size;
}
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index 0f57bee356..ea24c2a488 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -929,7 +929,7 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
s->mb_skiped = 0;
assert(s->last_picture_ptr==NULL || s->out_format != FMT_H264);
-
+
/* mark&release old frames */
if (s->pict_type != B_TYPE && s->last_picture_ptr) {
avctx->release_buffer(avctx, (AVFrame*)s->last_picture_ptr);
@@ -945,9 +945,15 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
}
}
}
-
alloc:
if(!s->encoding){
+ /* release non refernce frames */
+ for(i=0; i<MAX_PICTURE_COUNT; i++){
+ if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
+ s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
+ }
+ }
+
i= find_unused_picture(s, 0);
pic= (AVFrame*)&s->picture[i];
@@ -1041,12 +1047,14 @@ void MPV_frame_end(MpegEncContext *s)
assert(i<MAX_PICTURE_COUNT);
#endif
- /* release non refernce frames */
- for(i=0; i<MAX_PICTURE_COUNT; i++){
- if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/)
- s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
+ if(s->encoding){
+ /* release non refernce frames */
+ for(i=0; i<MAX_PICTURE_COUNT; i++){
+ if(s->picture[i].data[0] && !s->picture[i].reference /*&& s->picture[i].type!=FF_BUFFER_TYPE_SHARED*/){
+ s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
+ }
+ }
}
-
// clear copies, to avoid confusion
#if 0
memset(&s->last_picture, 0, sizeof(Picture));