# HG changeset patch # User michaelni # Date 1051230588 0 # Node ID 327c5a36dfe7495508fc3649d1187a635701562e # Parent a71fe70b428bcbc2a8a88abb22833389fe936ac9 fixing mixed dr1 + internal buffers diff -r a71fe70b428b -r 327c5a36dfe7 avcodec.h --- a/avcodec.h Fri Apr 25 00:21:53 2003 +0000 +++ b/avcodec.h Fri Apr 25 00:29:48 2003 +0000 @@ -1089,6 +1089,17 @@ */ int color_table_id; + /** + * internal_buffer count. + * Dont touch, used by lavc default_get_buffer() + */ + int internal_buffer_count; + + /** + * internal_buffers. + * Dont touch, used by lavc default_get_buffer() + */ + void *internal_buffer; } AVCodecContext; @@ -1320,6 +1331,7 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic); void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic); +void avcodec_default_free_buffers(AVCodecContext *s); int avcodec_open(AVCodecContext *avctx, AVCodec *codec); int avcodec_decode_audio(AVCodecContext *avctx, int16_t *samples, diff -r a71fe70b428b -r 327c5a36dfe7 dv.c --- a/dv.c Fri Apr 25 00:21:53 2003 +0000 +++ b/dv.c Fri Apr 25 00:29:48 2003 +0000 @@ -624,15 +624,8 @@ static int dvvideo_decode_end(AVCodecContext *avctx) { DVVideoDecodeContext *s = avctx->priv_data; - int i; - - if(avctx->get_buffer == avcodec_default_get_buffer){ - for(i=0; i<4; i++){ - av_freep(&s->picture.base[i]); - s->picture.data[i]= NULL; - } - av_freep(&s->picture.opaque); - } + + avcodec_default_free_buffers(avctx); return 0; } diff -r a71fe70b428b -r 327c5a36dfe7 h264.c --- a/h264.c Fri Apr 25 00:21:53 2003 +0000 +++ b/h264.c Fri Apr 25 00:29:48 2003 +0000 @@ -3868,6 +3868,7 @@ |) | | | | slice_group_id[ i ] |1 |u(v) | #endif + break; } } pps->ref_count[0]= get_ue_golomb(&s->gb) + 1; @@ -4366,6 +4367,6 @@ NULL, decode_end, decode_frame, - /*CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1 | */CODEC_CAP_TRUNCATED, + /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 | CODEC_CAP_TRUNCATED, }; diff -r a71fe70b428b -r 327c5a36dfe7 huffyuv.c --- a/huffyuv.c Fri Apr 25 00:21:53 2003 +0000 +++ b/huffyuv.c Fri Apr 25 00:29:48 2003 +0000 @@ -959,14 +959,8 @@ for(i=0; i<3; i++){ free_vlc(&s->vlc[i]); } - - if(avctx->get_buffer == avcodec_default_get_buffer){ - for(i=0; i<4; i++){ - av_freep(&s->picture.base[i]); - s->picture.data[i]= NULL; - } - av_freep(&s->picture.opaque); - } + + avcodec_default_free_buffers(avctx); return 0; } diff -r a71fe70b428b -r 327c5a36dfe7 mpegvideo.c --- a/mpegvideo.c Fri Apr 25 00:21:53 2003 +0000 +++ b/mpegvideo.c Fri Apr 25 00:29:48 2003 +0000 @@ -305,15 +305,8 @@ av_freep(&pic->motion_val[i]); av_freep(&pic->ref_index[i]); } - - if(pic->type == FF_BUFFER_TYPE_INTERNAL){ - for(i=0; i<4; i++){ - av_freep(&pic->base[i]); - pic->data[i]= NULL; - } - av_freep(&pic->opaque); - pic->type= 0; - }else if(pic->type == FF_BUFFER_TYPE_SHARED){ + + if(pic->type == FF_BUFFER_TYPE_SHARED){ for(i=0; i<4; i++){ pic->base[i]= pic->data[i]= NULL; @@ -524,6 +517,7 @@ for(i=0; ipicture[i]); } + avcodec_default_free_buffers(s->avctx); s->context_initialized = 0; } @@ -978,6 +972,7 @@ s->last_picture_ptr= s->next_picture_ptr; 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; diff -r a71fe70b428b -r 327c5a36dfe7 utils.c --- a/utils.c Fri Apr 25 00:21:53 2003 +0000 +++ b/utils.c Fri Apr 25 00:29:48 2003 +0000 @@ -119,29 +119,39 @@ format->next = NULL; } -typedef struct DefaultPicOpaque{ +typedef struct InternalBuffer{ int last_pic_num; + uint8_t *base[4]; uint8_t *data[4]; -}DefaultPicOpaque; +}InternalBuffer; + +#define INTERNAL_BUFFER_SIZE 32 int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ int i; const int width = s->width; const int height= s->height; - DefaultPicOpaque *opaque; + InternalBuffer *buf; assert(pic->data[0]==NULL); - assert(pic->type==0 || pic->type==FF_BUFFER_TYPE_INTERNAL); + assert(INTERNAL_BUFFER_SIZE > s->internal_buffer_count); - if(pic->opaque){ - opaque= (DefaultPicOpaque *)pic->opaque; - for(i=0; i<3; i++) - pic->data[i]= opaque->data[i]; + if(s->internal_buffer==NULL){ + s->internal_buffer= av_mallocz(INTERNAL_BUFFER_SIZE*sizeof(InternalBuffer)); + } +#if 0 + s->internal_buffer= av_fast_realloc( + s->internal_buffer, + &s->internal_buffer_size, + sizeof(InternalBuffer)*FFMAX(99, s->internal_buffer_count+1)/*FIXME*/ + ); +#endif + + buf= &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count]; -// printf("get_buffer %X coded_pic_num:%d last:%d\n", pic->opaque, pic->coded_picture_number, opaque->last_pic_num); - pic->age= pic->coded_picture_number - opaque->last_pic_num; - opaque->last_pic_num= pic->coded_picture_number; -//printf("age: %d %d %d\n", pic->age, c->picture_number, pic->coded_picture_number); + if(buf->base[0]){ + pic->age= pic->coded_picture_number - buf->last_pic_num; + buf->last_pic_num= pic->coded_picture_number; }else{ int align, h_chroma_shift, v_chroma_shift; int w, h, pixel_size; @@ -174,11 +184,7 @@ h+= EDGE_WIDTH*2; } - opaque= av_mallocz(sizeof(DefaultPicOpaque)); - if(opaque==NULL) return -1; - - pic->opaque= opaque; - opaque->last_pic_num= -256*256*256*64; + buf->last_pic_num= -256*256*256*64; for(i=0; i<3; i++){ const int h_shift= i==0 ? 0 : h_chroma_shift; @@ -186,32 +192,51 @@ pic->linesize[i]= pixel_size*w>>h_shift; - pic->base[i]= av_mallocz((pic->linesize[i]*h>>v_shift)+16); //FIXME 16 - if(pic->base[i]==NULL) return -1; - - memset(pic->base[i], 128, pic->linesize[i]*h>>v_shift); + buf->base[i]= av_mallocz((pic->linesize[i]*h>>v_shift)+16); //FIXME 16 + if(buf->base[i]==NULL) return -1; + memset(buf->base[i], 128, pic->linesize[i]*h>>v_shift); if(s->flags&CODEC_FLAG_EMU_EDGE) - pic->data[i] = pic->base[i]; + buf->data[i] = buf->base[i]; else - pic->data[i] = pic->base[i] + (pic->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift); - - opaque->data[i]= pic->data[i]; + buf->data[i] = buf->base[i] + (pic->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift); } pic->age= 256*256*256*64; pic->type= FF_BUFFER_TYPE_INTERNAL; } + for(i=0; i<4; i++){ + pic->base[i]= buf->base[i]; + pic->data[i]= buf->data[i]; + } + s->internal_buffer_count++; + return 0; } void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic){ int i; - + InternalBuffer *buf, *last, temp; + assert(pic->type==FF_BUFFER_TYPE_INTERNAL); - - for(i=0; i<3; i++) + + for(i=0; iinternal_buffer_count; i++){ //just 3-5 checks so is not worth to optimize + buf= &((InternalBuffer*)s->internal_buffer)[i]; + if(buf->data[0] == pic->data[0]) + break; + } + assert(i < s->internal_buffer_count); + s->internal_buffer_count--; + last = &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count]; + + temp= *buf; + *buf= *last; + *last= temp; + + for(i=0; i<3; i++){ pic->data[i]=NULL; +// pic->base[i]=NULL; + } //printf("R%X\n", pic->opaque); } @@ -592,6 +617,23 @@ } } +void avcodec_default_free_buffers(AVCodecContext *s){ + int i, j; + + if(s->internal_buffer==NULL) return; + + for(i=0; iinternal_buffer)[i]; + for(j=0; j<4; j++){ + av_freep(&buf->base[j]); + buf->data[j]= NULL; + } + } + av_freep(&s->internal_buffer); + + s->internal_buffer_count=0; +} + int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max){ int exact=1, sign=0; int64_t gcd, larger;