Index: patched-ffmpeg-mt/libavcodec/utils.c |
=================================================================== |
--- patched-ffmpeg-mt/libavcodec/utils.c (revision 41250) |
+++ patched-ffmpeg-mt/libavcodec/utils.c (working copy) |
@@ -31,12 +31,14 @@ |
#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" |
#include "imgconvert.h" |
#include "thread.h" |
#include "audioconvert.h" |
+#include "libxvid_internal.h" |
#include "internal.h" |
#include <stdlib.h> |
#include <stdarg.h> |
@@ -118,7 +120,7 @@ |
#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; |
@@ -181,8 +183,38 @@ |
*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){ |
if((int)w>0 && (int)h>0 && (w+128)*(uint64_t)(h+128) < INT_MAX/8) |
return 0; |
@@ -250,7 +282,7 @@ |
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; |
@@ -266,16 +298,6 @@ |
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) |
- stride_align[i]= 16; |
- else |
-#endif |
- stride_align[i] = STRIDE_ALIGN; |
unaligned |= picture.linesize[i] % stride_align[i]; |
} |
} while (unaligned); |
@@ -704,6 +726,8 @@ |
avctx->codec->close(avctx); |
avcodec_default_free_buffers(avctx); |
av_freep(&avctx->priv_data); |
+ if(avctx->codec->encode) |
+ av_freep(&avctx->extradata); |
avctx->codec = NULL; |
avctx->active_thread_type = 0; |
entangled_thread_counter--; |
@@ -767,7 +791,7 @@ |
return NULL; |
} |
-int av_get_bit_rate(AVCodecContext *ctx) |
+static int get_bit_rate(AVCodecContext *ctx) |
{ |
int bit_rate; |
int bits_per_sample; |
@@ -905,7 +929,7 @@ |
snprintf(buf + strlen(buf), buf_size - strlen(buf), |
", pass 2"); |
} |
- bitrate = av_get_bit_rate(enc); |
+ bitrate = get_bit_rate(enc); |
if (bitrate != 0) { |
snprintf(buf + strlen(buf), buf_size - strlen(buf), |
", %d kb/s", bitrate / 1000); |