|
|
|
@@ -229,6 +229,7 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ |
|
|
|
int size[4] = {0}; |
|
|
|
int tmpsize; |
|
|
|
AVPicture picture; |
|
|
|
int stride_align[4]; |
|
|
|
|
|
|
|
avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift); |
|
|
|
|
|
|
|
@@ -238,12 +239,22 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ |
|
|
|
w+= EDGE_WIDTH*2; |
|
|
|
h+= EDGE_WIDTH*2; |
|
|
|
} |
|
|
|
avcodec_align_dimensions(s, &w, &h); |
|
|
|
|
|
|
|
ff_fill_linesize(&picture, s->pix_fmt, w); |
|
|
|
|
|
|
|
for (i=0; i<4; i++) |
|
|
|
picture.linesize[i] = ALIGN(picture.linesize[i], STRIDE_ALIGN); |
|
|
|
for (i=0; i<4; i++){ |
|
|
|
//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 |
|
|
|
//picture size unneccessarily in some cases. The solution here is not |
|
|
|
//pretty and better ideas are welcome! |
|
|
|
#ifdef HAVE_MMX |
|
|
|
if(s->codec_id == CODEC_ID_SVQ1) |
|
|
|
stride_align[i]= 16; |
|
|
|
else |
|
|
|
#endif |
|
|
|
stride_align[i] = STRIDE_ALIGN; |
|
|
|
picture.linesize[i] = ALIGN(picture.linesize[i], stride_align[i]); |
|
|
|
} |
|
|
|
|
|
|
|
tmpsize = ff_fill_pointer(&picture, NULL, s->pix_fmt, h); |
|
|
|
|
|
|
|
@@ -269,7 +280,7 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ |
|
|
|
if((s->flags&CODEC_FLAG_EMU_EDGE) || (s->pix_fmt == PIX_FMT_PAL8) || !size[2]) |
|
|
|
buf->data[i] = buf->base[i]; |
|
|
|
else |
|
|
|
buf->data[i] = buf->base[i] + ALIGN((buf->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift), STRIDE_ALIGN); |
|
|
|
buf->data[i] = buf->base[i] + ALIGN((buf->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift), stride_align[i]); |
|
|
|
} |
|
|
|
buf->width = s->width; |
|
|
|
buf->height = s->height; |
|
|
|
|