comparison utils.c @ 1538:2312ceb69d17 libavcodec

default_get_buffer() fixes
author michael
date Wed, 15 Oct 2003 21:59:08 +0000
parents 010f76d07a27
children 9c4921a51392
comparison
equal deleted inserted replaced
1537:6df940415116 1538:2312ceb69d17
125 uint8_t *data[4]; 125 uint8_t *data[4];
126 }InternalBuffer; 126 }InternalBuffer;
127 127
128 #define INTERNAL_BUFFER_SIZE 32 128 #define INTERNAL_BUFFER_SIZE 32
129 129
130 #define ALIGN(x, a) (((x)+(a)-1)&~((a)-1))
131
132 void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height){
133 int w_align= 1;
134 int h_align= 1;
135
136 switch(s->pix_fmt){
137 case PIX_FMT_YUV420P:
138 case PIX_FMT_YUV422:
139 case PIX_FMT_YUV422P:
140 case PIX_FMT_YUV444P:
141 case PIX_FMT_GRAY8:
142 case PIX_FMT_YUVJ420P:
143 case PIX_FMT_YUVJ422P:
144 case PIX_FMT_YUVJ444P:
145 w_align= 16; //FIXME check for non mpeg style codecs and use less alignment
146 h_align= 16;
147 break;
148 case PIX_FMT_YUV411P:
149 w_align=32;
150 h_align=8;
151 break;
152 case PIX_FMT_YUV410P:
153 if(s->codec_id == CODEC_ID_SVQ1){
154 w_align=64;
155 h_align=64;
156 }
157 break;
158 default:
159 w_align= 1;
160 h_align= 1;
161 break;
162 }
163
164 *width = ALIGN(*width , w_align);
165 *height= ALIGN(*height, h_align);
166 }
167
130 int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ 168 int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
131 int i; 169 int i;
132 const int width = s->width; 170 int w= s->width;
133 const int height= s->height; 171 int h= s->height;
134 InternalBuffer *buf; 172 InternalBuffer *buf;
135 173
136 assert(pic->data[0]==NULL); 174 assert(pic->data[0]==NULL);
137 assert(INTERNAL_BUFFER_SIZE > s->internal_buffer_count); 175 assert(INTERNAL_BUFFER_SIZE > s->internal_buffer_count);
138 176
151 189
152 if(buf->base[0]){ 190 if(buf->base[0]){
153 pic->age= pic->coded_picture_number - buf->last_pic_num; 191 pic->age= pic->coded_picture_number - buf->last_pic_num;
154 buf->last_pic_num= pic->coded_picture_number; 192 buf->last_pic_num= pic->coded_picture_number;
155 }else{ 193 }else{
156 int align, h_chroma_shift, v_chroma_shift; 194 int h_chroma_shift, v_chroma_shift;
157 int w, h, pixel_size; 195 int s_align, pixel_size;
158 196
159 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift); 197 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
198
160 switch(s->pix_fmt){ 199 switch(s->pix_fmt){
161 case PIX_FMT_RGB555: 200 case PIX_FMT_RGB555:
162 case PIX_FMT_RGB565: 201 case PIX_FMT_RGB565:
163 case PIX_FMT_YUV422: 202 case PIX_FMT_YUV422:
164 pixel_size=2; 203 pixel_size=2;
171 pixel_size=4; 210 pixel_size=4;
172 break; 211 break;
173 default: 212 default:
174 pixel_size=1; 213 pixel_size=1;
175 } 214 }
176 215
177 if(s->codec_id==CODEC_ID_SVQ1) align=63; 216 avcodec_align_dimensions(s, &w, &h);
178 else align=15; 217 #if defined(ARCH_POWERPC) || defined(HAVE_MMI) //FIXME some cleaner check
179 218 s_align= 16;
180 w= (width +align)&~align; 219 #else
181 h= (height+align)&~align; 220 s_align= 8;
182 221 #endif
222
183 if(!(s->flags&CODEC_FLAG_EMU_EDGE)){ 223 if(!(s->flags&CODEC_FLAG_EMU_EDGE)){
184 w+= EDGE_WIDTH*2; 224 w+= EDGE_WIDTH*2;
185 h+= EDGE_WIDTH*2; 225 h+= EDGE_WIDTH*2;
186 } 226 }
187 227
189 229
190 for(i=0; i<3; i++){ 230 for(i=0; i<3; i++){
191 const int h_shift= i==0 ? 0 : h_chroma_shift; 231 const int h_shift= i==0 ? 0 : h_chroma_shift;
192 const int v_shift= i==0 ? 0 : v_chroma_shift; 232 const int v_shift= i==0 ? 0 : v_chroma_shift;
193 233
194 pic->linesize[i]= pixel_size*w>>h_shift; 234 pic->linesize[i]= ALIGN(pixel_size*w>>h_shift, s_align);
195 235
196 buf->base[i]= av_mallocz((pic->linesize[i]*h>>v_shift)+16); //FIXME 16 236 buf->base[i]= av_mallocz((pic->linesize[i]*h>>v_shift)+16); //FIXME 16
197 if(buf->base[i]==NULL) return -1; 237 if(buf->base[i]==NULL) return -1;
198 memset(buf->base[i], 128, pic->linesize[i]*h>>v_shift); 238 memset(buf->base[i], 128, pic->linesize[i]*h>>v_shift);
199 239