Commit e20c4069 authored by Michael Niedermayer's avatar Michael Niedermayer

release buffer cleanup

Originally committed as revision 1839 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 61873c4a
...@@ -98,6 +98,9 @@ static int cyuv_decode_frame(AVCodecContext *avctx, ...@@ -98,6 +98,9 @@ static int cyuv_decode_frame(AVCodecContext *avctx,
/* pixel data starts 48 bytes in, after 3x16-byte tables */ /* pixel data starts 48 bytes in, after 3x16-byte tables */
stream_ptr = 48; stream_ptr = 48;
if(s->frame.data[0])
avctx->release_buffer(avctx, &s->frame);
s->frame.reference = 0; s->frame.reference = 0;
if(avctx->get_buffer(avctx, &s->frame) < 0) { if(avctx->get_buffer(avctx, &s->frame) < 0) {
fprintf(stderr, "get_buffer() failed\n"); fprintf(stderr, "get_buffer() failed\n");
...@@ -159,8 +162,6 @@ static int cyuv_decode_frame(AVCodecContext *avctx, ...@@ -159,8 +162,6 @@ static int cyuv_decode_frame(AVCodecContext *avctx,
*data_size=sizeof(AVFrame); *data_size=sizeof(AVFrame);
*(AVFrame*)data= s->frame; *(AVFrame*)data= s->frame;
avctx->release_buffer(avctx, &s->frame);
return buf_size; return buf_size;
} }
......
...@@ -580,6 +580,9 @@ static int dvvideo_decode_frame(AVCodecContext *avctx, ...@@ -580,6 +580,9 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
else else
avctx->aspect_ratio = 4.0 / 3.0; avctx->aspect_ratio = 4.0 / 3.0;
if(s->picture.data[0])
avctx->release_buffer(avctx, &s->picture);
s->picture.reference= 0; s->picture.reference= 0;
if(avctx->get_buffer(avctx, &s->picture) < 0) { if(avctx->get_buffer(avctx, &s->picture) < 0) {
fprintf(stderr, "get_buffer() failed\n"); fprintf(stderr, "get_buffer() failed\n");
...@@ -617,8 +620,6 @@ static int dvvideo_decode_frame(AVCodecContext *avctx, ...@@ -617,8 +620,6 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
*data_size = sizeof(AVFrame); *data_size = sizeof(AVFrame);
*(AVFrame*)data= s->picture; *(AVFrame*)data= s->picture;
avctx->release_buffer(avctx, &s->picture);
return packet_size; return packet_size;
} }
......
...@@ -737,6 +737,9 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8 ...@@ -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); init_get_bits(&s->gb, s->bitstream_buffer, buf_size*8);
if(p->data[0])
avctx->release_buffer(avctx, p);
p->reference= 0; p->reference= 0;
if(avctx->get_buffer(avctx, p) < 0){ if(avctx->get_buffer(avctx, p) < 0){
fprintf(stderr, "get_buffer() failed\n"); fprintf(stderr, "get_buffer() failed\n");
...@@ -943,9 +946,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8 ...@@ -943,9 +946,6 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8
emms_c(); emms_c();
*picture= *p; *picture= *p;
avctx->release_buffer(avctx, p);
*data_size = sizeof(AVFrame); *data_size = sizeof(AVFrame);
return (get_bits_count(&s->gb)+31)/32*4; return (get_bits_count(&s->gb)+31)/32*4;
......
...@@ -1056,6 +1056,9 @@ static int indeo3_decode_frame(AVCodecContext *avctx, ...@@ -1056,6 +1056,9 @@ static int indeo3_decode_frame(AVCodecContext *avctx,
iv_decode_frame(s, buf, buf_size); iv_decode_frame(s, buf, buf_size);
if(s->frame.data[0])
avctx->release_buffer(avctx, &s->frame);
s->frame.reference = 0; s->frame.reference = 0;
if(avctx->get_buffer(avctx, &s->frame) < 0) { if(avctx->get_buffer(avctx, &s->frame) < 0) {
fprintf(stderr, "get_buffer() failed\n"); fprintf(stderr, "get_buffer() failed\n");
...@@ -1089,8 +1092,6 @@ static int indeo3_decode_frame(AVCodecContext *avctx, ...@@ -1089,8 +1092,6 @@ static int indeo3_decode_frame(AVCodecContext *avctx,
*data_size=sizeof(AVFrame); *data_size=sizeof(AVFrame);
*(AVFrame*)data= s->frame; *(AVFrame*)data= s->frame;
avctx->release_buffer(avctx, &s->frame);
return buf_size; return buf_size;
} }
......
...@@ -945,9 +945,15 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) ...@@ -945,9 +945,15 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
} }
} }
} }
alloc: alloc:
if(!s->encoding){ 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); i= find_unused_picture(s, 0);
pic= (AVFrame*)&s->picture[i]; pic= (AVFrame*)&s->picture[i];
...@@ -1041,12 +1047,14 @@ void MPV_frame_end(MpegEncContext *s) ...@@ -1041,12 +1047,14 @@ void MPV_frame_end(MpegEncContext *s)
assert(i<MAX_PICTURE_COUNT); assert(i<MAX_PICTURE_COUNT);
#endif #endif
if(s->encoding){
/* release non refernce frames */ /* release non refernce frames */
for(i=0; i<MAX_PICTURE_COUNT; i++){ 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*/) 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]); s->avctx->release_buffer(s->avctx, (AVFrame*)&s->picture[i]);
} }
}
}
// clear copies, to avoid confusion // clear copies, to avoid confusion
#if 0 #if 0
memset(&s->last_picture, 0, sizeof(Picture)); memset(&s->last_picture, 0, sizeof(Picture));
......
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