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