Mercurial > libavcodec.hg
changeset 1539:14d01ccc0081 libavcodec
picture buffer cleanup, this fixes a assertion failure (if assertion checking was manualy enabled for utils.c) and a memleak at least
author | michael |
---|---|
date | Thu, 16 Oct 2003 00:21:54 +0000 |
parents | 2312ceb69d17 |
children | a0086452b9d8 |
files | mpegvideo.c mpegvideo.h |
diffstat | 2 files changed, 18 insertions(+), 21 deletions(-) [+] |
line wrap: on
line diff
--- a/mpegvideo.c Wed Oct 15 21:59:08 2003 +0000 +++ b/mpegvideo.c Thu Oct 16 00:21:54 2003 +0000 @@ -239,6 +239,11 @@ return 0; } +static void copy_picture(Picture *dst, Picture *src){ + *dst = *src; + dst->type= FF_BUFFER_TYPE_COPY; +} + /** * allocates a Picture * The pixels are allocated/set by calling get_buffer() if shared=0 @@ -1047,7 +1052,7 @@ // s->current_picture_ptr->quality= s->new_picture_ptr->quality; s->current_picture_ptr->key_frame= s->pict_type == I_TYPE; - s->current_picture= *s->current_picture_ptr; + copy_picture(&s->current_picture, s->current_picture_ptr); if(s->out_format != FMT_H264 || s->codec_id == CODEC_ID_SVQ3){ if (s->pict_type != B_TYPE) { @@ -1055,11 +1060,10 @@ s->next_picture_ptr= s->current_picture_ptr; } - if(s->last_picture_ptr) s->last_picture= *s->last_picture_ptr; - if(s->next_picture_ptr) s->next_picture= *s->next_picture_ptr; - if(s->new_picture_ptr ) s->new_picture = *s->new_picture_ptr; + if(s->last_picture_ptr) copy_picture(&s->last_picture, s->last_picture_ptr); + if(s->next_picture_ptr) copy_picture(&s->next_picture, s->next_picture_ptr); - if(s->pict_type != I_TYPE && s->last_picture_ptr==NULL){ + if(s->pict_type != I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL)){ fprintf(stderr, "warning: first frame is no keyframe\n"); assert(s->pict_type != B_TYPE); //these should have been dropped if we dont have a reference goto alloc; @@ -1399,22 +1403,17 @@ } alloc_picture(s, (Picture*)pic, 1); }else{ + int offset= 16; i= find_unused_picture(s, 0); pic= (AVFrame*)&s->picture[i]; pic->reference= 3; alloc_picture(s, (Picture*)pic, 0); - for(i=0; i<4; i++){ - /* the input will be 16 pixels to the right relative to the actual buffer start - * and the current_pic, so the buffer can be reused, yes its not beatifull - */ - pic->data[i]+= 16; - } - - if( pic->data[0] == pic_arg->data[0] - && pic->data[1] == pic_arg->data[1] - && pic->data[2] == pic_arg->data[2]){ + + if( pic->data[0] + offset == pic_arg->data[0] + && pic->data[1] + offset == pic_arg->data[1] + && pic->data[2] + offset == pic_arg->data[2]){ // empty }else{ int h_chroma_shift, v_chroma_shift; @@ -1428,7 +1427,7 @@ int w= s->width >>h_shift; int h= s->height>>v_shift; uint8_t *src= pic_arg->data[i]; - uint8_t *dst= pic->data[i]; + uint8_t *dst= pic->data[i] + offset; if(src_stride==dst_stride) memcpy(dst, src, src_stride*h); @@ -1550,7 +1549,7 @@ if(s->reordered_input_picture[0]){ s->reordered_input_picture[0]->reference= s->reordered_input_picture[0]->pict_type!=B_TYPE ? 3 : 0; - s->new_picture= *s->reordered_input_picture[0]; + copy_picture(&s->new_picture, s->reordered_input_picture[0]); if(s->reordered_input_picture[0]->type == FF_BUFFER_TYPE_SHARED){ // input is a shared pix, so we cant modifiy it -> alloc a new one & ensure that the shared one is reuseable @@ -1581,11 +1580,10 @@ s->current_picture_ptr= s->reordered_input_picture[0]; for(i=0; i<4; i++){ - //reverse the +16 we did before storing the input - s->current_picture_ptr->data[i]-=16; + s->new_picture.data[i]+=16; } } - s->current_picture= *s->current_picture_ptr; + copy_picture(&s->current_picture, s->current_picture_ptr); s->picture_number= s->new_picture.display_picture_number; //printf("dpn:%d\n", s->picture_number);
--- a/mpegvideo.h Wed Oct 15 21:59:08 2003 +0000 +++ b/mpegvideo.h Thu Oct 16 00:21:54 2003 +0000 @@ -331,7 +331,6 @@ Picture *last_picture_ptr; ///< pointer to the previous picture. Picture *next_picture_ptr; ///< pointer to the next picture (for bidir pred) - Picture *new_picture_ptr; ///< pointer to the source picture for encoding Picture *current_picture_ptr; ///< pointer to the current picture int last_dc[3]; ///< last DC values for MPEG1 int16_t *dc_val[3]; ///< used for mpeg4 DC prediction, all 3 arrays must be continuous