From f0bbfc4a201dccb86a76470402ff428f69a969e7 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Wed, 15 Oct 2003 21:59:08 +0000 Subject: [PATCH] default_get_buffer() fixes Originally committed as revision 2391 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/utils.c | 64 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 12 deletions(-) diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 91797835f0..0f0bf90729 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -127,10 +127,48 @@ typedef struct InternalBuffer{ #define INTERNAL_BUFFER_SIZE 32 +#define ALIGN(x, a) (((x)+(a)-1)&~((a)-1)) + +void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height){ + int w_align= 1; + int h_align= 1; + + switch(s->pix_fmt){ + case PIX_FMT_YUV420P: + case PIX_FMT_YUV422: + case PIX_FMT_YUV422P: + case PIX_FMT_YUV444P: + case PIX_FMT_GRAY8: + case PIX_FMT_YUVJ420P: + case PIX_FMT_YUVJ422P: + case PIX_FMT_YUVJ444P: + w_align= 16; //FIXME check for non mpeg style codecs and use less alignment + h_align= 16; + break; + case PIX_FMT_YUV411P: + w_align=32; + h_align=8; + break; + case PIX_FMT_YUV410P: + if(s->codec_id == CODEC_ID_SVQ1){ + w_align=64; + h_align=64; + } + break; + default: + w_align= 1; + h_align= 1; + break; + } + + *width = ALIGN(*width , w_align); + *height= ALIGN(*height, h_align); +} + int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ int i; - const int width = s->width; - const int height= s->height; + int w= s->width; + int h= s->height; InternalBuffer *buf; assert(pic->data[0]==NULL); @@ -153,10 +191,11 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ 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; + int h_chroma_shift, v_chroma_shift; + int s_align, pixel_size; avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift); + switch(s->pix_fmt){ case PIX_FMT_RGB555: case PIX_FMT_RGB565: @@ -173,13 +212,14 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ default: pixel_size=1; } - - if(s->codec_id==CODEC_ID_SVQ1) align=63; - else align=15; - - w= (width +align)&~align; - h= (height+align)&~align; - + + avcodec_align_dimensions(s, &w, &h); +#if defined(ARCH_POWERPC) || defined(HAVE_MMI) //FIXME some cleaner check + s_align= 16; +#else + s_align= 8; +#endif + if(!(s->flags&CODEC_FLAG_EMU_EDGE)){ w+= EDGE_WIDTH*2; h+= EDGE_WIDTH*2; @@ -191,7 +231,7 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ const int h_shift= i==0 ? 0 : h_chroma_shift; const int v_shift= i==0 ? 0 : v_chroma_shift; - pic->linesize[i]= pixel_size*w>>h_shift; + pic->linesize[i]= ALIGN(pixel_size*w>>h_shift, s_align); buf->base[i]= av_mallocz((pic->linesize[i]*h>>v_shift)+16); //FIXME 16 if(buf->base[i]==NULL) return -1;