| @@ -4227,16 +4227,6 @@ int avpicture_layout(const AVPicture* src, enum AVPixelFormat pix_fmt, | |||||
| */ | */ | ||||
| int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height); | int avpicture_get_size(enum AVPixelFormat pix_fmt, int width, int height); | ||||
| #if FF_API_DEINTERLACE | |||||
| /** | |||||
| * deinterlace - if not supported return -1 | |||||
| * | |||||
| * @deprecated - use yadif (in libavfilter) instead | |||||
| */ | |||||
| attribute_deprecated | |||||
| int avpicture_deinterlace(AVPicture *dst, const AVPicture *src, | |||||
| enum AVPixelFormat pix_fmt, int width, int height); | |||||
| #endif | |||||
| /** | /** | ||||
| * Copy image src to dst. Wraps av_picture_data_copy() above. | * Copy image src to dst. Wraps av_picture_data_copy() above. | ||||
| */ | */ | ||||
| @@ -335,178 +335,3 @@ int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, | |||||
| } | } | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| #if FF_API_DEINTERLACE | |||||
| #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, | |||||
| const uint8_t *lum_m2, const uint8_t *lum_m1, | |||||
| const uint8_t *lum, | |||||
| int size) | |||||
| { | |||||
| const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP; | |||||
| int sum; | |||||
| for(;size > 0;size--) { | |||||
| sum = -lum_m4[0]; | |||||
| sum += lum_m3[0] << 2; | |||||
| sum += lum_m2[0] << 1; | |||||
| sum += lum_m1[0] << 2; | |||||
| sum += -lum[0]; | |||||
| dst[0] = cm[(sum + 4) >> 3]; | |||||
| lum_m4++; | |||||
| lum_m3++; | |||||
| lum_m2++; | |||||
| lum_m1++; | |||||
| lum++; | |||||
| dst++; | |||||
| } | |||||
| } | |||||
| static void deinterlace_line_inplace_c(uint8_t *lum_m4, uint8_t *lum_m3, | |||||
| uint8_t *lum_m2, uint8_t *lum_m1, | |||||
| uint8_t *lum, int size) | |||||
| { | |||||
| const uint8_t *cm = ff_crop_tab + MAX_NEG_CROP; | |||||
| int sum; | |||||
| for(;size > 0;size--) { | |||||
| sum = -lum_m4[0]; | |||||
| sum += lum_m3[0] << 2; | |||||
| sum += lum_m2[0] << 1; | |||||
| lum_m4[0]=lum_m2[0]; | |||||
| sum += lum_m1[0] << 2; | |||||
| sum += -lum[0]; | |||||
| lum_m2[0] = cm[(sum + 4) >> 3]; | |||||
| lum_m4++; | |||||
| lum_m3++; | |||||
| lum_m2++; | |||||
| lum_m1++; | |||||
| lum++; | |||||
| } | |||||
| } | |||||
| #endif /* !HAVE_MMX_EXTERNAL */ | |||||
| /* deinterlacing : 2 temporal taps, 3 spatial taps linear filter. The | |||||
| top field is copied as is, but the bottom field is deinterlaced | |||||
| against the top field. */ | |||||
| static void deinterlace_bottom_field(uint8_t *dst, int dst_wrap, | |||||
| const uint8_t *src1, int src_wrap, | |||||
| int width, int height) | |||||
| { | |||||
| const uint8_t *src_m2, *src_m1, *src_0, *src_p1, *src_p2; | |||||
| int y; | |||||
| src_m2 = src1; | |||||
| src_m1 = src1; | |||||
| src_0=&src_m1[src_wrap]; | |||||
| src_p1=&src_0[src_wrap]; | |||||
| src_p2=&src_p1[src_wrap]; | |||||
| for(y=0;y<(height-2);y+=2) { | |||||
| memcpy(dst,src_m1,width); | |||||
| dst += dst_wrap; | |||||
| deinterlace_line(dst,src_m2,src_m1,src_0,src_p1,src_p2,width); | |||||
| src_m2 = src_0; | |||||
| src_m1 = src_p1; | |||||
| src_0 = src_p2; | |||||
| src_p1 += 2*src_wrap; | |||||
| src_p2 += 2*src_wrap; | |||||
| dst += dst_wrap; | |||||
| } | |||||
| memcpy(dst,src_m1,width); | |||||
| dst += dst_wrap; | |||||
| /* do last line */ | |||||
| deinterlace_line(dst,src_m2,src_m1,src_0,src_0,src_0,width); | |||||
| } | |||||
| 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); | |||||
| src_0=&src_m1[src_wrap]; | |||||
| src_p1=&src_0[src_wrap]; | |||||
| src_p2=&src_p1[src_wrap]; | |||||
| for(y=0;y<(height-2);y+=2) { | |||||
| deinterlace_line_inplace(buf,src_m1,src_0,src_p1,src_p2,width); | |||||
| src_m1 = src_p1; | |||||
| src_0 = src_p2; | |||||
| src_p1 += 2*src_wrap; | |||||
| src_p2 += 2*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, ret; | |||||
| if (pix_fmt != AV_PIX_FMT_YUV420P && | |||||
| pix_fmt != AV_PIX_FMT_YUVJ420P && | |||||
| pix_fmt != AV_PIX_FMT_YUV422P && | |||||
| pix_fmt != AV_PIX_FMT_YUVJ422P && | |||||
| pix_fmt != AV_PIX_FMT_YUV444P && | |||||
| pix_fmt != AV_PIX_FMT_YUV411P && | |||||
| pix_fmt != AV_PIX_FMT_GRAY8) | |||||
| return -1; | |||||
| if ((width & 3) != 0 || (height & 3) != 0) | |||||
| return -1; | |||||
| for(i=0;i<3;i++) { | |||||
| if (i == 1) { | |||||
| switch(pix_fmt) { | |||||
| case AV_PIX_FMT_YUVJ420P: | |||||
| case AV_PIX_FMT_YUV420P: | |||||
| width >>= 1; | |||||
| height >>= 1; | |||||
| break; | |||||
| case AV_PIX_FMT_YUV422P: | |||||
| case AV_PIX_FMT_YUVJ422P: | |||||
| width >>= 1; | |||||
| break; | |||||
| case AV_PIX_FMT_YUV411P: | |||||
| width >>= 2; | |||||
| break; | |||||
| default: | |||||
| break; | |||||
| } | |||||
| if (pix_fmt == AV_PIX_FMT_GRAY8) { | |||||
| break; | |||||
| } | |||||
| } | |||||
| if (src == dst) { | |||||
| 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], | |||||
| width, height); | |||||
| } | |||||
| } | |||||
| emms_c(); | |||||
| return 0; | |||||
| } | |||||
| #endif /* FF_API_DEINTERLACE */ | |||||
| @@ -23,22 +23,6 @@ | |||||
| #include "version.h" | #include "version.h" | ||||
| #if FF_API_DEINTERLACE | |||||
| void ff_deinterlace_line_mmx(uint8_t *dst, | |||||
| const uint8_t *lum_m4, const uint8_t *lum_m3, | |||||
| const uint8_t *lum_m2, const uint8_t *lum_m1, | |||||
| const uint8_t *lum, | |||||
| int size); | |||||
| void ff_deinterlace_line_inplace_mmx(const uint8_t *lum_m4, | |||||
| const uint8_t *lum_m3, | |||||
| const uint8_t *lum_m2, | |||||
| const uint8_t *lum_m1, | |||||
| const uint8_t *lum, int size); | |||||
| #endif /* FF_API_DEINTERLACE */ | |||||
| /* 1/2^n downscaling functions */ | /* 1/2^n downscaling functions */ | ||||
| void ff_shrink22(uint8_t *dst, int dst_wrap, const uint8_t *src, int src_wrap, int width, int height); | void ff_shrink22(uint8_t *dst, int dst_wrap, const uint8_t *src, int src_wrap, int width, int height); | ||||
| void ff_shrink44(uint8_t *dst, int dst_wrap, const uint8_t *src, int src_wrap, int width, int height); | void ff_shrink44(uint8_t *dst, int dst_wrap, const uint8_t *src, int src_wrap, int width, int height); | ||||
| @@ -48,9 +48,6 @@ | |||||
| * the public API and may change, break or disappear at any time. | * the public API and may change, break or disappear at any time. | ||||
| */ | */ | ||||
| #ifndef FF_API_DEINTERLACE | |||||
| #define FF_API_DEINTERLACE (LIBAVCODEC_VERSION_MAJOR < 57) | |||||
| #endif | |||||
| #ifndef FF_API_MISSING_SAMPLE | #ifndef FF_API_MISSING_SAMPLE | ||||
| #define FF_API_MISSING_SAMPLE (LIBAVCODEC_VERSION_MAJOR < 57) | #define FF_API_MISSING_SAMPLE (LIBAVCODEC_VERSION_MAJOR < 57) | ||||
| #endif | #endif | ||||
| @@ -69,10 +69,6 @@ MMX-OBJS-$(CONFIG_MPEG4_DECODER) += x86/xvididct_mmx.o \ | |||||
| x86/xvididct_sse2.o | x86/xvididct_sse2.o | ||||
| MMX-OBJS-$(CONFIG_VC1_DECODER) += x86/vc1dsp_mmx.o | MMX-OBJS-$(CONFIG_VC1_DECODER) += x86/vc1dsp_mmx.o | ||||
| # YASM optimizations | |||||
| YASM-OBJS += x86/deinterlace.o \ | |||||
| # subsystems | # subsystems | ||||
| YASM-OBJS-$(CONFIG_AC3DSP) += x86/ac3dsp.o | YASM-OBJS-$(CONFIG_AC3DSP) += x86/ac3dsp.o | ||||
| YASM-OBJS-$(CONFIG_AUDIODSP) += x86/audiodsp.o | YASM-OBJS-$(CONFIG_AUDIODSP) += x86/audiodsp.o | ||||
| @@ -1,82 +0,0 @@ | |||||
| ;****************************************************************************** | |||||
| ;* SIMD-optimized deinterlacing functions | |||||
| ;* Copyright (c) 2010 Vitor Sessak | |||||
| ;* Copyright (c) 2002 Michael Niedermayer | |||||
| ;* | |||||
| ;* This file is part of Libav. | |||||
| ;* | |||||
| ;* Libav is free software; you can redistribute it and/or | |||||
| ;* modify it under the terms of the GNU Lesser General Public | |||||
| ;* License as published by the Free Software Foundation; either | |||||
| ;* version 2.1 of the License, or (at your option) any later version. | |||||
| ;* | |||||
| ;* Libav is distributed in the hope that it will be useful, | |||||
| ;* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
| ;* Lesser General Public License for more details. | |||||
| ;* | |||||
| ;* You should have received a copy of the GNU Lesser General Public | |||||
| ;* License along with Libav; if not, write to the Free Software | |||||
| ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| ;****************************************************************************** | |||||
| %include "libavutil/x86/x86util.asm" | |||||
| SECTION_RODATA | |||||
| cextern pw_4 | |||||
| SECTION .text | |||||
| %macro DEINTERLACE 1 | |||||
| %ifidn %1, inplace | |||||
| ;void ff_deinterlace_line_inplace_mmx(const uint8_t *lum_m4, const uint8_t *lum_m3, const uint8_t *lum_m2, const uint8_t *lum_m1, const uint8_t *lum, int size) | |||||
| cglobal deinterlace_line_inplace_mmx, 6,6,7, lum_m4, lum_m3, lum_m2, lum_m1, lum, size | |||||
| %else | |||||
| ;void ff_deinterlace_line_mmx(uint8_t *dst, const uint8_t *lum_m4, const uint8_t *lum_m3, const uint8_t *lum_m2, const uint8_t *lum_m1, const uint8_t *lum, int size) | |||||
| cglobal deinterlace_line_mmx, 7,7,7, dst, lum_m4, lum_m3, lum_m2, lum_m1, lum, size | |||||
| %endif | |||||
| pxor mm7, mm7 | |||||
| movq mm6, [pw_4] | |||||
| .nextrow: | |||||
| movd mm0, [lum_m4q] | |||||
| movd mm1, [lum_m3q] | |||||
| movd mm2, [lum_m2q] | |||||
| %ifidn %1, inplace | |||||
| movd [lum_m4q], mm2 | |||||
| %endif | |||||
| movd mm3, [lum_m1q] | |||||
| movd mm4, [lumq] | |||||
| punpcklbw mm0, mm7 | |||||
| punpcklbw mm1, mm7 | |||||
| punpcklbw mm2, mm7 | |||||
| punpcklbw mm3, mm7 | |||||
| punpcklbw mm4, mm7 | |||||
| paddw mm1, mm3 | |||||
| psllw mm2, 1 | |||||
| paddw mm0, mm4 | |||||
| psllw mm1, 2 | |||||
| paddw mm2, mm6 | |||||
| paddw mm1, mm2 | |||||
| psubusw mm1, mm0 | |||||
| psrlw mm1, 3 | |||||
| packuswb mm1, mm7 | |||||
| %ifidn %1, inplace | |||||
| movd [lum_m2q], mm1 | |||||
| %else | |||||
| movd [dstq], mm1 | |||||
| add dstq, 4 | |||||
| %endif | |||||
| add lum_m4q, 4 | |||||
| add lum_m3q, 4 | |||||
| add lum_m2q, 4 | |||||
| add lum_m1q, 4 | |||||
| add lumq, 4 | |||||
| sub sized, 4 | |||||
| jg .nextrow | |||||
| REP_RET | |||||
| %endmacro | |||||
| DEINTERLACE "" | |||||
| DEINTERLACE inplace | |||||