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. Originally committed as revision 18047 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
@ -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){
|
|||||||
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){
|
|||||||
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)
|
||||||
|
Reference in New Issue
Block a user