|
@@ -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);
|