Mercurial > libavcodec.hg
comparison utils.c @ 9192:6faca73d75cc libavcodec
Change linesize alignment method to ensure that linesize[0] == 2*linesize[1]
for YUV420P and YUV422P always.
Fixes MPEG-2 4:2:2 encoding on PPC and ARM, and should fix mxf_d10 regression.
| author | reimar |
|---|---|
| date | Thu, 19 Mar 2009 21:34:55 +0000 |
| parents | caee3bed2145 |
| children | 9fd579338f23 |
comparison
equal
deleted
inserted
replaced
| 9191:fa58c81d8cde | 9192:6faca73d75cc |
|---|---|
| 240 buf->last_pic_num= *picture_number; | 240 buf->last_pic_num= *picture_number; |
| 241 }else{ | 241 }else{ |
| 242 int h_chroma_shift, v_chroma_shift; | 242 int h_chroma_shift, v_chroma_shift; |
| 243 int size[4] = {0}; | 243 int size[4] = {0}; |
| 244 int tmpsize; | 244 int tmpsize; |
| 245 int unaligned; | |
| 245 AVPicture picture; | 246 AVPicture picture; |
| 246 int stride_align[4]; | 247 int stride_align[4]; |
| 247 | 248 |
| 248 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift); | 249 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift); |
| 249 | 250 |
| 252 if(!(s->flags&CODEC_FLAG_EMU_EDGE)){ | 253 if(!(s->flags&CODEC_FLAG_EMU_EDGE)){ |
| 253 w+= EDGE_WIDTH*2; | 254 w+= EDGE_WIDTH*2; |
| 254 h+= EDGE_WIDTH*2; | 255 h+= EDGE_WIDTH*2; |
| 255 } | 256 } |
| 256 | 257 |
| 258 do { | |
| 259 // NOTE: do not align linesizes individually, this breaks e.g. assumptions | |
| 260 // that linesize[0] == 2*linesize[1] in the MPEG-encoder for 4:2:2 | |
| 257 ff_fill_linesize(&picture, s->pix_fmt, w); | 261 ff_fill_linesize(&picture, s->pix_fmt, w); |
| 258 | 262 // increase alignment of w for next try (rhs gives the lowest bit set in w) |
| 263 w += w & ~(w-1); | |
| 264 | |
| 265 unaligned = 0; | |
| 259 for (i=0; i<4; i++){ | 266 for (i=0; i<4; i++){ |
| 260 //STRIDE_ALIGN is 8 for SSE* but this does not work for SVQ1 chroma planes | 267 //STRIDE_ALIGN is 8 for SSE* but this does not work for SVQ1 chroma planes |
| 261 //we could change STRIDE_ALIGN to 16 for x86/sse but it would increase the | 268 //we could change STRIDE_ALIGN to 16 for x86/sse but it would increase the |
| 262 //picture size unneccessarily in some cases. The solution here is not | 269 //picture size unneccessarily in some cases. The solution here is not |
| 263 //pretty and better ideas are welcome! | 270 //pretty and better ideas are welcome! |
| 265 if(s->codec_id == CODEC_ID_SVQ1) | 272 if(s->codec_id == CODEC_ID_SVQ1) |
| 266 stride_align[i]= 16; | 273 stride_align[i]= 16; |
| 267 else | 274 else |
| 268 #endif | 275 #endif |
| 269 stride_align[i] = STRIDE_ALIGN; | 276 stride_align[i] = STRIDE_ALIGN; |
| 270 picture.linesize[i] = ALIGN(picture.linesize[i], stride_align[i]); | 277 unaligned |= picture.linesize[i] % stride_align[i]; |
| 271 } | 278 } |
| 279 } while (unaligned); | |
| 272 | 280 |
| 273 tmpsize = ff_fill_pointer(&picture, NULL, s->pix_fmt, h); | 281 tmpsize = ff_fill_pointer(&picture, NULL, s->pix_fmt, h); |
| 274 if (tmpsize < 0) | 282 if (tmpsize < 0) |
| 275 return -1; | 283 return -1; |
| 276 | 284 |
