@@ -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); | |||
#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. | |||
*/ | |||
@@ -335,178 +335,3 @@ int av_picture_pad(AVPicture *dst, const AVPicture *src, int height, int width, | |||
} | |||
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" | |||
#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 */ | |||
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); | |||
@@ -48,9 +48,6 @@ | |||
* 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 | |||
#define FF_API_MISSING_SAMPLE (LIBAVCODEC_VERSION_MAJOR < 57) | |||
#endif | |||
@@ -69,10 +69,6 @@ MMX-OBJS-$(CONFIG_MPEG4_DECODER) += x86/xvididct_mmx.o \ | |||
x86/xvididct_sse2.o | |||
MMX-OBJS-$(CONFIG_VC1_DECODER) += x86/vc1dsp_mmx.o | |||
# YASM optimizations | |||
YASM-OBJS += x86/deinterlace.o \ | |||
# subsystems | |||
YASM-OBJS-$(CONFIG_AC3DSP) += x86/ac3dsp.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 |