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);
|
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().
|
* 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;
|
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
|
#ifdef TEST
|
||||||
|
|
||||||
int main(void){
|
int main(void){
|
||||||
|
@ -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);
|
||||||
|
@ -73,9 +73,6 @@
|
|||||||
#ifndef FF_API_AVCODEC_RESAMPLE
|
#ifndef FF_API_AVCODEC_RESAMPLE
|
||||||
#define FF_API_AVCODEC_RESAMPLE FF_API_AUDIO_CONVERT
|
#define FF_API_AVCODEC_RESAMPLE FF_API_AUDIO_CONVERT
|
||||||
#endif
|
#endif
|
||||||
#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
|
||||||
|
@ -77,10 +77,6 @@ MMX-OBJS-$(CONFIG_SNOW_DECODER) += x86/snowdsp.o
|
|||||||
MMX-OBJS-$(CONFIG_SNOW_ENCODER) += x86/snowdsp.o
|
MMX-OBJS-$(CONFIG_SNOW_ENCODER) += x86/snowdsp.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,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