# HG changeset patch # User michaelni # Date 1043184648 0 # Node ID d6ba0641cc36981cd35505e09895e8e4aa889bea # Parent 1f9afd8b9131b8fa8cdc9d010a8a4cf2965baebe cleanup diff -r 1f9afd8b9131 -r d6ba0641cc36 avcodec.h --- a/avcodec.h Tue Jan 21 17:34:12 2003 +0000 +++ b/avcodec.h Tue Jan 21 21:30:48 2003 +0000 @@ -1236,6 +1236,7 @@ void av_free(void *ptr); void __av_freep(void **ptr); #define av_freep(p) __av_freep((void **)(p)) +void *av_fast_realloc(void *ptr, int *size, int min_size); /* for static data only */ /* call av_free_static to release all staticaly allocated tables */ void av_free_static(void); diff -r 1f9afd8b9131 -r d6ba0641cc36 h263dec.c --- a/h263dec.c Tue Jan 21 17:34:12 2003 +0000 +++ b/h263dec.c Tue Jan 21 21:30:48 2003 +0000 @@ -401,41 +401,19 @@ if (buf_size == 0) { return 0; } - + if(s->flags&CODEC_FLAG_TRUNCATED){ int next; - ParseContext *pc= &s->parse_context; - pc->last_index= pc->index; - if(s->codec_id==CODEC_ID_MPEG4){ next= mpeg4_find_frame_end(s, buf, buf_size); }else{ fprintf(stderr, "this codec doesnt support truncated bitstreams\n"); return -1; } - if(next==-1){ - if(buf_size + FF_INPUT_BUFFER_PADDING_SIZE + pc->index > pc->buffer_size){ - pc->buffer_size= buf_size + pc->index + 10*1024; - pc->buffer= realloc(pc->buffer, pc->buffer_size); - } - - memcpy(&pc->buffer[pc->index], buf, buf_size); - pc->index += buf_size; + + if( ff_combine_frame(s, next, &buf, &buf_size) < 0 ) return buf_size; - } - - if(pc->index){ - if(next + FF_INPUT_BUFFER_PADDING_SIZE + pc->index > pc->buffer_size){ - pc->buffer_size= next + pc->index + 10*1024; - pc->buffer= realloc(pc->buffer, pc->buffer_size); - } - - memcpy(&pc->buffer[pc->index], buf, next + FF_INPUT_BUFFER_PADDING_SIZE ); - pc->index = 0; - buf= pc->buffer; - buf_size= pc->last_index + next; - } } retry: diff -r 1f9afd8b9131 -r d6ba0641cc36 mem.c --- a/mem.c Tue Jan 21 17:34:12 2003 +0000 +++ b/mem.c Tue Jan 21 21:30:48 2003 +0000 @@ -71,6 +71,17 @@ return ptr; } +/** + * realloc which does nothing if the block is large enogh + */ +void *av_fast_realloc(void *ptr, int *size, int min_size){ + if(min_size < *size) return ptr; + + *size= min_size + 10*1024; + + return realloc(ptr, *size); +} + /* NOTE: ptr = NULL is explicetly allowed */ void av_free(void *ptr) { diff -r 1f9afd8b9131 -r d6ba0641cc36 mpegvideo.c --- a/mpegvideo.c Tue Jan 21 17:34:12 2003 +0000 +++ b/mpegvideo.c Tue Jan 21 21:30:48 2003 +0000 @@ -2627,6 +2627,35 @@ #endif } +/** + * combines the (truncated) bitstream to a complete frame + * @returns -1 if no complete frame could be created + */ +int ff_combine_frame( MpegEncContext *s, int next, uint8_t **buf, int *buf_size){ + ParseContext *pc= &s->parse_context; + + pc->last_index= pc->index; + + if(next==-1){ + pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, (*buf_size) + pc->index + FF_INPUT_BUFFER_PADDING_SIZE); + + memcpy(&pc->buffer[pc->index], *buf, *buf_size); + pc->index += *buf_size; + return -1; + } + + if(pc->index){ + pc->buffer= av_fast_realloc(pc->buffer, &pc->buffer_size, next + pc->index + FF_INPUT_BUFFER_PADDING_SIZE); + + memcpy(&pc->buffer[pc->index], *buf, next + FF_INPUT_BUFFER_PADDING_SIZE ); + pc->index = 0; + *buf= pc->buffer; + *buf_size= pc->last_index + next; + } + + return 0; +} + void ff_copy_bits(PutBitContext *pb, UINT8 *src, int length) { int bytes= length>>4; diff -r 1f9afd8b9131 -r d6ba0641cc36 mpegvideo.h --- a/mpegvideo.h Tue Jan 21 17:34:12 2003 +0000 +++ b/mpegvideo.h Tue Jan 21 21:30:48 2003 +0000 @@ -604,6 +604,7 @@ void ff_emulated_edge_mc(MpegEncContext *s, UINT8 *src, int linesize, int block_w, int block_h, int src_x, int src_y, int w, int h); char ff_get_pict_type_char(int pict_type); +int ff_combine_frame( MpegEncContext *s, int next, uint8_t **buf, int *buf_size); extern enum PixelFormat ff_yuv420p_list[2];