Commit 0036b528 authored by reimar's avatar reimar

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.


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18047 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 856af41b
...@@ -242,6 +242,7 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ ...@@ -242,6 +242,7 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
int h_chroma_shift, v_chroma_shift; int h_chroma_shift, v_chroma_shift;
int size[4] = {0}; int size[4] = {0};
int tmpsize; int tmpsize;
int unaligned;
AVPicture picture; AVPicture picture;
int stride_align[4]; int stride_align[4];
...@@ -254,8 +255,14 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ ...@@ -254,8 +255,14 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
h+= EDGE_WIDTH*2; h+= EDGE_WIDTH*2;
} }
do {
// NOTE: do not align linesizes individually, this breaks e.g. assumptions
// that linesize[0] == 2*linesize[1] in the MPEG-encoder for 4:2:2
ff_fill_linesize(&picture, s->pix_fmt, w); ff_fill_linesize(&picture, s->pix_fmt, w);
// increase alignment of w for next try (rhs gives the lowest bit set in w)
w += w & ~(w-1);
unaligned = 0;
for (i=0; i<4; i++){ for (i=0; i<4; i++){
//STRIDE_ALIGN is 8 for SSE* but this does not work for SVQ1 chroma planes //STRIDE_ALIGN is 8 for SSE* but this does not work for SVQ1 chroma planes
//we could change STRIDE_ALIGN to 16 for x86/sse but it would increase the //we could change STRIDE_ALIGN to 16 for x86/sse but it would increase the
...@@ -267,8 +274,9 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ ...@@ -267,8 +274,9 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
else else
#endif #endif
stride_align[i] = STRIDE_ALIGN; stride_align[i] = STRIDE_ALIGN;
picture.linesize[i] = ALIGN(picture.linesize[i], stride_align[i]); unaligned |= picture.linesize[i] % stride_align[i];
} }
} while (unaligned);
tmpsize = ff_fill_pointer(&picture, NULL, s->pix_fmt, h); tmpsize = ff_fill_pointer(&picture, NULL, s->pix_fmt, h);
if (tmpsize < 0) if (tmpsize < 0)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment