X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fimgconvert.c;h=2d32602385e3f94ea92cecef7c0ef3de7f828e8d;hb=cfdaa4de6c496b0b761c763cd18067cb1af268a7;hp=3f5d035ee4f476dd48e6f2b643b53b688050db82;hpb=05563ccacc98fd185affdbf8cbaf094caf36b852;p=ffmpeg diff --git a/libavcodec/imgconvert.c b/libavcodec/imgconvert.c index 3f5d035ee4f..2d32602385e 100644 --- a/libavcodec/imgconvert.c +++ b/libavcodec/imgconvert.c @@ -31,26 +31,14 @@ */ #include "avcodec.h" -#include "dsputil.h" #include "imgconvert.h" #include "internal.h" +#include "mathops.h" #include "libavutil/colorspace.h" #include "libavutil/common.h" #include "libavutil/pixdesc.h" #include "libavutil/imgutils.h" -#if HAVE_MMX_EXTERNAL -#include "x86/dsputil_x86.h" -#endif - -#if HAVE_MMX_EXTERNAL -#define deinterlace_line_inplace ff_deinterlace_line_inplace_mmx -#define deinterlace_line ff_deinterlace_line_mmx -#else -#define deinterlace_line_inplace deinterlace_line_inplace_c -#define deinterlace_line deinterlace_line_c -#endif - void avcodec_get_chroma_sub_sample(enum AVPixelFormat pix_fmt, int *h_shift, int *v_shift) { const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt); @@ -350,7 +338,13 @@ int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, #if FF_API_DEINTERLACE -#if !HAVE_MMX_EXTERNAL +#if HAVE_MMX_EXTERNAL +#define deinterlace_line_inplace ff_deinterlace_line_inplace_mmx +#define deinterlace_line ff_deinterlace_line_mmx +#else +#define deinterlace_line_inplace deinterlace_line_inplace_c +#define deinterlace_line deinterlace_line_c + /* filter parameters: [-1 4 2 4 -1] // 8 */ static void deinterlace_line_c(uint8_t *dst, const uint8_t *lum_m4, const uint8_t *lum_m3, @@ -433,13 +427,15 @@ static void deinterlace_bottom_field(uint8_t *dst, int dst_wrap, deinterlace_line(dst,src_m2,src_m1,src_0,src_0,src_0,width); } -static void deinterlace_bottom_field_inplace(uint8_t *src1, int src_wrap, - int width, int height) +static int deinterlace_bottom_field_inplace(uint8_t *src1, int src_wrap, + int width, int height) { uint8_t *src_m1, *src_0, *src_p1, *src_p2; int y; uint8_t *buf; buf = av_malloc(width); + if (!buf) + return AVERROR(ENOMEM); src_m1 = src1; memcpy(buf,src_m1,width); @@ -456,12 +452,13 @@ static void deinterlace_bottom_field_inplace(uint8_t *src1, int src_wrap, /* do last line */ deinterlace_line_inplace(buf,src_m1,src_0,src_0,src_0,width); av_free(buf); + return 0; } int avpicture_deinterlace(AVPicture *dst, const AVPicture *src, enum AVPixelFormat pix_fmt, int width, int height) { - int i; + int i, ret; if (pix_fmt != AV_PIX_FMT_YUV420P && pix_fmt != AV_PIX_FMT_YUVJ420P && @@ -497,8 +494,11 @@ int avpicture_deinterlace(AVPicture *dst, const AVPicture *src, } } if (src == dst) { - deinterlace_bottom_field_inplace(dst->data[i], dst->linesize[i], - width, height); + ret = deinterlace_bottom_field_inplace(dst->data[i], + dst->linesize[i], + width, height); + if (ret < 0) + return ret; } else { deinterlace_bottom_field(dst->data[i],dst->linesize[i], src->data[i], src->linesize[i],