@ -31,6 +31,7 @@
# include "libavutil/avstring.h"
# include "libavutil/integer.h"
# include "libavutil/crc.h"
# include "libavutil/pixdesc.h"
# include "avcodec.h"
# include "dsputil.h"
# include "opt.h"
@ -117,7 +118,7 @@ typedef struct InternalBuffer{
# define INTERNAL_BUFFER_SIZE 32
void avcodec_align_dimensions ( AVCodecContext * s , int * width , int * height ) {
void avcodec_align_dimensions2 ( AVCodecContext * s , int * width , int * height , int linesize_align [ 4 ] ) {
int w_align = 1 ;
int h_align = 1 ;
@ -180,6 +181,36 @@ void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height){
* height = FFALIGN ( * height , h_align ) ;
if ( s - > codec_id = = CODEC_ID_H264 )
* height + = 2 ; // some of the optimized chroma MC reads one line too much
linesize_align [ 0 ] =
linesize_align [ 1 ] =
linesize_align [ 2 ] =
linesize_align [ 3 ] = STRIDE_ALIGN ;
//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!
# if HAVE_MMX
if ( s - > codec_id = = CODEC_ID_SVQ1 | | s - > codec_id = = CODEC_ID_VP5 | |
s - > codec_id = = CODEC_ID_VP6 | | s - > codec_id = = CODEC_ID_VP6F | |
s - > codec_id = = CODEC_ID_VP6A ) {
linesize_align [ 0 ] =
linesize_align [ 1 ] =
linesize_align [ 2 ] = 16 ;
}
# endif
}
void avcodec_align_dimensions ( AVCodecContext * s , int * width , int * height ) {
int chroma_shift = av_pix_fmt_descriptors [ s - > pix_fmt ] . log2_chroma_w ;
int linesize_align [ 4 ] ;
int align ;
avcodec_align_dimensions2 ( s , width , height , linesize_align ) ;
align = FFMAX ( linesize_align [ 0 ] , linesize_align [ 3 ] ) ;
linesize_align [ 1 ] < < = chroma_shift ;
linesize_align [ 2 ] < < = chroma_shift ;
align = FFMAX3 ( align , linesize_align [ 1 ] , linesize_align [ 2 ] ) ;
* width = FFALIGN ( * width , align ) ;
}
int avcodec_check_dimensions ( void * av_log_ctx , unsigned int w , unsigned int h ) {
@ -244,7 +275,7 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
avcodec_get_chroma_sub_sample ( s - > pix_fmt , & h_chroma_shift , & v_chroma_shift ) ;
avcodec_align_dimensions ( s , & w , & h ) ;
avcodec_align_dimensions2 ( s , & w , & h , stride_align ) ;
if ( ! ( s - > flags & CODEC_FLAG_EMU_EDGE ) ) {
w + = EDGE_WIDTH * 2 ;
@ -260,18 +291,6 @@ int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
unaligned = 0 ;
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!
# if HAVE_MMX
if ( s - > codec_id = = CODEC_ID_SVQ1 | | s - > codec_id = = CODEC_ID_VP5 | |
s - > codec_id = = CODEC_ID_VP6 | | s - > codec_id = = CODEC_ID_VP6F | |
s - > codec_id = = CODEC_ID_VP6A )
stride_align [ i ] = 16 ;
else
# endif
stride_align [ i ] = STRIDE_ALIGN ;
unaligned | = picture . linesize [ i ] % stride_align [ i ] ;
}
} while ( unaligned ) ;