mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Merge commit 'cad40a3833ad81a352e7657ec6f7d637cea3b798'
* commit 'cad40a3833ad81a352e7657ec6f7d637cea3b798': lavc: Drop deprecated deinterlace module Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
This commit is contained in:
commit
41194f065c
@ -4977,16 +4977,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_image_copy().
|
||||
*/
|
||||
|
@ -287,181 +287,6 @@ 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 */
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
int main(void){
|
||||
|
@ -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);
|
||||
|
@ -73,9 +73,6 @@
|
||||
#ifndef FF_API_AVCODEC_RESAMPLE
|
||||
#define FF_API_AVCODEC_RESAMPLE FF_API_AUDIO_CONVERT
|
||||
#endif
|
||||
#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
|
||||
|
@ -77,10 +77,6 @@ MMX-OBJS-$(CONFIG_SNOW_DECODER) += x86/snowdsp.o
|
||||
MMX-OBJS-$(CONFIG_SNOW_ENCODER) += x86/snowdsp.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,84 +0,0 @@
|
||||
;******************************************************************************
|
||||
;* SIMD-optimized deinterlacing functions
|
||||
;* Copyright (c) 2010 Vitor Sessak
|
||||
;* Copyright (c) 2002 Michael Niedermayer
|
||||
;*
|
||||
;* This file is part of FFmpeg.
|
||||
;*
|
||||
;* FFmpeg 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.
|
||||
;*
|
||||
;* FFmpeg 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 FFmpeg; 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, 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, 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
|
||||
|
||||
INIT_MMX mmx
|
||||
|
||||
DEINTERLACE ""
|
||||
|
||||
DEINTERLACE inplace
|
Loading…
Reference in New Issue
Block a user