diff options
author | 2012-10-16 07:30:30 +0200 | |
---|---|---|
committer | 2012-10-16 07:30:30 +0200 | |
commit | 4e89851aa128a614f59ff4885af384a266cb24e6 (patch) | |
tree | c6ab9f34ef3e9c1d58f8ec837b93e249e79bdcf6 /libmpcodecs | |
parent | f45eab6faea05834c1337175dbe51437707b8d7e (diff) | |
parent | 6557f206efeb4569a42f1e4810172bc97fd64619 (diff) |
Merge branch 'master' into osd_changes
Conflicts:
Makefile
command.c
libvo/gl_common.c
libvo/vo_corevideo.m
libvo/vo_opengl.c
libvo/vo_opengl_old.c
libvo/vo_opengl_shaders.glsl
sub/ass_mp.c
sub/osd_libass.c
sub/sd_ass.c
Diffstat (limited to 'libmpcodecs')
52 files changed, 37 insertions, 16297 deletions
diff --git a/libmpcodecs/ad_ffmpeg.c b/libmpcodecs/ad_ffmpeg.c index c4d7c13941..cca7725490 100644 --- a/libmpcodecs/ad_ffmpeg.c +++ b/libmpcodecs/ad_ffmpeg.c @@ -52,6 +52,7 @@ struct priv { AVCodecContext *avctx; AVFrame *avframe; char *output; + char *output_packed; // used by deplanarize to store packed audio samples int output_left; int unitsize; int previous_data_left; // input demuxer packet data @@ -71,7 +72,7 @@ static int setup_format(sh_audio_t *sh_audio, const AVCodecContext *lavc_context) { int sample_format = sh_audio->sample_format; - switch (lavc_context->sample_fmt) { + switch (av_get_packed_sample_fmt(lavc_context->sample_fmt)) { case AV_SAMPLE_FMT_U8: sample_format = AF_FORMAT_U8; break; case AV_SAMPLE_FMT_S16: sample_format = AF_FORMAT_S16_NE; break; case AV_SAMPLE_FMT_S32: sample_format = AF_FORMAT_S32_NE; break; @@ -218,7 +219,7 @@ static int init(sh_audio_t *sh_audio) if (sh_audio->wf && sh_audio->wf->nAvgBytesPerSec) sh_audio->i_bps = sh_audio->wf->nAvgBytesPerSec; - switch (lavc_context->sample_fmt) { + switch (av_get_packed_sample_fmt(lavc_context->sample_fmt)) { case AV_SAMPLE_FMT_U8: case AV_SAMPLE_FMT_S16: case AV_SAMPLE_FMT_S32: @@ -264,6 +265,34 @@ static int control(sh_audio_t *sh, int cmd, void *arg, ...) return CONTROL_UNKNOWN; } +static av_always_inline void deplanarize(struct sh_audio *sh) +{ + struct priv *priv = sh->context; + + size_t bps = av_get_bytes_per_sample(priv->avctx->sample_fmt); + size_t nb_samples = priv->avframe->nb_samples; + size_t channels = priv->avctx->channels; + size_t size = bps * nb_samples * channels; + + if (talloc_get_size(priv->output_packed) != size) + priv->output_packed = + talloc_realloc_size(priv, priv->output_packed, size); + + size_t offset = 0; + unsigned char *output_ptr = priv->output_packed; + unsigned char **src = priv->avframe->data; + + for (size_t s = 0; s < nb_samples; s++) { + for (size_t c = 0; c < channels; c++) { + memcpy(output_ptr, src[c] + offset, bps); + output_ptr += bps; + } + offset += bps; + } + + priv->output = priv->output_packed; +} + static int decode_new_packet(struct sh_audio *sh) { struct priv *priv = sh->context; @@ -320,10 +349,6 @@ static int decode_new_packet(struct sh_audio *sh) priv->previous_data_left = insize - ret; if (!got_frame) return 0; - /* An error is reported later from output format checking, but make - * sure we don't crash by overreading first plane. */ - if (av_sample_fmt_is_planar(avctx->sample_fmt) && avctx->channels > 1) - return 0; uint64_t unitsize = (uint64_t)av_get_bytes_per_sample(avctx->sample_fmt) * avctx->channels; if (unitsize > 100000) @@ -333,7 +358,11 @@ static int decode_new_packet(struct sh_audio *sh) if (output_left > 500000000) abort(); priv->output_left = output_left; - priv->output = priv->avframe->data[0]; + if (av_sample_fmt_is_planar(avctx->sample_fmt) && avctx->channels > 1) { + deplanarize(sh); + } else { + priv->output = priv->avframe->data[0]; + } mp_dbg(MSGT_DECAUDIO, MSGL_DBG2, "Decoded %d -> %d \n", insize, priv->output_left); return 0; diff --git a/libmpcodecs/cmmx.h b/libmpcodecs/cmmx.h deleted file mode 100644 index 51ffd235bc..0000000000 --- a/libmpcodecs/cmmx.h +++ /dev/null @@ -1,202 +0,0 @@ -/* - * x86 MMX and MMX2 packed byte operations in portable C. - * Extra instructions: pdiffub, pcmpzb, psumbw, pcmpgtub - * Author: Zoltan Hidvegi - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#ifndef MPLAYER_CMMX_H -#define MPLAYER_CMMX_H - -typedef unsigned long cmmx_t; - -#define ONE_BYTES (~(cmmx_t)0 / 255) -#define SIGN_BITS (ONE_BYTES << 7) -#define LOWBW_MASK (~(cmmx_t)0 / 257) - -static inline cmmx_t -paddb(cmmx_t a, cmmx_t b) -{ - return ((a & ~SIGN_BITS) + (b & ~SIGN_BITS)) ^ ((a^b) & SIGN_BITS); -} - -static inline cmmx_t -psubb(cmmx_t a, cmmx_t b) -{ - return ((a | SIGN_BITS) - (b & ~SIGN_BITS)) ^ (~(a^b) & SIGN_BITS); -} - -static inline cmmx_t -paddusb(cmmx_t a, cmmx_t b) -{ - cmmx_t s = (a & ~SIGN_BITS) + (b & ~SIGN_BITS); - cmmx_t abs = (a | b) & SIGN_BITS; - cmmx_t c = abs & (s | (a & b)); - return s | abs | (abs - (c >> 7)); -} - -static inline cmmx_t -paddusb_s(cmmx_t a, cmmx_t b) -{ - cmmx_t sum = a+b; - cmmx_t ov = sum & SIGN_BITS; - return sum + (sum ^ (ov - (ov>>7))); -} - -static inline cmmx_t -psubusb(cmmx_t a, cmmx_t b) -{ - cmmx_t s = (a | SIGN_BITS) - (b & ~SIGN_BITS); - cmmx_t anb = a & ~b; - cmmx_t c = (anb | (s & ~(a^b))) & SIGN_BITS; - return s & ((c & anb) | (c - (c >> 7))); -} - -static inline cmmx_t -psubusb_s(cmmx_t a, cmmx_t b) -{ - cmmx_t d = (a|SIGN_BITS) - b; - cmmx_t m = d & SIGN_BITS; - return d & (m - (m>>7)); -} - -static inline cmmx_t -pcmpgtub(cmmx_t b, cmmx_t a) -{ - cmmx_t s = (a | SIGN_BITS) - (b & ~SIGN_BITS); - cmmx_t ret = ((~a & b) | (~s & ~(a ^ b))) & SIGN_BITS; - return ret | (ret - (ret >> 7)); -} - -static inline cmmx_t -pdiffub(cmmx_t a, cmmx_t b) -{ - cmmx_t xs = (~a ^ b) & SIGN_BITS; - cmmx_t s = ((a | SIGN_BITS) - (b & ~SIGN_BITS)) ^ xs; - cmmx_t gt = ((~a & b) | (s & xs)) & SIGN_BITS; - cmmx_t gt7 = gt >> 7; - return (s ^ gt ^ (gt - gt7)) + gt7; -} - -static inline cmmx_t -pdiffub_s(cmmx_t a, cmmx_t b) -{ - cmmx_t d = (a|SIGN_BITS) - b; - cmmx_t g = (~d & SIGN_BITS) >> 7; - return (d ^ (SIGN_BITS-g)) + g; -} - -static inline cmmx_t -pmaxub(cmmx_t a, cmmx_t b) -{ - return psubusb(a,b) + b; -} - -static inline cmmx_t -pminub(cmmx_t a, cmmx_t b) -{ - return paddusb(a,~b) - ~b; -} - -static inline cmmx_t -pminub_s(cmmx_t a, cmmx_t b) -{ - cmmx_t d = (a|SIGN_BITS) - b; - cmmx_t m = ~SIGN_BITS + ((d&SIGN_BITS)>>7); - return ((d&m) + b) & ~SIGN_BITS; -} - -static inline cmmx_t -pavgb(cmmx_t a, cmmx_t b) -{ - cmmx_t ao = a & ONE_BYTES; - cmmx_t bo = b & ONE_BYTES; - return ((a^ao)>>1) + ((b^bo)>>1) + (ao|bo); -} - -static inline cmmx_t -pavgb_s(cmmx_t a, cmmx_t b) -{ - return ((a+b+ONE_BYTES)>>1) & ~SIGN_BITS; -} - -static inline cmmx_t -p31avgb(cmmx_t a, cmmx_t b) -{ - cmmx_t ao = a & (3*ONE_BYTES); - cmmx_t bo = b & (3*ONE_BYTES); - return 3*((a^ao)>>2) + ((b^bo)>>2) + - (((3*ao+bo+2*ONE_BYTES)>>2) & (3*ONE_BYTES)); -} - -static inline cmmx_t -p31avgb_s(cmmx_t a, cmmx_t b) -{ - cmmx_t avg = ((a+b)>>1) & ~SIGN_BITS; - return pavgb_s(avg, a); -} - -static inline unsigned long -psumbw(cmmx_t a) -{ - cmmx_t t = (a & LOWBW_MASK) + ((a>>8) & LOWBW_MASK); - unsigned long ret = - (unsigned long)t + (unsigned long)(t >> (4*sizeof(cmmx_t))); - if (sizeof(cmmx_t) > 4) - ret += ret >> 16; - return ret & 0xffff; -} - -static inline unsigned long -psumbw_s(cmmx_t a) -{ - unsigned long ret = - (unsigned long)a + (unsigned long)(a >> (4*sizeof(cmmx_t))); - if (sizeof(cmmx_t) <= 4) - return (ret & 0xff) + ((ret>>8) & 0xff); - ret = (ret & 0xff00ff) + ((ret>>8) & 0xff00ff); - ret += ret >> 16; - return ret & 0xffff; -} - -static inline unsigned long -psadbw(cmmx_t a, cmmx_t b) -{ - return psumbw(pdiffub(a,b)); -} - -static inline unsigned long -psadbw_s(cmmx_t a, cmmx_t b) -{ - return psumbw_s(pdiffub_s(a,b)); -} - -static inline cmmx_t -pcmpzb(cmmx_t a) -{ - cmmx_t ret = (((a | SIGN_BITS) - ONE_BYTES) | a) & SIGN_BITS; - return ~(ret | (ret - (ret >> 7))); -} - -static inline cmmx_t -pcmpeqb(cmmx_t a, cmmx_t b) -{ - return pcmpzb(a ^ b); -} - -#endif /* MPLAYER_CMMX_H */ diff --git a/libmpcodecs/vd_null.c b/libmpcodecs/vd_null.c deleted file mode 100644 index 894585b42f..0000000000 --- a/libmpcodecs/vd_null.c +++ /dev/null @@ -1,56 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> - -#include "config.h" -#include "mp_msg.h" - -#include "vd_internal.h" - -static const vd_info_t info = -{ - "Null video decoder", - "null", - "A'rpi", - "A'rpi", - "no decoding" -}; - -LIBVD_EXTERN(null) - -// to set/get/query special features/parameters -static int control(sh_video_t *sh,int cmd,void* arg,...){ - return CONTROL_UNKNOWN; -} - -// init driver -static int init(sh_video_t *sh){ - if(!mpcodecs_config_vo(sh,sh->disp_w,sh->disp_h,IMGFMT_BGR24)) return 0; - return 1; -} - -// uninit driver -static void uninit(sh_video_t *sh){ -} - -// decode a frame -static mp_image_t* decode(sh_video_t *sh,void* data,int len,int flags){ - return NULL; -} diff --git a/libmpcodecs/vf.c b/libmpcodecs/vf.c index f847dd69b8..5ec7d19570 100644 --- a/libmpcodecs/vf.c +++ b/libmpcodecs/vf.c @@ -38,7 +38,6 @@ #include "libvo/fastmemcpy.h" extern const vf_info_t vf_info_vo; -extern const vf_info_t vf_info_bmovl; extern const vf_info_t vf_info_crop; extern const vf_info_t vf_info_expand; extern const vf_info_t vf_info_pp; @@ -48,161 +47,65 @@ extern const vf_info_t vf_info_noformat; extern const vf_info_t vf_info_flip; extern const vf_info_t vf_info_rotate; extern const vf_info_t vf_info_mirror; -extern const vf_info_t vf_info_palette; -extern const vf_info_t vf_info_lavc; -extern const vf_info_t vf_info_dvbscale; -extern const vf_info_t vf_info_cropdetect; -extern const vf_info_t vf_info_test; extern const vf_info_t vf_info_noise; -extern const vf_info_t vf_info_yvu9; -extern const vf_info_t vf_info_lavcdeint; -extern const vf_info_t vf_info_eq; extern const vf_info_t vf_info_eq2; extern const vf_info_t vf_info_gradfun; -extern const vf_info_t vf_info_halfpack; -extern const vf_info_t vf_info_dint; -extern const vf_info_t vf_info_1bpp; -extern const vf_info_t vf_info_2xsai; extern const vf_info_t vf_info_unsharp; extern const vf_info_t vf_info_swapuv; -extern const vf_info_t vf_info_il; -extern const vf_info_t vf_info_fil; -extern const vf_info_t vf_info_boxblur; -extern const vf_info_t vf_info_sab; -extern const vf_info_t vf_info_smartblur; -extern const vf_info_t vf_info_perspective; extern const vf_info_t vf_info_down3dright; -extern const vf_info_t vf_info_field; -extern const vf_info_t vf_info_denoise3d; extern const vf_info_t vf_info_hqdn3d; -extern const vf_info_t vf_info_detc; -extern const vf_info_t vf_info_telecine; -extern const vf_info_t vf_info_tinterlace; -extern const vf_info_t vf_info_tfields; -extern const vf_info_t vf_info_ivtc; extern const vf_info_t vf_info_ilpack; extern const vf_info_t vf_info_dsize; -extern const vf_info_t vf_info_decimate; extern const vf_info_t vf_info_softpulldown; extern const vf_info_t vf_info_pullup; -extern const vf_info_t vf_info_filmdint; -extern const vf_info_t vf_info_framestep; -extern const vf_info_t vf_info_tile; extern const vf_info_t vf_info_delogo; -extern const vf_info_t vf_info_remove_logo; -extern const vf_info_t vf_info_hue; -extern const vf_info_t vf_info_spp; -extern const vf_info_t vf_info_uspp; -extern const vf_info_t vf_info_fspp; -extern const vf_info_t vf_info_pp7; -extern const vf_info_t vf_info_yuvcsp; -extern const vf_info_t vf_info_kerndeint; -extern const vf_info_t vf_info_rgbtest; -extern const vf_info_t vf_info_qp; extern const vf_info_t vf_info_phase; extern const vf_info_t vf_info_divtc; -extern const vf_info_t vf_info_harddup; extern const vf_info_t vf_info_softskip; extern const vf_info_t vf_info_screenshot; extern const vf_info_t vf_info_screenshot_force; extern const vf_info_t vf_info_ass; -extern const vf_info_t vf_info_mcdeint; extern const vf_info_t vf_info_yadif; -extern const vf_info_t vf_info_blackframe; -extern const vf_info_t vf_info_geq; -extern const vf_info_t vf_info_ow; -extern const vf_info_t vf_info_fixpts; extern const vf_info_t vf_info_stereo3d; extern const vf_info_t vf_info_dlopen; // list of available filters: static const vf_info_t *const filter_list[] = { -#ifdef HAVE_POSIX_SELECT - &vf_info_bmovl, -#endif &vf_info_crop, &vf_info_expand, &vf_info_scale, -// &vf_info_osd, &vf_info_vo, &vf_info_format, &vf_info_noformat, &vf_info_flip, &vf_info_rotate, &vf_info_mirror, - &vf_info_palette, - &vf_info_pp7, #ifdef CONFIG_LIBPOSTPROC &vf_info_pp, #endif - &vf_info_lavc, - &vf_info_lavcdeint, + &vf_info_screenshot, &vf_info_screenshot_force, - &vf_info_fspp, - &vf_info_uspp, - &vf_info_dvbscale, - &vf_info_cropdetect, - &vf_info_test, &vf_info_noise, - &vf_info_yvu9, - &vf_info_eq, &vf_info_eq2, &vf_info_gradfun, - &vf_info_halfpack, - &vf_info_dint, - &vf_info_1bpp, - &vf_info_2xsai, &vf_info_unsharp, &vf_info_swapuv, - &vf_info_il, - &vf_info_fil, - &vf_info_boxblur, - &vf_info_sab, - &vf_info_smartblur, - &vf_info_perspective, &vf_info_down3dright, - &vf_info_field, - &vf_info_denoise3d, &vf_info_hqdn3d, - &vf_info_detc, - &vf_info_telecine, - &vf_info_tinterlace, - &vf_info_tfields, - &vf_info_ivtc, &vf_info_ilpack, &vf_info_dsize, - &vf_info_decimate, &vf_info_softpulldown, &vf_info_pullup, - &vf_info_filmdint, - &vf_info_framestep, - &vf_info_tile, &vf_info_delogo, - &vf_info_remove_logo, - &vf_info_hue, -#ifdef CONFIG_FFMPEG_INTERNALS - &vf_info_spp, - &vf_info_mcdeint, -#endif - &vf_info_geq, - &vf_info_qp, - &vf_info_yuvcsp, - &vf_info_kerndeint, - &vf_info_rgbtest, &vf_info_phase, &vf_info_divtc, - &vf_info_harddup, - &vf_info_softskip, #ifdef CONFIG_ASS &vf_info_ass, #endif &vf_info_yadif, - &vf_info_blackframe, - &vf_info_ow, - &vf_info_fixpts, &vf_info_stereo3d, &vf_info_dlopen, NULL diff --git a/libmpcodecs/vf_1bpp.c b/libmpcodecs/vf_1bpp.c deleted file mode 100644 index 8d13735942..0000000000 --- a/libmpcodecs/vf_1bpp.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -//===========================================================================// - -static const unsigned int bgr_list[]={ - IMGFMT_Y800, - IMGFMT_Y8, - IMGFMT_BGR8, - IMGFMT_RGB8, - - IMGFMT_YVU9, - IMGFMT_411P, - IMGFMT_YV12, - IMGFMT_I420, - IMGFMT_IYUV, - IMGFMT_422P, - IMGFMT_444P, - - IMGFMT_YUY2, - IMGFMT_BGR12, - IMGFMT_RGB12, - IMGFMT_BGR15, - IMGFMT_RGB15, - IMGFMT_BGR16, - IMGFMT_RGB16, - - IMGFMT_BGR32, - IMGFMT_RGB32, - -// IMGFMT_BGR24, -// IMGFMT_RGB24, - 0 -}; - -static unsigned int find_best(struct vf_instance *vf){ - unsigned int best=0; - int ret; - const unsigned int* p=bgr_list; - while(*p){ - ret=vf->next->query_format(vf->next,*p); - mp_msg(MSGT_VFILTER,MSGL_V,"[%s] query(%s) -> %d\n",vf->info->name,vo_format_name(*p),ret&3); - if(ret&VFCAP_CSP_SUPPORTED_BY_HW){ best=*p; break;} // no conversion -> bingo! - if(ret&VFCAP_CSP_SUPPORTED && !best) best=*p; // best with conversion - ++p; - } - return best; -} - -//===========================================================================// - -struct vf_priv_s { - unsigned int fmt; -}; - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - if (!vf->priv->fmt) - vf->priv->fmt=find_best(vf); - if(!vf->priv->fmt){ - // no matching fmt, so force one... - if(outfmt==IMGFMT_RGB8) vf->priv->fmt=IMGFMT_RGB32; - else if(outfmt==IMGFMT_BGR8) vf->priv->fmt=IMGFMT_BGR32; - else return 0; - } - return vf_next_config(vf,width,height,d_width,d_height,flags,vf->priv->fmt); -} - -static const int bittab[8]={128,64,32,16,8,4,2,1}; - -static void convert(mp_image_t *mpi, mp_image_t *dmpi, int value0, int value1,int bpp){ - int y; - for(y=0;y<mpi->h;y++){ - unsigned char* src=mpi->planes[0]+mpi->stride[0]*y; - switch(bpp){ - case 1: { - unsigned char* dst=dmpi->planes[0]+dmpi->stride[0]*y; - int x; - for(x=0;x<mpi->w;x++) - dst[x]=(src[x>>3]&bittab[x&7]) ? value1 : value0; - break; } - case 2: { - uint16_t* dst=(uint16_t*)(dmpi->planes[0]+dmpi->stride[0]*y); - int x; - for(x=0;x<mpi->w;x++) - dst[x]=(src[x>>3]&bittab[x&7]) ? value1 : value0; - break; } - case 4: { - uint32_t* dst=(uint32_t*)(dmpi->planes[0]+dmpi->stride[0]*y); - int x; - for(x=0;x<mpi->w;x++) - dst[x]=(src[x>>3]&bittab[x&7]) ? value1 : value0; - break; } - } - } -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - - // hope we'll get DR buffer: - dmpi=vf_get_image(vf->next,vf->priv->fmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->w, mpi->h); - - switch(dmpi->imgfmt){ - case IMGFMT_Y800: - case IMGFMT_Y8: - case IMGFMT_BGR8: - case IMGFMT_RGB8: - convert(mpi,dmpi,0,255,1); - break; - case IMGFMT_YVU9: - case IMGFMT_411P: - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_422P: - case IMGFMT_444P: - convert(mpi,dmpi,0,255,1); - memset(dmpi->planes[1],128,dmpi->stride[1]*dmpi->chroma_height); - memset(dmpi->planes[2],128,dmpi->stride[2]*dmpi->chroma_height); - break; - case IMGFMT_YUY2: - convert(mpi,dmpi,0x8000,0x80ff,2); - break; - case IMGFMT_BGR12: - case IMGFMT_RGB12: - convert(mpi,dmpi,0,0x0fff,2); - break; - case IMGFMT_BGR15: - case IMGFMT_RGB15: - convert(mpi,dmpi,0,0x7fff,2); - break; - case IMGFMT_BGR16: - case IMGFMT_RGB16: - convert(mpi,dmpi,0,0xffff,2); - break; - case IMGFMT_BGR32: - case IMGFMT_RGB32: - convert(mpi,dmpi,0,0x00ffffff,4); - break; - default: - mp_msg(MSGT_VFILTER,MSGL_ERR,"Unhandled format: 0x%X\n",dmpi->imgfmt); - return 0; - } - - return vf_next_put_image(vf,dmpi, pts); -} - -//===========================================================================// - -static int query_format(struct vf_instance *vf, unsigned int fmt){ - int best; - if(fmt!=IMGFMT_RGB1 && fmt!=IMGFMT_BGR1) return 0; - best=find_best(vf); - if(!best) return 0; // no match - return vf->next->query_format(vf->next,best); -} - -static int vf_open(vf_instance_t *vf, char *args){ - vf->config=config; - vf->put_image=put_image; - vf->query_format=query_format; - vf->priv=malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - return 1; -} - -const vf_info_t vf_info_1bpp = { - "1bpp bitmap -> YUV/BGR 8/15/16/32 conversion", - "1bpp", - "A'rpi", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_2xsai.c b/libmpcodecs/vf_2xsai.c deleted file mode 100644 index dc33d9fccf..0000000000 --- a/libmpcodecs/vf_2xsai.c +++ /dev/null @@ -1,336 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -//===========================================================================// - -/* FIXME: these all belong in the context, not as globals! */ - -static uint32_t colorMask = 0xF7DEF7DE; -static uint32_t lowPixelMask = 0x08210821; -static uint32_t qcolorMask = 0xE79CE79C; -static uint32_t qlowpixelMask = 0x18631863; -static uint32_t redblueMask = 0xF81F; -static uint32_t greenMask = 0x7E0; -static int PixelsPerMask = 2; - -#define makecol(r,g,b) (r+(g<<8)+(b<<16)) -#define makecol_depth(d,r,g,b) (r+(g<<8)+(b<<16)) - -static int Init_2xSaI(int d) -{ - - int minr = 0, ming = 0, minb = 0; - int i; - -// if (d != 15 && d != 16 && d != 24 && d != 32) -// return -1; - - /* Get lowest color bit */ - for (i = 0; i < 255; i++) { - if (!minr) - minr = makecol(i, 0, 0); - if (!ming) - ming = makecol(0, i, 0); - if (!minb) - minb = makecol(0, 0, i); - } - - colorMask = (makecol_depth(d, 255, 0, 0) - minr) | (makecol_depth(d, 0, 255, 0) - ming) | (makecol_depth(d, 0, 0, 255) - minb); - lowPixelMask = minr | ming | minb; - qcolorMask = (makecol_depth(d, 255, 0, 0) - 3 * minr) | (makecol_depth(d, 0, 255, 0) - 3 * ming) | (makecol_depth(d, 0, 0, 255) - 3 * minb); - qlowpixelMask = (minr * 3) | (ming * 3) | (minb * 3); - redblueMask = makecol_depth(d, 255, 0, 255); - greenMask = makecol_depth(d, 0, 255, 0); - - PixelsPerMask = (d <= 16) ? 2 : 1; - - if (PixelsPerMask == 2) { - colorMask |= (colorMask << 16); - qcolorMask |= (qcolorMask << 16); - lowPixelMask |= (lowPixelMask << 16); - qlowpixelMask |= (qlowpixelMask << 16); - } - -// TRACE("Color Mask: 0x%lX\n", colorMask); -// TRACE("Low Pixel Mask: 0x%lX\n", lowPixelMask); -// TRACE("QColor Mask: 0x%lX\n", qcolorMask); -// TRACE("QLow Pixel Mask: 0x%lX\n", qlowpixelMask); - - return 0; -} - - -#define GET_RESULT(A, B, C, D) ((A != C || A != D) - (B != C || B != D)) - -#define INTERPOLATE(A, B) (((A & colorMask) >> 1) + ((B & colorMask) >> 1) + (A & B & lowPixelMask)) - -#define Q_INTERPOLATE(A, B, C, D) ((A & qcolorMask) >> 2) + ((B & qcolorMask) >> 2) + ((C & qcolorMask) >> 2) + ((D & qcolorMask) >> 2) \ - + ((((A & qlowpixelMask) + (B & qlowpixelMask) + (C & qlowpixelMask) + (D & qlowpixelMask)) >> 2) & qlowpixelMask) - - -static void Super2xSaI_ex(uint8_t *src, uint32_t src_pitch, - uint8_t *dst, uint32_t dst_pitch, - uint32_t width, uint32_t height, int sbpp) -{ - - unsigned int x, y; - uint32_t color[16]; - unsigned char *src_line[4]; - - /* Point to the first 3 lines. */ - src_line[0] = src; - src_line[1] = src; - src_line[2] = src + src_pitch; - src_line[3] = src + src_pitch * 2; - - x = 0, y = 0; - - if (PixelsPerMask == 2) { - unsigned short *sbp; - sbp = (unsigned short*)src_line[0]; - color[0] = *sbp; color[1] = color[0]; color[2] = color[0]; color[3] = color[0]; - color[4] = color[0]; color[5] = color[0]; color[6] = *(sbp + 1); color[7] = *(sbp + 2); - sbp = (unsigned short*)src_line[2]; - color[8] = *sbp; color[9] = color[8]; color[10] = *(sbp + 1); color[11] = *(sbp + 2); - sbp = (unsigned short*)src_line[3]; - color[12] = *sbp; color[13] = color[12]; color[14] = *(sbp + 1); color[15] = *(sbp + 2); - } - else { - uint32_t *lbp; - lbp = (uint32_t*)src_line[0]; - color[0] = *lbp; color[1] = color[0]; color[2] = color[0]; color[3] = color[0]; - color[4] = color[0]; color[5] = color[0]; color[6] = *(lbp + 1); color[7] = *(lbp + 2); - lbp = (uint32_t*)src_line[2]; - color[8] = *lbp; color[9] = color[8]; color[10] = *(lbp + 1); color[11] = *(lbp + 2); - lbp = (uint32_t*)src_line[3]; - color[12] = *lbp; color[13] = color[12]; color[14] = *(lbp + 1); color[15] = *(lbp + 2); - } - - for (y = 0; y < height; y++) { - unsigned char *dst_line[2]; - - dst_line[0] = dst + dst_pitch*2*y; - dst_line[1] = dst + dst_pitch*(2*y+1); - - /* Todo: x = width - 2, x = width - 1 */ - - for (x = 0; x < width; x++) { - uint32_t product1a, product1b, product2a, product2b; - -//--------------------------------------- B0 B1 B2 B3 0 1 2 3 -// 4 5* 6 S2 -> 4 5* 6 7 -// 1 2 3 S1 8 9 10 11 -// A0 A1 A2 A3 12 13 14 15 -//-------------------------------------- - if (color[9] == color[6] && color[5] != color[10]) { - product2b = color[9]; - product1b = product2b; - } - else if (color[5] == color[10] && color[9] != color[6]) { - product2b = color[5]; - product1b = product2b; - } - else if (color[5] == color[10] && color[9] == color[6]) { - int r = 0; - - r += GET_RESULT(color[6], color[5], color[8], color[13]); - r += GET_RESULT(color[6], color[5], color[4], color[1]); - r += GET_RESULT(color[6], color[5], color[14], color[11]); - r += GET_RESULT(color[6], color[5], color[2], color[7]); - - if (r > 0) - product1b = color[6]; - else if (r < 0) - product1b = color[5]; - else - product1b = INTERPOLATE(color[5], color[6]); - - product2b = product1b; - - } - else { - if (color[6] == color[10] && color[10] == color[13] && color[9] != color[14] && color[10] != color[12]) - product2b = Q_INTERPOLATE(color[10], color[10], color[10], color[9]); - else if (color[5] == color[9] && color[9] == color[14] && color[13] != color[10] && color[9] != color[15]) - product2b = Q_INTERPOLATE(color[9], color[9], color[9], color[10]); - else - product2b = INTERPOLATE(color[9], color[10]); - - if (color[6] == color[10] && color[6] == color[1] && color[5] != color[2] && color[6] != color[0]) - product1b = Q_INTERPOLATE(color[6], color[6], color[6], color[5]); - else if (color[5] == color[9] && color[5] == color[2] && color[1] != color[6] && color[5] != color[3]) - product1b = Q_INTERPOLATE(color[6], color[5], color[5], color[5]); - else - product1b = INTERPOLATE(color[5], color[6]); - } - - if (color[5] == color[10] && color[9] != color[6] && color[4] == color[5] && color[5] != color[14]) - product2a = INTERPOLATE(color[9], color[5]); - else if (color[5] == color[8] && color[6] == color[5] && color[4] != color[9] && color[5] != color[12]) - product2a = INTERPOLATE(color[9], color[5]); - else - product2a = color[9]; - - if (color[9] == color[6] && color[5] != color[10] && color[8] == color[9] && color[9] != color[2]) - product1a = INTERPOLATE(color[9], color[5]); - else if (color[4] == color[9] && color[10] == color[9] && color[8] != color[5] && color[9] != color[0]) - product1a = INTERPOLATE(color[9], color[5]); - else - product1a = color[5]; - - if (PixelsPerMask == 2) { - *((uint32_t *) (&dst_line[0][x * 4])) = product1a | (product1b << 16); - *((uint32_t *) (&dst_line[1][x * 4])) = product2a | (product2b << 16); - } - else { - *((uint32_t *) (&dst_line[0][x * 8])) = product1a; - *((uint32_t *) (&dst_line[0][x * 8 + 4])) = product1b; - *((uint32_t *) (&dst_line[1][x * 8])) = product2a; - *((uint32_t *) (&dst_line[1][x * 8 + 4])) = product2b; - } - - /* Move color matrix forward */ - color[0] = color[1]; color[4] = color[5]; color[8] = color[9]; color[12] = color[13]; - color[1] = color[2]; color[5] = color[6]; color[9] = color[10]; color[13] = color[14]; - color[2] = color[3]; color[6] = color[7]; color[10] = color[11]; color[14] = color[15]; - - if (x < width - 3) { - x += 3; - if (PixelsPerMask == 2) { - color[3] = *(((unsigned short*)src_line[0]) + x); - color[7] = *(((unsigned short*)src_line[1]) + x); - color[11] = *(((unsigned short*)src_line[2]) + x); - color[15] = *(((unsigned short*)src_line[3]) + x); - } - else { - color[3] = *(((uint32_t*)src_line[0]) + x); - color[7] = *(((uint32_t*)src_line[1]) + x); - color[11] = *(((uint32_t*)src_line[2]) + x); - color[15] = *(((uint32_t*)src_line[3]) + x); - } - x -= 3; - } - } - - /* We're done with one line, so we shift the source lines up */ - src_line[0] = src_line[1]; - src_line[1] = src_line[2]; - src_line[2] = src_line[3]; - - /* Read next line */ - if (y + 3 >= height) - src_line[3] = src_line[2]; - else - src_line[3] = src_line[2] + src_pitch; - - /* Then shift the color matrix up */ - if (PixelsPerMask == 2) { - unsigned short *sbp; - sbp = (unsigned short*)src_line[0]; - color[0] = *sbp; color[1] = color[0]; color[2] = *(sbp + 1); color[3] = *(sbp + 2); - sbp = (unsigned short*)src_line[1]; - color[4] = *sbp; color[5] = color[4]; color[6] = *(sbp + 1); color[7] = *(sbp + 2); - sbp = (unsigned short*)src_line[2]; - color[8] = *sbp; color[9] = color[9]; color[10] = *(sbp + 1); color[11] = *(sbp + 2); - sbp = (unsigned short*)src_line[3]; - color[12] = *sbp; color[13] = color[12]; color[14] = *(sbp + 1); color[15] = *(sbp + 2); - } - else { - uint32_t *lbp; - lbp = (uint32_t*)src_line[0]; - color[0] = *lbp; color[1] = color[0]; color[2] = *(lbp + 1); color[3] = *(lbp + 2); - lbp = (uint32_t*)src_line[1]; - color[4] = *lbp; color[5] = color[4]; color[6] = *(lbp + 1); color[7] = *(lbp + 2); - lbp = (uint32_t*)src_line[2]; - color[8] = *lbp; color[9] = color[9]; color[10] = *(lbp + 1); color[11] = *(lbp + 2); - lbp = (uint32_t*)src_line[3]; - color[12] = *lbp; color[13] = color[12]; color[14] = *(lbp + 1); color[15] = *(lbp + 2); - } - - } // y loop - -} - - -//===========================================================================// - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - - Init_2xSaI(outfmt&255); - - return vf_next_config(vf,2*width,2*height,2*d_width,2*d_height,flags,outfmt); -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - - // hope we'll get DR buffer: - dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - 2*mpi->w, 2*mpi->h); - - Super2xSaI_ex(mpi->planes[0], mpi->stride[0], - dmpi->planes[0], dmpi->stride[0], - mpi->w, mpi->h, mpi->bpp/8); - - return vf_next_put_image(vf,dmpi, pts); -} - -//===========================================================================// - -static int query_format(struct vf_instance *vf, unsigned int fmt){ - switch(fmt){ -// case IMGFMT_BGR15: -// case IMGFMT_BGR16: - case IMGFMT_BGR32: - return vf_next_query_format(vf,fmt); - } - return 0; -} - -static int vf_open(vf_instance_t *vf, char *args){ - vf->config=config; - vf->put_image=put_image; - vf->query_format=query_format; - return 1; -} - -const vf_info_t vf_info_2xsai = { - "2xSai BGR bitmap 2x scaler", - "2xsai", - "A'rpi", - "http://elektron.its.tudelft.nl/~dalikifa/", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_blackframe.c b/libmpcodecs/vf_blackframe.c deleted file mode 100644 index 244da01be2..0000000000 --- a/libmpcodecs/vf_blackframe.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - * detect frames that are (almost) black - * search for black frames to detect scene transitions - * (c) 2006 Julian Hall - * - * based on code designed for skipping commercials - * (c) 2002-2003 Brian J. Murrell - * - * cleanup, simplify, speedup (c) 2006 by Ivo van Poorten - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -struct vf_priv_s { - unsigned int bamount, bthresh, frame, lastkeyframe; -}; - -static int config(struct vf_instance *vf, int width, int height, int d_width, - int d_height, unsigned int flags, unsigned int outfmt) { - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static int query_format(struct vf_instance *vf, unsigned fmt) { - switch(fmt) { - case IMGFMT_YVU9: - case IMGFMT_IF09: - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_CLPL: - case IMGFMT_Y800: - case IMGFMT_Y8: - case IMGFMT_NV12: - case IMGFMT_NV21: - case IMGFMT_444P: - case IMGFMT_422P: - case IMGFMT_411P: - case IMGFMT_HM12: - return vf_next_query_format(vf, fmt); - } - return 0; -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - int x, y; - int nblack=0, pblack=0; - unsigned char *yplane = mpi->planes[0]; - unsigned int ystride = mpi->stride[0]; - int pict_type = mpi->pict_type; - int w = mpi->w, h = mpi->h; - int bthresh = vf->priv->bthresh; - int bamount = vf->priv->bamount; - static const char *const picttypes[4] = { "unknown", "I", "P", "B" }; - - for (y=1; y<=h; y++) { - for (x=0; x<w; x++) - nblack += yplane[x] < bthresh; - pblack = nblack*100/(w*y); - if (pblack < bamount) break; - yplane += ystride; - } - - if (pict_type > 3 || pict_type < 0) pict_type = 0; - if (pict_type == 1) vf->priv->lastkeyframe = vf->priv->frame; - - if (pblack >= bamount) - mp_msg(MSGT_VFILTER, MSGL_INFO,"vf_blackframe: %u, %i%%, %s (I:%u)\n", - vf->priv->frame, pblack, picttypes[pict_type], - vf->priv->lastkeyframe); - - vf->priv->frame++; - - dmpi = vf_get_image(vf->next, mpi->imgfmt, MP_IMGTYPE_EXPORT, 0, - mpi->width, mpi->height); - dmpi->planes[0] = mpi->planes[0]; - dmpi->stride[0] = mpi->stride[0]; - dmpi->planes[1] = mpi->planes[1]; - dmpi->stride[1] = mpi->stride[1]; - dmpi->planes[2] = mpi->planes[2]; - dmpi->stride[2] = mpi->stride[2]; - - vf_clone_mpi_attributes(dmpi, mpi); - - return vf_next_put_image(vf, dmpi, pts); -} - -static int control(struct vf_instance *vf, int request, void* data){ - return vf_next_control(vf,request,data); -} - -static void uninit(struct vf_instance *vf) { - free(vf->priv); -} - -static int vf_open(vf_instance_t *vf, char *args){ - vf->priv = malloc(sizeof(struct vf_priv_s)); - if (!vf->priv) return 0; - - vf->config = config; - vf->put_image = put_image; - vf->control = control; - vf->uninit = uninit; - vf->query_format = query_format; - - vf->priv->bamount = 98; - vf->priv->bthresh = 0x20; - vf->priv->frame = 0; - vf->priv->lastkeyframe = 0; - - if (args) - sscanf(args, "%u:%u", &vf->priv->bamount, &vf->priv->bthresh); - return 1; -} - -const vf_info_t vf_info_blackframe = { - "detects black frames", - "blackframe", - "Brian J. Murrell, Julian Hall, Ivo van Poorten", - "Useful for detecting scene transitions", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_bmovl.c b/libmpcodecs/vf_bmovl.c deleted file mode 100644 index da5dc97f50..0000000000 --- a/libmpcodecs/vf_bmovl.c +++ /dev/null @@ -1,496 +0,0 @@ -/* - * BitMap OVerLay video filter for MPlayer - * - * (C) 2002 Per Wigren <wigren@home.se> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -/* - * Use MPlayer as a framebuffer to read bitmaps and commands from a FIFO - * and display them in the window. - * - * Commands are: - * - * RGBA32 width height xpos ypos alpha clear - * * Followed by width*height*4 bytes of raw RGBA32 data. - * ABGR32 width height xpos ypos alpha clear - * * Followed by width*height*4 bytes of raw ABGR32 data. - * RGB24 width height xpos ypos alpha clear - * * Followed by width*height*3 bytes of raw RGB32 data. - * BGR24 width height xpos ypos alpha clear - * * Followed by width*height*3 bytes of raw BGR32 data. - * - * ALPHA width height xpos ypos alpha - * * Change alpha for area - * CLEAR width height xpos ypos - * * Clear area - * OPAQUE - * * Disable all alpha transparency! - * Send "ALPHA 0 0 0 0 0" to enable again! - * HIDE - * * Hide bitmap - * SHOW - * * Show bitmap - * - * Arguments are: - * width, height Size of image/area - * xpos, ypos Start blitting at X/Y position - * alpha Set alpha difference. 0 means same as original. - * 255 makes everything opaque - * -255 makes everything transparent - * If you set this to -255 you can then send a sequence of - * ALPHA-commands to set the area to -225, -200, -175 etc - * for a nice fade-in-effect! ;) - * clear Clear the framebuffer before blitting. 1 means clear. - * If 0, the image will just be blitted on top of the old - * one, so you don't need to send 1,8MB of RGBA32 data - * everytime a small part of the screen is updated. - * - * Arguments for the filter are hidden:opaque:fifo - * For example 1:0:/tmp/myfifo.fifo will start the filter hidden, transparent - * and use /tmp/myfifo.fifo as the fifo. - * - * If you find bugs, please send me patches! ;) - * - * This filter was developed for use in Freevo (http://freevo.sf.net), but - * anyone is free to use it! ;) - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <errno.h> -#include <sys/stat.h> -#include <sys/types.h> -#include <sys/time.h> -#include <fcntl.h> -#include "config.h" -#include "mp_image.h" -#include "vf.h" -#include "img_format.h" - -#include "mp_msg.h" -#include "libavutil/common.h" - -#include "libvo/fastmemcpy.h" - -#define IS_RAWIMG 0x100 -#define IS_IMG 0x200 - -#define NONE 0x000 -#define IMG_RGBA32 0x101 -#define IMG_ABGR32 0x102 -#define IMG_RGB24 0x103 -#define IMG_BGR24 0x104 -#define IMG_PNG 0x201 -#define CMD_CLEAR 0x001 -#define CMD_ALPHA 0x002 - -#define TRUE 1 -#define FALSE 0 - -#define INRANGE(a,b,c) ( ((a) < (b)) ? (b) : ( ((a) > (c)) ? (c) : (a) ) ) - -#define rgb2y(R,G,B) ( (( 263*R + 516*G + 100*B) >> 10) + 16 ) -#define rgb2u(R,G,B) ( ((-152*R - 298*G + 450*B) >> 10) + 128 ) -#define rgb2v(R,G,B) ( (( 450*R - 376*G - 73*B) >> 10) + 128 ) - -#define DBG(a) (mp_msg(MSGT_VFILTER, MSGL_DBG2, "DEBUG: %d\n", a)) - -struct vf_priv_s { - int w, h, x1, y1, x2, y2; - struct { - unsigned char *y, *u, *v, *a, *oa; - } bitmap; - int stream_fd; - fd_set stream_fdset; - int opaque, hidden; -}; - -static int -query_format(struct vf_instance *vf, unsigned int fmt){ - if(fmt==IMGFMT_YV12) return VFCAP_CSP_SUPPORTED; - return 0; -} - - -static int -config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt) -{ - vf->priv->bitmap.y = malloc( width*height ); - vf->priv->bitmap.u = malloc( width*height/4 ); - vf->priv->bitmap.v = malloc( width*height/4 ); - vf->priv->bitmap.a = malloc( width*height ); - vf->priv->bitmap.oa = malloc( width*height ); - if(!( vf->priv->bitmap.y && - vf->priv->bitmap.u && - vf->priv->bitmap.v && - vf->priv->bitmap.a && - vf->priv->bitmap.oa )) { - mp_msg(MSGT_VFILTER, MSGL_ERR, "vf_bmovl: Could not allocate memory for bitmap buffer: %s\n", strerror(errno) ); - return FALSE; - } - - // Set default to black... - memset( vf->priv->bitmap.u, 128, width*height/4 ); - memset( vf->priv->bitmap.v, 128, width*height/4 ); - - vf->priv->w = vf->priv->x1 = width; - vf->priv->h = vf->priv->y1 = height; - vf->priv->y2 = vf->priv->x2 = 0; - - return vf_next_config(vf, width, height, d_width, d_height, flags, outfmt); -} - -static void -uninit(struct vf_instance *vf) -{ - if(vf->priv) { - free(vf->priv->bitmap.y); - free(vf->priv->bitmap.u); - free(vf->priv->bitmap.v); - free(vf->priv->bitmap.a); - free(vf->priv->bitmap.oa); - if (vf->priv->stream_fd >= 0) - close(vf->priv->stream_fd); - free(vf->priv); - } -} - -static int -_read_cmd(int fd, char *cmd, char *args) { - int done=FALSE, pos=0; - char tmp; - - while(!done) { - if(! read( fd, &tmp, 1 ) ) return FALSE; - if( (tmp>='A' && tmp<='Z') || (tmp>='0' && tmp<='9') ) - cmd[pos]=tmp; - else if(tmp == ' ') { - cmd[pos]='\0'; - done=TRUE; - } - else if(tmp == '\n') { - cmd[pos]='\0'; - args[0]='\0'; - return TRUE; - } - if(pos++>20) { - cmd[0]='\0'; - return TRUE; - } - } - done=FALSE; pos=0; - while(!done) { - if(! read( fd, &tmp, 1 ) ) return FALSE; - if( (tmp >= ' ') && (pos<100) ) args[pos]=tmp; - else { - args[pos]='\0'; - done=TRUE; - } - pos++; - } - return TRUE; -} - - -static int -put_image(struct vf_instance *vf, mp_image_t* mpi, double pts){ - int buf_x=0, buf_y=0, buf_pos=0; - int have, got, want; - int xpos=0, ypos=0, pos=0; - unsigned char red=0, green=0, blue=0; - mp_image_t* dmpi; - - dmpi = vf_get_image(vf->next, mpi->imgfmt, MP_IMGTYPE_TEMP, - MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_PREFER_ALIGNED_STRIDE, - mpi->w, mpi->h); - - memcpy_pic( dmpi->planes[0], mpi->planes[0], mpi->width, mpi->height, dmpi->stride[0], mpi->stride[0] ); - memcpy_pic( dmpi->planes[1], mpi->planes[1], mpi->chroma_width, mpi->chroma_height, dmpi->stride[1], mpi->stride[1] ); - memcpy_pic( dmpi->planes[2], mpi->planes[2], mpi->chroma_width, mpi->chroma_height, dmpi->stride[2], mpi->stride[2] ); - - if(vf->priv->stream_fd >= 0) { - struct timeval tv; - int ready; - - FD_SET( vf->priv->stream_fd, &vf->priv->stream_fdset ); - tv.tv_sec=0; tv.tv_usec=0; - - ready = select( vf->priv->stream_fd+1, &vf->priv->stream_fdset, NULL, NULL, &tv ); - if(ready > 0) { - // We've got new data from the FIFO - - char cmd[20], args[100]; - int imgw,imgh,imgx,imgy,clear,imgalpha,pxsz=1,command; - unsigned char *buffer = NULL; - - if(! _read_cmd( vf->priv->stream_fd, cmd, args) ) { - mp_msg(MSGT_VFILTER, MSGL_ERR, "\nvf_bmovl: Error reading commands: %s\n\n", strerror(errno)); - return FALSE; - } - mp_msg(MSGT_VFILTER, MSGL_DBG2, "\nDEBUG: Got: %s+%s\n", cmd, args); - - command=NONE; - if ( strncmp(cmd,"RGBA32",6)==0 ) { pxsz=4; command = IMG_RGBA32; } - else if( strncmp(cmd,"ABGR32",6)==0 ) { pxsz=4; command = IMG_ABGR32; } - else if( strncmp(cmd,"RGB24" ,5)==0 ) { pxsz=3; command = IMG_RGB24; } - else if( strncmp(cmd,"BGR24" ,5)==0 ) { pxsz=3; command = IMG_BGR24; } - else if( strncmp(cmd,"CLEAR" ,5)==0 ) { pxsz=1; command = CMD_CLEAR; } - else if( strncmp(cmd,"ALPHA" ,5)==0 ) { pxsz=1; command = CMD_ALPHA; } - else if( strncmp(cmd,"OPAQUE",6)==0 ) vf->priv->opaque=TRUE; - else if( strncmp(cmd,"SHOW", 4)==0 ) vf->priv->hidden=FALSE; - else if( strncmp(cmd,"HIDE", 4)==0 ) vf->priv->hidden=TRUE; - else if( strncmp(cmd,"FLUSH" ,5)==0 ) return vf_next_put_image(vf, dmpi, pts); - else { - mp_msg(MSGT_VFILTER, MSGL_WARN, "\nvf_bmovl: Unknown command: '%s'. Ignoring.\n", cmd); - return vf_next_put_image(vf, dmpi, pts); - } - - if(command == CMD_ALPHA) { - sscanf( args, "%d %d %d %d %d", &imgw, &imgh, &imgx, &imgy, &imgalpha); - mp_msg(MSGT_VFILTER, MSGL_DBG2, "\nDEBUG: ALPHA: %d %d %d %d %d\n\n", - imgw, imgh, imgx, imgy, imgalpha); - if(imgw==0 && imgh==0) vf->priv->opaque=FALSE; - } - - if(command & IS_RAWIMG) { - sscanf( args, "%d %d %d %d %d %d", - &imgw, &imgh, &imgx, &imgy, &imgalpha, &clear); - mp_msg(MSGT_VFILTER, MSGL_DBG2, "\nDEBUG: RAWIMG: %d %d %d %d %d %d\n\n", - imgw, imgh, imgx, imgy, imgalpha, clear); - - buffer = malloc(imgw*imgh*pxsz); - if(!buffer) { - mp_msg(MSGT_VFILTER, MSGL_WARN, "\nvf_bmovl: Couldn't allocate temporary buffer! Skipping...\n\n"); - return vf_next_put_image(vf, dmpi, pts); - } - /* pipes/sockets might need multiple calls to read(): */ - want = (imgw*imgh*pxsz); - have = 0; - while (have < want) { - got = read( vf->priv->stream_fd, buffer+have, want-have ); - if (got == 0) { - mp_msg(MSGT_VFILTER, MSGL_WARN, "\nvf_bmovl: premature EOF...\n\n"); - break; - } - if (got < 0) { - mp_msg(MSGT_VFILTER, MSGL_WARN, "\nvf_bmovl: read error: %s\n\n", strerror(errno)); - break; - } - have += got; - } - mp_msg(MSGT_VFILTER, MSGL_DBG2, "Got %d bytes... (wanted %d)\n", have, want ); - - if(clear) { - memset( vf->priv->bitmap.y, 0, vf->priv->w*vf->priv->h ); - memset( vf->priv->bitmap.u, 128, vf->priv->w*vf->priv->h/4 ); - memset( vf->priv->bitmap.v, 128, vf->priv->w*vf->priv->h/4 ); - memset( vf->priv->bitmap.a, 0, vf->priv->w*vf->priv->h ); - memset( vf->priv->bitmap.oa, 0, vf->priv->w*vf->priv->h ); - vf->priv->x1 = dmpi->width; - vf->priv->y1 = dmpi->height; - vf->priv->x2 = vf->priv->y2 = 0; - } - // Define how much of our bitmap that contains graphics! - vf->priv->x1 = av_clip(imgx, 0, vf->priv->x1); - vf->priv->y1 = av_clip(imgy, 0, vf->priv->y1); - vf->priv->x2 = av_clip(imgx + imgw, vf->priv->x2, vf->priv->w); - vf->priv->y2 = av_clip(imgy + imgh, vf->priv->y2, vf->priv->h); - } - - if( command == CMD_CLEAR ) { - sscanf( args, "%d %d %d %d", &imgw, &imgh, &imgx, &imgy); - mp_msg(MSGT_VFILTER, MSGL_DBG2, "\nDEBUG: CLEAR: %d %d %d %d\n\n", imgw, imgh, imgx, imgy); - - for( ypos=imgy ; (ypos < (imgy+imgh)) && (ypos < vf->priv->y2) ; ypos++ ) { - memset( vf->priv->bitmap.y + (ypos*vf->priv->w) + imgx, 0, imgw ); - memset( vf->priv->bitmap.a + (ypos*vf->priv->w) + imgx, 0, imgw ); - memset( vf->priv->bitmap.oa + (ypos*vf->priv->w) + imgx, 0, imgw ); - if(ypos%2) { - memset( vf->priv->bitmap.u + ((ypos/2)*dmpi->stride[1]) + (imgx/2), 128, imgw/2 ); - memset( vf->priv->bitmap.v + ((ypos/2)*dmpi->stride[2]) + (imgx/2), 128, imgw/2 ); - } - } // Recalculate area that contains graphics - if( (imgx <= vf->priv->x1) && ( (imgw+imgx) >= vf->priv->x2) ) { - if( (imgy <= vf->priv->y1) && ( (imgy+imgh) >= vf->priv->y1) ) - vf->priv->y1 = imgy+imgh; - if( (imgy <= vf->priv->y2) && ( (imgy+imgh) >= vf->priv->y2) ) - vf->priv->y2 = imgy; - } - if( (imgy <= vf->priv->y1) && ( (imgy+imgh) >= vf->priv->y2) ) { - if( (imgx <= vf->priv->x1) && ( (imgx+imgw) >= vf->priv->x1) ) - vf->priv->x1 = imgx+imgw; - if( (imgx <= vf->priv->x2) && ( (imgx+imgw) >= vf->priv->x2) ) - vf->priv->x2 = imgx; - } - return vf_next_put_image(vf, dmpi, pts); - } - - for( buf_y=0 ; (buf_y < imgh) && (buf_y < (vf->priv->h-imgy)) ; buf_y++ ) { - for( buf_x=0 ; (buf_x < (imgw*pxsz)) && (buf_x < ((vf->priv->w+imgx)*pxsz)) ; buf_x += pxsz ) { - int alpha = 0xff; - - if(command & IS_RAWIMG) buf_pos = (buf_y * imgw * pxsz) + buf_x; - pos = ((buf_y+imgy) * vf->priv->w) + ((buf_x/pxsz)+imgx); - - switch(command) { - case IMG_RGBA32: - red = buffer[buf_pos+0]; - green = buffer[buf_pos+1]; - blue = buffer[buf_pos+2]; - alpha = buffer[buf_pos+3]; - break; - case IMG_ABGR32: - alpha = buffer[buf_pos+0]; - blue = buffer[buf_pos+1]; - green = buffer[buf_pos+2]; - red = buffer[buf_pos+3]; - break; - case IMG_RGB24: - red = buffer[buf_pos+0]; - green = buffer[buf_pos+1]; - blue = buffer[buf_pos+2]; - break; - case IMG_BGR24: - blue = buffer[buf_pos+0]; - green = buffer[buf_pos+1]; - red = buffer[buf_pos+2]; - break; - case CMD_ALPHA: - vf->priv->bitmap.a[pos] = INRANGE((vf->priv->bitmap.oa[pos]+imgalpha),0,255); - break; - default: - mp_msg(MSGT_VFILTER, MSGL_ERR, "vf_bmovl: Internal error!\n"); - return FALSE; - } - if( command & IS_RAWIMG ) { - vf->priv->bitmap.y[pos] = rgb2y(red,green,blue); - vf->priv->bitmap.oa[pos] = alpha; - vf->priv->bitmap.a[pos] = INRANGE((alpha+imgalpha),0,255); - if((buf_y%2) && ((buf_x/pxsz)%2)) { - pos = ( ((buf_y+imgy)/2) * dmpi->stride[1] ) + (((buf_x/pxsz)+imgx)/2); - vf->priv->bitmap.u[pos] = rgb2u(red,green,blue); - vf->priv->bitmap.v[pos] = rgb2v(red,green,blue); - } - } - } // for buf_x - } // for buf_y - free (buffer); - } else if(ready < 0) { - mp_msg(MSGT_VFILTER, MSGL_WARN, "\nvf_bmovl: Error %d in fifo: %s\n\n", errno, strerror(errno)); - } - } - - if(vf->priv->hidden) return vf_next_put_image(vf, dmpi, pts); - - if(vf->priv->opaque) { // Just copy buffer memory to screen - for( ypos=vf->priv->y1 ; ypos < vf->priv->y2 ; ypos++ ) { - fast_memcpy( dmpi->planes[0] + (ypos*dmpi->stride[0]) + vf->priv->x1, - vf->priv->bitmap.y + (ypos*vf->priv->w) + vf->priv->x1, - vf->priv->x2 - vf->priv->x1 ); - if(ypos%2) { - fast_memcpy( dmpi->planes[1] + ((ypos/2)*dmpi->stride[1]) + (vf->priv->x1/2), - vf->priv->bitmap.u + (((ypos/2)*(vf->priv->w)/2)) + (vf->priv->x1/2), - (vf->priv->x2 - vf->priv->x1)/2 ); - fast_memcpy( dmpi->planes[2] + ((ypos/2)*dmpi->stride[2]) + (vf->priv->x1/2), - vf->priv->bitmap.v + (((ypos/2)*(vf->priv->w)/2)) + (vf->priv->x1/2), - (vf->priv->x2 - vf->priv->x1)/2 ); - } - } - } else { // Blit the bitmap to the videoscreen, pixel for pixel - for( ypos=vf->priv->y1 ; ypos < vf->priv->y2 ; ypos++ ) { - for ( xpos=vf->priv->x1 ; xpos < vf->priv->x2 ; xpos++ ) { - pos = (ypos * dmpi->stride[0]) + xpos; - - int alpha = vf->priv->bitmap.a[pos]; - - if (alpha == 0) continue; // Completly transparent pixel - - if (alpha == 255) { // Opaque pixel - dmpi->planes[0][pos] = vf->priv->bitmap.y[pos]; - if ((ypos%2) && (xpos%2)) { - pos = ( (ypos/2) * dmpi->stride[1] ) + (xpos/2); - dmpi->planes[1][pos] = vf->priv->bitmap.u[pos]; - dmpi->planes[2][pos] = vf->priv->bitmap.v[pos]; - } - } else { // Alphablended pixel - dmpi->planes[0][pos] = - ((255 - alpha) * (int)dmpi->planes[0][pos] + - alpha * (int)vf->priv->bitmap.y[pos]) >> 8; - - if ((ypos%2) && (xpos%2)) { - pos = ( (ypos/2) * dmpi->stride[1] ) + (xpos/2); - - dmpi->planes[1][pos] = - ((255 - alpha) * (int)dmpi->planes[1][pos] + - alpha * (int)vf->priv->bitmap.u[pos]) >> 8; - - dmpi->planes[2][pos] = - ((255 - alpha) * (int)dmpi->planes[2][pos] + - alpha * (int)vf->priv->bitmap.v[pos]) >> 8; - } - } - } // for xpos - } // for ypos - } // if !opaque - return vf_next_put_image(vf, dmpi, pts); -} // put_image - -static int -vf_open(vf_instance_t *vf, char *args) -{ - char filename[1000]; - - vf->config = config; - vf->put_image = put_image; - vf->query_format = query_format; - vf->uninit = uninit; - - vf->priv = malloc(sizeof(struct vf_priv_s)); - - if(!args || sscanf(args, "%d:%d:%s", &vf->priv->hidden, &vf->priv->opaque, filename) < 3 ) { - mp_msg(MSGT_VFILTER, MSGL_ERR, "vf_bmovl: Bad arguments!\n"); - mp_msg(MSGT_VFILTER, MSGL_ERR, "vf_bmovl: Arguments are 'bool hidden:bool opaque:string fifo'\n"); - return FALSE; - } - - vf->priv->stream_fd = open(filename, O_RDWR); - if(vf->priv->stream_fd >= 0) { - FD_ZERO( &vf->priv->stream_fdset ); - mp_msg(MSGT_VFILTER, MSGL_INFO, "vf_bmovl: Opened fifo %s as FD %d\n", filename, vf->priv->stream_fd); - } else { - mp_msg(MSGT_VFILTER, MSGL_WARN, "vf_bmovl: Error! Couldn't open FIFO %s: %s\n", filename, strerror(errno)); - vf->priv->stream_fd = -1; - } - - return TRUE; -} - -const vf_info_t vf_info_bmovl = { - "Read bitmaps from a FIFO and display them in window", - "bmovl", - "Per Wigren", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_boxblur.c b/libmpcodecs/vf_boxblur.c deleted file mode 100644 index cc15efccf4..0000000000 --- a/libmpcodecs/vf_boxblur.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <assert.h> - -#include "mp_msg.h" -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - - -//===========================================================================// - -typedef struct FilterParam{ - int radius; - int power; -}FilterParam; - -struct vf_priv_s { - FilterParam lumaParam; - FilterParam chromaParam; -}; - - -/***************************************************************************/ - - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static inline void blur(uint8_t *dst, uint8_t *src, int w, int radius, int dstStep, int srcStep){ - int x; - const int length= radius*2 + 1; - const int inv= ((1<<16) + length/2)/length; - - int sum= 0; - - for(x=0; x<radius; x++){ - sum+= src[x*srcStep]<<1; - } - sum+= src[radius*srcStep]; - - for(x=0; x<=radius; x++){ - sum+= src[(radius+x)*srcStep] - src[(radius-x)*srcStep]; - dst[x*dstStep]= (sum*inv + (1<<15))>>16; - } - - for(; x<w-radius; x++){ - sum+= src[(radius+x)*srcStep] - src[(x-radius-1)*srcStep]; - dst[x*dstStep]= (sum*inv + (1<<15))>>16; - } - - for(; x<w; x++){ - sum+= src[(2*w-radius-x-1)*srcStep] - src[(x-radius-1)*srcStep]; - dst[x*dstStep]= (sum*inv + (1<<15))>>16; - } -} - -static inline void blur2(uint8_t *dst, uint8_t *src, int w, int radius, int power, int dstStep, int srcStep){ - uint8_t temp[2][4096]; - uint8_t *a= temp[0], *b=temp[1]; - - if(radius){ - blur(a, src, w, radius, 1, srcStep); - for(; power>2; power--){ - uint8_t *c; - blur(b, a, w, radius, 1, 1); - c=a; a=b; b=c; - } - if(power>1) - blur(dst, a, w, radius, dstStep, 1); - else{ - int i; - for(i=0; i<w; i++) - dst[i*dstStep]= a[i]; - } - }else{ - int i; - for(i=0; i<w; i++) - dst[i*dstStep]= src[i*srcStep]; - } -} - -static void hBlur(uint8_t *dst, uint8_t *src, int w, int h, int dstStride, int srcStride, int radius, int power){ - int y; - - if(radius==0 && dst==src) return; - - for(y=0; y<h; y++){ - blur2(dst + y*dstStride, src + y*srcStride, w, radius, power, 1, 1); - } -} - -//FIXME optimize (x before y !!!) -static void vBlur(uint8_t *dst, uint8_t *src, int w, int h, int dstStride, int srcStride, int radius, int power){ - int x; - - if(radius==0 && dst==src) return; - - for(x=0; x<w; x++){ - blur2(dst + x, src + x, h, radius, power, dstStride, srcStride); - } -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - int cw= mpi->w >> mpi->chroma_x_shift; - int ch= mpi->h >> mpi->chroma_y_shift; - - mp_image_t *dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE | MP_IMGFLAG_READABLE, - mpi->w,mpi->h); - - assert(mpi->flags&MP_IMGFLAG_PLANAR); - - hBlur(dmpi->planes[0], mpi->planes[0], mpi->w,mpi->h, - dmpi->stride[0], mpi->stride[0], vf->priv->lumaParam.radius, vf->priv->lumaParam.power); - hBlur(dmpi->planes[1], mpi->planes[1], cw,ch, - dmpi->stride[1], mpi->stride[1], vf->priv->chromaParam.radius, vf->priv->chromaParam.power); - hBlur(dmpi->planes[2], mpi->planes[2], cw,ch, - dmpi->stride[2], mpi->stride[2], vf->priv->chromaParam.radius, vf->priv->chromaParam.power); - - vBlur(dmpi->planes[0], dmpi->planes[0], mpi->w,mpi->h, - dmpi->stride[0], dmpi->stride[0], vf->priv->lumaParam.radius, vf->priv->lumaParam.power); - vBlur(dmpi->planes[1], dmpi->planes[1], cw,ch, - dmpi->stride[1], dmpi->stride[1], vf->priv->chromaParam.radius, vf->priv->chromaParam.power); - vBlur(dmpi->planes[2], dmpi->planes[2], cw,ch, - dmpi->stride[2], dmpi->stride[2], vf->priv->chromaParam.radius, vf->priv->chromaParam.power); - - return vf_next_put_image(vf,dmpi, pts); -} - -//===========================================================================// - -static int query_format(struct vf_instance *vf, unsigned int fmt){ - switch(fmt) - { - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_YVU9: - case IMGFMT_444P: - case IMGFMT_422P: - case IMGFMT_411P: - return vf_next_query_format(vf, fmt); - } - return 0; -} - -static int vf_open(vf_instance_t *vf, char *args){ - int e; - - vf->config=config; - vf->put_image=put_image; -// vf->get_image=get_image; - vf->query_format=query_format; - vf->priv=malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - - if(args==NULL) return 0; - - e=sscanf(args, "%d:%d:%d:%d", - &vf->priv->lumaParam.radius, - &vf->priv->lumaParam.power, - &vf->priv->chromaParam.radius, - &vf->priv->chromaParam.power - ); - - if(e==2){ - vf->priv->chromaParam.radius= vf->priv->lumaParam.radius; - vf->priv->chromaParam.power = vf->priv->lumaParam.power; - }else if(e!=4) - return 0; - - if(vf->priv->lumaParam.radius < 0) return 0; - if(vf->priv->chromaParam.radius < 0) return 0; - - return 1; -} - -const vf_info_t vf_info_boxblur = { - "box blur", - "boxblur", - "Michael Niedermayer", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_cropdetect.c b/libmpcodecs/vf_cropdetect.c deleted file mode 100644 index 2401db19d4..0000000000 --- a/libmpcodecs/vf_cropdetect.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -struct vf_priv_s { - int x1,y1,x2,y2; - int limit; - int round; - int reset_count; - int fno; -}; - -static int checkline(unsigned char* src,int stride,int len,int bpp){ - int total=0; - int div=len; - switch(bpp){ - case 1: - while(--len>=0){ - total+=src[0]; src+=stride; - } - break; - case 3: - case 4: - while(--len>=0){ - total+=src[0]+src[1]+src[2]; src+=stride; - } - div*=3; - break; - } - total/=div; -// printf("total=%d\n",total); - return total; -} - -//===========================================================================// - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - vf->priv->x1=width - 1; - vf->priv->y1=height - 1; - vf->priv->x2=0; - vf->priv->y2=0; - vf->priv->fno=-2; - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - int bpp=mpi->bpp/8; - int w,h,x,y,shrink_by; - - // hope we'll get DR buffer: - dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_EXPORT, 0, - mpi->w, mpi->h); - - dmpi->planes[0]=mpi->planes[0]; - dmpi->planes[1]=mpi->planes[1]; - dmpi->planes[2]=mpi->planes[2]; - dmpi->stride[0]=mpi->stride[0]; - dmpi->stride[1]=mpi->stride[1]; - dmpi->stride[2]=mpi->stride[2]; - dmpi->width=mpi->width; - dmpi->height=mpi->height; - -if(++vf->priv->fno>0){ // ignore first 2 frames - they may be empty - - // Reset the crop area every reset_count frames, if reset_count is > 0 - if(vf->priv->reset_count > 0 && vf->priv->fno > vf->priv->reset_count){ - vf->priv->x1=mpi->w-1; - vf->priv->y1=mpi->h-1; - vf->priv->x2=0; - vf->priv->y2=0; - vf->priv->fno=1; - } - - for(y=0;y<vf->priv->y1;y++){ - if(checkline(mpi->planes[0]+mpi->stride[0]*y,bpp,mpi->w,bpp)>vf->priv->limit){ - vf->priv->y1=y; - break; - } - } - - for(y=mpi->h-1;y>vf->priv->y2;y--){ - if(checkline(mpi->planes[0]+mpi->stride[0]*y,bpp,mpi->w,bpp)>vf->priv->limit){ - vf->priv->y2=y; - break; - } - } - - for(y=0;y<vf->priv->x1;y++){ - if(checkline(mpi->planes[0]+bpp*y,mpi->stride[0],mpi->h,bpp)>vf->priv->limit){ - vf->priv->x1=y; - break; - } - } - - for(y=mpi->w-1;y>vf->priv->x2;y--){ - if(checkline(mpi->planes[0]+bpp*y,mpi->stride[0],mpi->h,bpp)>vf->priv->limit){ - vf->priv->x2=y; - break; - } - } - - // round x and y (up), important for yuv colorspaces - // make sure they stay rounded! - x=(vf->priv->x1+1)&(~1); - y=(vf->priv->y1+1)&(~1); - - w = vf->priv->x2 - x + 1; - h = vf->priv->y2 - y + 1; - - // w and h must be divisible by 2 as well because of yuv - // colorspace problems. - if (vf->priv->round <= 1) - vf->priv->round = 16; - if (vf->priv->round % 2) - vf->priv->round *= 2; - - shrink_by = w % vf->priv->round; - w -= shrink_by; - x += (shrink_by / 2 + 1) & ~1; - - shrink_by = h % vf->priv->round; - h -= shrink_by; - y += (shrink_by / 2 + 1) & ~1; - - mp_tmsg(MSGT_VFILTER, MSGL_INFO, "[CROP] Crop area: X: %d..%d Y: %d..%d (-vf crop=%d:%d:%d:%d).\n", - vf->priv->x1,vf->priv->x2, - vf->priv->y1,vf->priv->y2, - w,h,x,y); - - -} - - return vf_next_put_image(vf,dmpi, pts); -} - -static int query_format(struct vf_instance *vf, unsigned int fmt) { - switch(fmt) { - // the default limit value works only right with YV12 right now. - case IMGFMT_YV12: - return vf_next_query_format(vf, fmt); - } - return 0; -} -//===========================================================================// - -static int vf_open(vf_instance_t *vf, char *args){ - vf->config=config; - vf->put_image=put_image; - vf->query_format=query_format; - vf->priv=malloc(sizeof(struct vf_priv_s)); - vf->priv->limit=24; // should be option - vf->priv->round = 0; - vf->priv->reset_count = 0; - if(args) sscanf(args, "%d:%d:%d", - &vf->priv->limit, - &vf->priv->round, - &vf->priv->reset_count); - return 1; -} - -const vf_info_t vf_info_cropdetect = { - "autodetect crop size", - "cropdetect", - "A'rpi", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_decimate.c b/libmpcodecs/vf_decimate.c deleted file mode 100644 index 4ee78b420b..0000000000 --- a/libmpcodecs/vf_decimate.c +++ /dev/null @@ -1,198 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "config.h" -#include "mp_msg.h" -#include "cpudetect.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -#include "libvo/fastmemcpy.h" - - -struct vf_priv_s { - int hi, lo; - float frac; - int max, last, cnt; -}; - -#if HAVE_MMX && HAVE_EBX_AVAILABLE -static int diff_MMX(unsigned char *old, unsigned char *new, int os, int ns) -{ - volatile short out[4]; - __asm__ ( - "movl $8, %%ecx \n\t" - "pxor %%mm4, %%mm4 \n\t" - "pxor %%mm7, %%mm7 \n\t" - - ASMALIGN(4) - "1: \n\t" - - "movq (%%"REG_S"), %%mm0 \n\t" - "movq (%%"REG_S"), %%mm2 \n\t" - "add %%"REG_a", %%"REG_S" \n\t" - "movq (%%"REG_D"), %%mm1 \n\t" - "add %%"REG_b", %%"REG_D" \n\t" - "psubusb %%mm1, %%mm2 \n\t" - "psubusb %%mm0, %%mm1 \n\t" - "movq %%mm2, %%mm0 \n\t" - "movq %%mm1, %%mm3 \n\t" - "punpcklbw %%mm7, %%mm0 \n\t" - "punpcklbw %%mm7, %%mm1 \n\t" - "punpckhbw %%mm7, %%mm2 \n\t" - "punpckhbw %%mm7, %%mm3 \n\t" - "paddw %%mm0, %%mm4 \n\t" - "paddw %%mm1, %%mm4 \n\t" - "paddw %%mm2, %%mm4 \n\t" - "paddw %%mm3, %%mm4 \n\t" - - "decl %%ecx \n\t" - "jnz 1b \n\t" - "movq %%mm4, (%%"REG_d") \n\t" - "emms \n\t" - : - : "S" (old), "D" (new), "a" ((long)os), "b" ((long)ns), "d" (out) - : "%ecx", "memory" - ); - return out[0]+out[1]+out[2]+out[3]; -} -#endif - -static int diff_C(unsigned char *old, unsigned char *new, int os, int ns) -{ - int x, y, d=0; - for (y = 8; y; y--) { - for (x = 8; x; x--) { - d += abs(new[x] - old[x]); - } - new += ns; - old += os; - } - return d; -} - -static int (*diff)(unsigned char *, unsigned char *, int, int); - -static int diff_to_drop_plane(int hi, int lo, float frac, unsigned char *old, unsigned char *new, int w, int h, int os, int ns) -{ - int x, y; - int d, c=0; - int t = (w/16)*(h/16)*frac; - for (y = 0; y < h-7; y += 4) { - for (x = 8; x < w-7; x += 4) { - d = diff(old+x+y*os, new+x+y*ns, os, ns); - if (d > hi) return 0; - if (d > lo) { - c++; - if (c > t) return 0; - } - } - } - return 1; -} - -static int diff_to_drop(int hi, int lo, float frac, mp_image_t *old, mp_image_t *new) -{ - if (new->flags & MP_IMGFLAG_PLANAR) { - return diff_to_drop_plane(hi,lo,frac, old->planes[0], new->planes[0], - new->w, new->h, old->stride[0], new->stride[0]) - && diff_to_drop_plane(hi,lo,frac, old->planes[1], new->planes[1], - new->chroma_width, new->chroma_height, - old->stride[1], new->stride[1]) - && diff_to_drop_plane(hi,lo,frac, old->planes[2], new->planes[2], - new->chroma_width, new->chroma_height, - old->stride[2], new->stride[2]); - } - return diff_to_drop_plane(hi,lo,frac, old->planes[0], new->planes[0], - new->w*(new->bpp/8), new->h, old->stride[0], new->stride[0]); -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - mp_image_t *dmpi; - - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE | - MP_IMGFLAG_PRESERVE | MP_IMGFLAG_READABLE, - mpi->width, mpi->height); - dmpi->qscale = mpi->qscale; - dmpi->qstride = mpi->qstride; - dmpi->qscale_type = mpi->qscale_type; - - if (diff_to_drop(vf->priv->hi, vf->priv->lo, vf->priv->frac, dmpi, mpi)) { - if (vf->priv->max == 0) - return 0; - else if ((vf->priv->max > 0) && (vf->priv->cnt++ < vf->priv->max)) - return 0; - else if ((vf->priv->max < 0) && (vf->priv->last+1 >= -vf->priv->max)) - return vf->priv->last=0; - } - vf->priv->last++; - vf->priv->cnt=0; - - memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h, - dmpi->stride[0], mpi->stride[0]); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - memcpy_pic(dmpi->planes[1], mpi->planes[1], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[1], mpi->stride[1]); - memcpy_pic(dmpi->planes[2], mpi->planes[2], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[2], mpi->stride[2]); - } - return vf_next_put_image(vf, dmpi, pts); -} - -static void uninit(struct vf_instance *vf) -{ - free(vf->priv); -} - -static int vf_open(vf_instance_t *vf, char *args) -{ - struct vf_priv_s *p; - vf->put_image = put_image; - vf->uninit = uninit; - vf->default_reqs = VFCAP_ACCEPT_STRIDE; - vf->priv = p = calloc(1, sizeof(struct vf_priv_s)); - p->max = 0; - p->hi = 64*12; - p->lo = 64*5; - p->frac = 0.33; - if (args) sscanf(args, "%d:%d:%d:%f", &p->max, &p->hi, &p->lo, &p->frac); - diff = diff_C; -#if HAVE_MMX && HAVE_EBX_AVAILABLE - if(gCpuCaps.hasMMX) diff = diff_MMX; -#endif - return 1; -} - -const vf_info_t vf_info_decimate = { - "near-duplicate frame remover", - "decimate", - "Rich Felker", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_denoise3d.c b/libmpcodecs/vf_denoise3d.c deleted file mode 100644 index 4d1f16c8b7..0000000000 --- a/libmpcodecs/vf_denoise3d.c +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (C) 2003 Daniel Moreno <comac@comac.darktech.org> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <math.h> - -#include "mp_msg.h" -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -#define PARAM1_DEFAULT 4.0 -#define PARAM2_DEFAULT 3.0 -#define PARAM3_DEFAULT 6.0 - -//===========================================================================// - -struct vf_priv_s { - int Coefs[4][512]; - unsigned char *Line; - mp_image_t *pmpi; -}; - - -/***************************************************************************/ - - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - - free(vf->priv->Line); - vf->priv->Line = malloc(width); - vf->priv->pmpi=NULL; -// vf->default_caps &= !VFCAP_ACCEPT_STRIDE; - - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - - -static void uninit(struct vf_instance *vf) -{ - free(vf->priv->Line); -} - -#define LowPass(Prev, Curr, Coef) (Curr + Coef[Prev - Curr]) - -static void deNoise(unsigned char *Frame, // mpi->planes[x] - unsigned char *FramePrev, // pmpi->planes[x] - unsigned char *FrameDest, // dmpi->planes[x] - unsigned char *LineAnt, // vf->priv->Line (width bytes) - int W, int H, int sStride, int pStride, int dStride, - int *Horizontal, int *Vertical, int *Temporal) -{ - int X, Y; - int sLineOffs = 0, pLineOffs = 0, dLineOffs = 0; - unsigned char PixelAnt; - - /* First pixel has no left nor top neighbor. Only previous frame */ - LineAnt[0] = PixelAnt = Frame[0]; - FrameDest[0] = LowPass(FramePrev[0], LineAnt[0], Temporal); - - /* Fist line has no top neighbor. Only left one for each pixel and - * last frame */ - for (X = 1; X < W; X++) - { - PixelAnt = LowPass(PixelAnt, Frame[X], Horizontal); - LineAnt[X] = PixelAnt; - FrameDest[X] = LowPass(FramePrev[X], LineAnt[X], Temporal); - } - - for (Y = 1; Y < H; Y++) - { - sLineOffs += sStride, pLineOffs += pStride, dLineOffs += dStride; - /* First pixel on each line doesn't have previous pixel */ - PixelAnt = Frame[sLineOffs]; - LineAnt[0] = LowPass(LineAnt[0], PixelAnt, Vertical); - FrameDest[dLineOffs] = LowPass(FramePrev[pLineOffs], LineAnt[0], Temporal); - - for (X = 1; X < W; X++) - { - /* The rest are normal */ - PixelAnt = LowPass(PixelAnt, Frame[sLineOffs+X], Horizontal); - LineAnt[X] = LowPass(LineAnt[X], PixelAnt, Vertical); - FrameDest[dLineOffs+X] = LowPass(FramePrev[pLineOffs+X], LineAnt[X], Temporal); - } - } -} - - - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - int cw= mpi->w >> mpi->chroma_x_shift; - int ch= mpi->h >> mpi->chroma_y_shift; - int W = mpi->w, H = mpi->h; - - mp_image_t *dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_IP, MP_IMGFLAG_ACCEPT_STRIDE | - MP_IMGFLAG_PRESERVE | MP_IMGFLAG_READABLE, - mpi->w,mpi->h); - - if(!dmpi) return 0; - if (!vf->priv->pmpi) vf->priv->pmpi=mpi; - - deNoise(mpi->planes[0], vf->priv->pmpi->planes[0], dmpi->planes[0], - vf->priv->Line, W, H, - mpi->stride[0], vf->priv->pmpi->stride[0], dmpi->stride[0], - vf->priv->Coefs[0] + 256, - vf->priv->Coefs[0] + 256, - vf->priv->Coefs[1] + 256); - deNoise(mpi->planes[1], vf->priv->pmpi->planes[1], dmpi->planes[1], - vf->priv->Line, cw, ch, - mpi->stride[1], vf->priv->pmpi->stride[1], dmpi->stride[1], - vf->priv->Coefs[2] + 256, - vf->priv->Coefs[2] + 256, - vf->priv->Coefs[3] + 256); - deNoise(mpi->planes[2], vf->priv->pmpi->planes[2], dmpi->planes[2], - vf->priv->Line, cw, ch, - mpi->stride[2], vf->priv->pmpi->stride[2], dmpi->stride[2], - vf->priv->Coefs[2] + 256, - vf->priv->Coefs[2] + 256, - vf->priv->Coefs[3] + 256); - - vf->priv->pmpi=dmpi; // save reference image - return vf_next_put_image(vf,dmpi, pts); -} - -//===========================================================================// - -static int query_format(struct vf_instance *vf, unsigned int fmt){ - switch(fmt) - { - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_YVU9: - case IMGFMT_444P: - case IMGFMT_422P: - case IMGFMT_411P: - return vf_next_query_format(vf, fmt); - } - return 0; -} - - -#define ABS(A) ( (A) > 0 ? (A) : -(A) ) - -static void PrecalcCoefs(int *Ct, double Dist25) -{ - int i; - double Gamma, Simil, C; - - Gamma = log(0.25) / log(1.0 - Dist25/255.0); - - for (i = -256; i <= 255; i++) - { - Simil = 1.0 - ABS(i) / 255.0; -// Ct[256+i] = lround(pow(Simil, Gamma) * (double)i); - C = pow(Simil, Gamma) * (double)i; - Ct[256+i] = (C<0) ? (C-0.5) : (C+0.5); - } -} - - -static int vf_open(vf_instance_t *vf, char *args){ - double LumSpac, LumTmp, ChromSpac, ChromTmp; - double Param1, Param2, Param3; - - vf->config=config; - vf->put_image=put_image; - vf->query_format=query_format; - vf->uninit=uninit; - vf->priv=malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - - if (args) - { - switch(sscanf(args, "%lf:%lf:%lf", - &Param1, &Param2, &Param3 - )) - { - case 0: - LumSpac = PARAM1_DEFAULT; - LumTmp = PARAM3_DEFAULT; - - ChromSpac = PARAM2_DEFAULT; - ChromTmp = LumTmp * ChromSpac / LumSpac; - break; - - case 1: - LumSpac = Param1; - LumTmp = PARAM3_DEFAULT * Param1 / PARAM1_DEFAULT; - - ChromSpac = PARAM2_DEFAULT * Param1 / PARAM1_DEFAULT; - ChromTmp = LumTmp * ChromSpac / LumSpac; - break; - - case 2: - LumSpac = Param1; - LumTmp = PARAM3_DEFAULT * Param1 / PARAM1_DEFAULT; - - ChromSpac = Param2; - ChromTmp = LumTmp * ChromSpac / LumSpac; - break; - - case 3: - LumSpac = Param1; - LumTmp = Param3; - - ChromSpac = Param2; - ChromTmp = LumTmp * ChromSpac / LumSpac; - break; - - default: - LumSpac = PARAM1_DEFAULT; - LumTmp = PARAM3_DEFAULT; - - ChromSpac = PARAM2_DEFAULT; - ChromTmp = LumTmp * ChromSpac / LumSpac; - } - } - else - { - LumSpac = PARAM1_DEFAULT; - LumTmp = PARAM3_DEFAULT; - - ChromSpac = PARAM2_DEFAULT; - ChromTmp = LumTmp * ChromSpac / LumSpac; - } - - PrecalcCoefs(vf->priv->Coefs[0], LumSpac); - PrecalcCoefs(vf->priv->Coefs[1], LumTmp); - PrecalcCoefs(vf->priv->Coefs[2], ChromSpac); - PrecalcCoefs(vf->priv->Coefs[3], ChromTmp); - - return 1; -} - -const vf_info_t vf_info_denoise3d = { - "3D Denoiser (variable lowpass filter)", - "denoise3d", - "Daniel Moreno", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_detc.c b/libmpcodecs/vf_detc.c deleted file mode 100644 index bbc22fca6c..0000000000 --- a/libmpcodecs/vf_detc.c +++ /dev/null @@ -1,458 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -#include "libvo/fastmemcpy.h" - -struct metrics { - int even; - int odd; - int noise; - int temp; -}; - -struct vf_priv_s { - int frame; - int drop, lastdrop; - struct metrics pm; - int thres[5]; - int inframes, outframes; - int mode; - int (*analyze)(struct vf_priv_s *, mp_image_t *, mp_image_t *); - int needread; - struct vf_detc_pts_buf ptsbuf; -}; - -#define COMPE(a,b,e) (abs((a)-(b)) < (((a)+(b))>>(e))) -#define COMPARABLE(a,b) COMPE((a),(b),2) -#define VERYCLOSE(a,b) COMPE((a),(b),3) - -#define OUTER_TC_NBHD(s) ( \ - COMPARABLE((s)[-1].m.even,(s)[-1].m.odd) && \ - COMPARABLE((s)[1].m.even,(s)[0].m.odd) && \ - COMPARABLE((s)[2].m.even,(s)[1].m.odd) && \ - COMPARABLE((s)[-1].m.noise,(s)[0].m.temp) && \ - COMPARABLE((s)[2].m.noise,(s)[2].m.temp) ) - -#define INNER_TC_NBHD(s,l,h) ( \ - COMPARABLE((s)[0].m.even,(l)) && \ - COMPARABLE((s)[2].m.odd,(l)) && ( \ - COMPARABLE((s)[0].m.noise,(h)) || \ - COMPARABLE((s)[1].m.noise,(h)) ) ) - -enum { - TC_DROP, - TC_PROG, - TC_IL1, - TC_IL2 -}; - -static void block_diffs(struct metrics *m, unsigned char *old, unsigned char *new, int os, int ns) -{ - int x, y, even=0, odd=0, noise, temp; - unsigned char *oldp, *newp; - m->noise = m->temp = 0; - for (x = 8; x; x--) { - oldp = old++; - newp = new++; - noise = temp = 0; - for (y = 4; y; y--) { - even += abs(newp[0]-oldp[0]); - odd += abs(newp[ns]-oldp[os]); - noise += newp[ns]-newp[0]; - temp += oldp[os]-newp[0]; - oldp += os<<1; - newp += ns<<1; - } - m->noise += abs(noise); - m->temp += abs(temp); - } - m->even = even; - m->odd = odd; -} - -static void diff_planes(struct metrics *m, unsigned char *old, unsigned char *new, int w, int h, int os, int ns) -{ - int x, y, me=0, mo=0, mn=0, mt=0; - struct metrics l; - for (y = 0; y < h-7; y += 8) { - for (x = 0; x < w-7; x += 8) { - block_diffs(&l, old+x+y*os, new+x+y*ns, os, ns); - if (l.even > me) me = l.even; - if (l.odd > mo) mo = l.odd; - if (l.noise > mn) mn = l.noise; - if (l.temp > mt) mt = l.temp; - } - } - m->even = me; - m->odd = mo; - m->noise = mn; - m->temp = mt; -} - -static void diff_fields(struct metrics *metr, mp_image_t *old, mp_image_t *new) -{ - struct metrics m, mu, mv; - diff_planes(&m, old->planes[0], new->planes[0], - new->w, new->h, old->stride[0], new->stride[0]); - if (new->flags & MP_IMGFLAG_PLANAR) { - diff_planes(&mu, old->planes[1], new->planes[1], - new->chroma_width, new->chroma_height, - old->stride[1], new->stride[1]); - diff_planes(&mv, old->planes[2], new->planes[2], - new->chroma_width, new->chroma_height, - old->stride[2], new->stride[2]); - if (mu.even > m.even) m.even = mu.even; - if (mu.odd > m.odd) m.odd = mu.odd; - if (mu.noise > m.noise) m.noise = mu.noise; - if (mu.temp > m.temp) m.temp = mu.temp; - if (mv.even > m.even) m.even = mv.even; - if (mv.odd > m.odd) m.odd = mv.odd; - if (mv.noise > m.noise) m.noise = mv.noise; - if (mv.temp > m.temp) m.temp = mv.temp; - } - *metr = m; -} - -static void status(int f, struct metrics *m) -{ - mp_msg(MSGT_VFILTER, MSGL_V, "frame %d: e=%d o=%d n=%d t=%d\n", - f, m->even, m->odd, m->noise, m->temp); -} - -static int analyze_fixed_pattern(struct vf_priv_s *p, mp_image_t *new, mp_image_t *old) -{ - if (p->frame >= 0) p->frame = (p->frame+1)%5; - mp_msg(MSGT_VFILTER, MSGL_V, "frame %d\n", p->frame); - switch (p->frame) { - case -1: case 0: case 1: case 2: - return TC_PROG; - case 3: - return TC_IL1; - case 4: - return TC_IL2; - } - return 0; -} - -static int analyze_aggressive(struct vf_priv_s *p, mp_image_t *new, mp_image_t *old) -{ - struct metrics m, pm; - - if (p->frame >= 0) p->frame = (p->frame+1)%5; - - diff_fields(&m, old, new); - - status(p->frame, &m); - - pm = p->pm; - p->pm = m; - - if (p->frame == 4) { - /* We need to break at scene changes, but is this a valid test? */ - if ((m.even > p->thres[2]) && (m.odd > p->thres[2]) && (m.temp > p->thres[3]) - && (m.temp > 5*pm.temp) && (m.temp*2 > m.noise)) { - mp_msg(MSGT_VFILTER, MSGL_V, "scene change breaking telecine!\n"); - p->frame = -1; - return TC_DROP; - } - /* Thres. is to compensate for quantization errors when noise is low */ - if (m.noise - m.temp > -p->thres[4]) { - if (COMPARABLE(m.even, pm.odd)) { - //mp_msg(MSGT_VFILTER, MSGL_V, "confirmed field match!\n"); - return TC_IL2; - } else if ((m.even < p->thres[0]) && (m.odd < p->thres[0]) && VERYCLOSE(m.even, m.odd) - && VERYCLOSE(m.noise,m.temp) && VERYCLOSE(m.noise,pm.noise)) { - mp_msg(MSGT_VFILTER, MSGL_V, "interlaced frame appears in duplicate!!!\n"); - p->pm = pm; /* hack :) */ - p->frame = 3; - return TC_IL1; - } - } else { - mp_msg(MSGT_VFILTER, MSGL_V, "mismatched telecine fields!\n"); - p->frame = -1; - } - } - - if (2*m.even*m.temp < m.odd*m.noise) { - mp_msg(MSGT_VFILTER, MSGL_V, "caught telecine sync!\n"); - p->frame = 3; - return TC_IL1; - } - - if (p->frame < 3) { - if (m.noise > p->thres[3]) { - if (m.noise > 2*m.temp) { - mp_msg(MSGT_VFILTER, MSGL_V, "merging fields out of sequence!\n"); - return TC_IL2; - } - if ((m.noise > 2*pm.noise) && (m.even > p->thres[2]) && (m.odd > p->thres[2])) { - mp_msg(MSGT_VFILTER, MSGL_V, "dropping horrible interlaced frame!\n"); - return TC_DROP; - } - } - } - - switch (p->frame) { - case -1: - if (4*m.noise > 5*m.temp) { - mp_msg(MSGT_VFILTER, MSGL_V, "merging fields out of sequence!\n"); - return TC_IL2; - } - case 0: - case 1: - case 2: - return TC_PROG; - case 3: - if ((m.even > p->thres[1]) && (m.even > m.odd) && (m.temp > m.noise)) { - mp_msg(MSGT_VFILTER, MSGL_V, "lost telecine tracking!\n"); - p->frame = -1; - return TC_PROG; - } - return TC_IL1; - case 4: - return TC_IL2; - } - return 0; -} - -static void copy_image(mp_image_t *dmpi, mp_image_t *mpi, int field) -{ - switch (field) { - case 0: - my_memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h/2, - dmpi->stride[0]*2, mpi->stride[0]*2); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - my_memcpy_pic(dmpi->planes[1], mpi->planes[1], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[1]*2, mpi->stride[1]*2); - my_memcpy_pic(dmpi->planes[2], mpi->planes[2], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[2]*2, mpi->stride[2]*2); - } - break; - case 1: - my_memcpy_pic(dmpi->planes[0]+dmpi->stride[0], - mpi->planes[0]+mpi->stride[0], mpi->w, mpi->h/2, - dmpi->stride[0]*2, mpi->stride[0]*2); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - my_memcpy_pic(dmpi->planes[1]+dmpi->stride[1], - mpi->planes[1]+mpi->stride[1], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[1]*2, mpi->stride[1]*2); - my_memcpy_pic(dmpi->planes[2]+dmpi->stride[2], - mpi->planes[2]+mpi->stride[2], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[2]*2, mpi->stride[2]*2); - } - break; - case 2: - memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h, - dmpi->stride[0], mpi->stride[0]); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - memcpy_pic(dmpi->planes[1], mpi->planes[1], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[1], mpi->stride[1]); - memcpy_pic(dmpi->planes[2], mpi->planes[2], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[2], mpi->stride[2]); - } - break; - } -} - -static int do_put_image(struct vf_instance *vf, mp_image_t *dmpi, double pts) -{ - struct vf_priv_s *p = vf->priv; - int dropflag; - - switch (p->drop) { - default: - dropflag = 0; - break; - case 1: - dropflag = (++p->lastdrop >= 5); - break; - case 2: - dropflag = (++p->lastdrop >= 5) && (4*p->inframes <= 5*p->outframes); - break; - } - - if (dropflag) { - mp_msg(MSGT_VFILTER, MSGL_V, "drop! [%d/%d=%g]\n", - p->outframes, p->inframes, (float)p->outframes/p->inframes); - p->lastdrop = 0; - vf_detc_adjust_pts(&p->ptsbuf, pts, 0, 1); - return 0; - } - - p->outframes++; - return vf_next_put_image(vf, dmpi, vf_detc_adjust_pts(&p->ptsbuf, pts, 0, 0)); -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - int ret=0; - mp_image_t *dmpi; - struct vf_priv_s *p = vf->priv; - - p->inframes++; - - if (p->needread) dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE | - MP_IMGFLAG_PRESERVE | MP_IMGFLAG_READABLE, - mpi->width, mpi->height); - /* FIXME: is there a good way to get rid of static type? */ - else dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE | - MP_IMGFLAG_PRESERVE, mpi->width, mpi->height); - - switch (p->analyze(p, mpi, dmpi)) { - case TC_DROP: - /* Don't copy anything unless we'll need to read it. */ - if (p->needread) copy_image(dmpi, mpi, 2); - p->lastdrop = 0; - vf_detc_adjust_pts(&p->ptsbuf, pts, 0, 1); - break; - case TC_PROG: - /* Copy and display the whole frame. */ - copy_image(dmpi, mpi, 2); - ret = do_put_image(vf, dmpi, pts); - break; - case TC_IL1: - /* Only copy bottom field unless we need to read. */ - if (p->needread) copy_image(dmpi, mpi, 2); - else copy_image(dmpi, mpi, 1); - p->lastdrop = 0; - vf_detc_adjust_pts(&p->ptsbuf, pts, 0, 1); - break; - case TC_IL2: - /* Copy top field and show frame, then copy bottom if needed. */ - copy_image(dmpi, mpi, 0); - ret = do_put_image(vf, dmpi, pts); - if (p->needread) copy_image(dmpi, mpi, 1); - break; - } - return ret; -} - -static int query_format(struct vf_instance *vf, unsigned int fmt) -{ - /* FIXME - figure out which other formats work */ - switch (fmt) { - case IMGFMT_YV12: - case IMGFMT_IYUV: - case IMGFMT_I420: - return vf_next_query_format(vf, fmt); - } - return 0; -} - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt) -{ - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static void uninit(struct vf_instance *vf) -{ - free(vf->priv); -} - -static struct { - char *name; - int (*func)(struct vf_priv_s *p, mp_image_t *new, mp_image_t *old); - int needread; -} anal_funcs[] = { - { "fixed", analyze_fixed_pattern, 0 }, - { "aggressive", analyze_aggressive, 1 }, - { NULL, NULL, 0 } -}; - -#define STARTVARS if (0) -#define GETVAR(str, name, out, func) \ - else if (!strncmp((str), name "=", sizeof(name))) \ - (out) = (func)((str) + sizeof(name)) - -static void parse_var(struct vf_priv_s *p, char *var) -{ - STARTVARS; - GETVAR(var, "dr", p->drop, atoi); - GETVAR(var, "t0", p->thres[0], atoi); - GETVAR(var, "t1", p->thres[1], atoi); - GETVAR(var, "t2", p->thres[2], atoi); - GETVAR(var, "t3", p->thres[3], atoi); - GETVAR(var, "t4", p->thres[4], atoi); - GETVAR(var, "fr", p->frame, atoi); - GETVAR(var, "am", p->mode, atoi); -} - -static void parse_args(struct vf_priv_s *p, char *args) -{ - char *next, *orig; - for (args=orig=strdup(args); args; args=next) { - next = strchr(args, ':'); - if (next) *next++ = 0; - parse_var(p, args); - } - free(orig); -} - -static int vf_open(vf_instance_t *vf, char *args) -{ - struct vf_priv_s *p; - vf->config = config; - vf->put_image = put_image; - vf->query_format = query_format; - vf->uninit = uninit; - vf->default_reqs = VFCAP_ACCEPT_STRIDE; - vf->priv = p = calloc(1, sizeof(struct vf_priv_s)); - p->frame = -1; - p->thres[0] = 440; - p->thres[1] = 720; - p->thres[2] = 2500; - p->thres[3] = 2500; - p->thres[4] = 800; - p->drop = 0; - p->mode = 1; - if (args) parse_args(p, args); - p->analyze = anal_funcs[p->mode].func; - p->needread = anal_funcs[p->mode].needread; - vf_detc_init_pts_buf(&p->ptsbuf); - return 1; -} - -const vf_info_t vf_info_detc = { - "de-telecine filter", - "detc", - "Rich Felker", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_dint.c b/libmpcodecs/vf_dint.c deleted file mode 100644 index b449f9292c..0000000000 --- a/libmpcodecs/vf_dint.c +++ /dev/null @@ -1,214 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" - -#include "mp_image.h" -#include "img_format.h" -#include "vf.h" - -struct vf_priv_s { - float sense; // first parameter - float level; // second parameter - unsigned int imgfmt; - int diff; - uint32_t max; -// int dfr; -// int rdfr; - int was_dint; - mp_image_t *pmpi; // previous mpi -}; - -#define MAXROWSIZE 1200 - -static int config (struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt) -{ - int rowsize; - - vf->priv->pmpi = vf_get_image (vf->next, outfmt, MP_IMGTYPE_TEMP, - 0, width, height); - if (!(vf->priv->pmpi->flags & MP_IMGFLAG_PLANAR) && - outfmt != IMGFMT_RGB32 && outfmt != IMGFMT_BGR32 && - outfmt != IMGFMT_RGB24 && outfmt != IMGFMT_BGR24 && - outfmt != IMGFMT_RGB16 && outfmt != IMGFMT_BGR16) - { - mp_msg (MSGT_VFILTER, MSGL_WARN, "Drop-interlaced filter doesn't support this outfmt :(\n"); - return 0; - } - vf->priv->imgfmt = outfmt; - // recalculate internal values - rowsize = vf->priv->pmpi->width; - if (rowsize > MAXROWSIZE) rowsize = MAXROWSIZE; - vf->priv->max = vf->priv->level * vf->priv->pmpi->height * rowsize / 2; - if (vf->priv->pmpi->flags & MP_IMGFLAG_PLANAR) // planar YUV - vf->priv->diff = vf->priv->sense * 256; - else - vf->priv->diff = vf->priv->sense * (1 << (vf->priv->pmpi->bpp/3)); - if (vf->priv->diff < 0) vf->priv->diff = 0; - if (!(vf->priv->pmpi->flags & MP_IMGFLAG_PLANAR) && - vf->priv->pmpi->bpp < 24 && vf->priv->diff > 31) - vf->priv->diff = 31; - mp_msg (MSGT_VFILTER, MSGL_INFO, "Drop-interlaced: %dx%d diff %d / level %u\n", - vf->priv->pmpi->width, vf->priv->pmpi->height, - vf->priv->diff, (unsigned int)vf->priv->max); -// vf->priv->rdfr = vf->priv->dfr = 0; - vf->priv->was_dint = 0; - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static int put_image (struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - int8_t rrow0[MAXROWSIZE]; - int8_t rrow1[MAXROWSIZE]; - int8_t rrow2[MAXROWSIZE]; - int8_t *row0 = rrow0, *row1 = rrow1, *row2 = rrow2/*, *row3 = rrow3*/; - int rowsize = mpi->width; - uint32_t nok = 0, max = vf->priv->max; - int diff = vf->priv->diff; - int i, j; - register int n1, n2; - unsigned char *cur0, *prv0; - register unsigned char *cur, *prv; - - if (rowsize > MAXROWSIZE) rowsize = MAXROWSIZE; - // check if nothing to do - if (mpi->imgfmt == vf->priv->imgfmt) - { - cur0 = mpi->planes[0] + mpi->stride[0]; - prv0 = mpi->planes[0]; - for (j = 1; j < mpi->height && nok <= max; j++) - { - cur = cur0; - prv = prv0; - // analyse row (row0) - if (mpi->flags & MP_IMGFLAG_PLANAR) // planar YUV - check luminance - for (i = 0; i < rowsize; i++) - { - if (cur[0] - prv[0] > diff) - row0[i] = 1; - else if (cur[0] - prv[0] < -diff) - row0[i] = -1; - else - row0[i] = 0; - cur++; - prv++; - // check if row0 is 1 but row1 is 0, and row2 is 1 or row2 is 0 - // but row3 is 1 so it's interlaced ptr (nok++) - if (j > 2 && row0[i] > 0 && (row1[i] < 0 || (!row1[i] && row2[i] < 0)) && - (++nok) > max) - break; - } - else if (mpi->bpp < 24) // RGB/BGR 16 - check all colors - for (i = 0; i < rowsize; i++) - { - n1 = cur[0] + (cur[1]<<8); - n2 = prv[0] + (prv[1]<<8); - if ((n1&0x1f) - (n2&0x1f) > diff || - ((n1>>5)&0x3f) - ((n2>>5)&0x3f) > diff || - ((n1>>11)&0x1f) - ((n2>>11)&0x1f) > diff) - row0[i] = 1; - else if ((n1&0x1f) - (n2&0x1f) < -diff || - ((n1>>5)&0x3f) - ((n2>>5)&0x3f) < -diff || - ((n1>>11)&0x1f) - ((n2>>11)&0x1f) < -diff) - row0[i] = -1; - else - row0[i] = 0; - cur += 2; - prv += 2; - // check if row0 is 1 but row1 is 0, and row2 is 1 or row2 is 0 - // but row3 is 1 so it's interlaced ptr (nok++) - if (j > 2 && row0[i] > 0 && (row1[i] < 0 || (!row1[i] && row2[i] < 0)) && - (++nok) > max) - break; - } - else // RGB/BGR 24/32 - for (i = 0; i < rowsize; i++) - { - if (cur[0] - prv[0] > diff || - cur[1] - prv[1] > diff || - cur[2] - prv[2] > diff) - row0[i] = 1; - else if (prv[0] - cur[0] > diff || - prv[1] - cur[1] > diff || - prv[2] - cur[2] > diff) - row0[i] = -1; - else - row0[i] = 0; - cur += mpi->bpp/8; - prv += mpi->bpp/8; - // check if row0 is 1 but row1 is 0, and row2 is 1 or row2 is 0 - // but row3 is 1 so it's interlaced ptr (nok++) - if (j > 2 && row0[i] > 0 && (row1[i] < 0 || (!row1[i] && row2[i] < 0)) && - (++nok) > max) - break; - } - cur0 += mpi->stride[0]; - prv0 += mpi->stride[0]; - // rotate rows - cur = row2; - row2 = row1; - row1 = row0; - row0 = cur; - } - } - // check if number of interlaced is above of max - if (nok > max) - { -// vf->priv->dfr++; - if (vf->priv->was_dint < 1) // can skip at most one frame! - { - vf->priv->was_dint++; -// vf->priv->rdfr++; -// mp_msg (MSGT_VFILTER, MSGL_INFO, "DI:%d/%d ", vf->priv->rdfr, vf->priv->dfr); - return 0; - } - } - vf->priv->was_dint = 0; -// mp_msg (MSGT_VFILTER, MSGL_INFO, "DI:%d/%d ", vf->priv->rdfr, vf->priv->dfr); - return vf_next_put_image (vf, mpi, pts); -} - -static int vf_open(vf_instance_t *vf, char *args){ - vf->config = config; - vf->put_image = put_image; -// vf->default_reqs=VFCAP_ACCEPT_STRIDE; - vf->priv = malloc (sizeof(struct vf_priv_s)); - vf->priv->sense = 0.1; - vf->priv->level = 0.15; - vf->priv->pmpi = NULL; - if (args) - sscanf (args, "%f:%f", &vf->priv->sense, &vf->priv->level); - return 1; -} - -const vf_info_t vf_info_dint = { - "drop interlaced frames", - "dint", - "A.G.", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_dvbscale.c b/libmpcodecs/vf_dvbscale.c deleted file mode 100644 index 00c54ccbdf..0000000000 --- a/libmpcodecs/vf_dvbscale.c +++ /dev/null @@ -1,67 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -struct vf_priv_s { - int aspect; -}; - -//===========================================================================// - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - - int scaled_y=vf->priv->aspect*d_height/d_width; - - d_width=width; // do X-scaling by hardware - d_height=scaled_y; - - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static int vf_open(vf_instance_t *vf, char *args){ - vf->config=config; - vf->default_caps=0; - vf->priv=malloc(sizeof(struct vf_priv_s)); - vf->priv->aspect=768; - if(args) vf->priv->aspect=atoi(args); - return 1; -} - -const vf_info_t vf_info_dvbscale = { - "calc Y scaling for DVB card", - "dvbscale", - "A'rpi", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_eq.c b/libmpcodecs/vf_eq.c deleted file mode 100644 index 5925c86451..0000000000 --- a/libmpcodecs/vf_eq.c +++ /dev/null @@ -1,258 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" -#include "cpudetect.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -#include "libvo/video_out.h" - -#include "m_option.h" -#include "m_struct.h" - -static struct vf_priv_s { - unsigned char *buf; - int brightness; - int contrast; -} const vf_priv_dflt = { - NULL, - 0, - 0 -}; - -#if HAVE_MMX -static void process_MMX(unsigned char *dest, int dstride, unsigned char *src, int sstride, - int w, int h, int brightness, int contrast) -{ - int i; - int pel; - int dstep = dstride-w; - int sstep = sstride-w; - short brvec[4]; - short contvec[4]; - - contrast = ((contrast+100)*256*16)/100; - brightness = ((brightness+100)*511)/200-128 - contrast/32; - - brvec[0] = brvec[1] = brvec[2] = brvec[3] = brightness; - contvec[0] = contvec[1] = contvec[2] = contvec[3] = contrast; - - while (h--) { - __asm__ volatile ( - "movq (%5), %%mm3 \n\t" - "movq (%6), %%mm4 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "movl %4, %%eax\n\t" - ASMALIGN(4) - "1: \n\t" - "movq (%0), %%mm1 \n\t" - "movq (%0), %%mm2 \n\t" - "punpcklbw %%mm0, %%mm1 \n\t" - "punpckhbw %%mm0, %%mm2 \n\t" - "psllw $4, %%mm1 \n\t" - "psllw $4, %%mm2 \n\t" - "pmulhw %%mm4, %%mm1 \n\t" - "pmulhw %%mm4, %%mm2 \n\t" - "paddw %%mm3, %%mm1 \n\t" - "paddw %%mm3, %%mm2 \n\t" - "packuswb %%mm2, %%mm1 \n\t" - "add $8, %0 \n\t" - "movq %%mm1, (%1) \n\t" - "add $8, %1 \n\t" - "decl %%eax \n\t" - "jnz 1b \n\t" - : "=r" (src), "=r" (dest) - : "0" (src), "1" (dest), "r" (w>>3), "r" (brvec), "r" (contvec) - : "%eax" - ); - - for (i = w&7; i; i--) - { - pel = ((*src++* contrast)>>12) + brightness; - if(pel&768) pel = (-pel)>>31; - *dest++ = pel; - } - - src += sstep; - dest += dstep; - } - __asm__ volatile ( "emms \n\t" ::: "memory" ); -} -#endif - -static void process_C(unsigned char *dest, int dstride, unsigned char *src, int sstride, - int w, int h, int brightness, int contrast) -{ - int i; - int pel; - int dstep = dstride-w; - int sstep = sstride-w; - - contrast = ((contrast+100)*256*256)/100; - brightness = ((brightness+100)*511)/200-128 - contrast/512; - - while (h--) { - for (i = w; i; i--) - { - pel = ((*src++* contrast)>>16) + brightness; - if(pel&768) pel = (-pel)>>31; - *dest++ = pel; - } - src += sstep; - dest += dstep; - } -} - -static void (*process)(unsigned char *dest, int dstride, unsigned char *src, int sstride, - int w, int h, int brightness, int contrast); - -/* FIXME: add packed yuv version of process */ - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - mp_image_t *dmpi; - - dmpi=vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_EXPORT, 0, - mpi->w, mpi->h); - - dmpi->stride[0] = mpi->stride[0]; - dmpi->planes[1] = mpi->planes[1]; - dmpi->planes[2] = mpi->planes[2]; - dmpi->stride[1] = mpi->stride[1]; - dmpi->stride[2] = mpi->stride[2]; - - if (!vf->priv->buf) vf->priv->buf = malloc(mpi->stride[0]*mpi->h); - - if ((vf->priv->brightness == 0) && (vf->priv->contrast == 0)) - dmpi->planes[0] = mpi->planes[0]; - else { - dmpi->planes[0] = vf->priv->buf; - process(dmpi->planes[0], dmpi->stride[0], - mpi->planes[0], mpi->stride[0], - mpi->w, mpi->h, vf->priv->brightness, - vf->priv->contrast); - } - - return vf_next_put_image(vf,dmpi, pts); -} - -static int control(struct vf_instance *vf, int request, void* data) -{ - vf_equalizer_t *eq; - - switch (request) { - case VFCTRL_SET_EQUALIZER: - eq = data; - if (!strcmp(eq->item,"brightness")) { - vf->priv->brightness = eq->value; - return CONTROL_TRUE; - } - else if (!strcmp(eq->item,"contrast")) { - vf->priv->contrast = eq->value; - return CONTROL_TRUE; - } - break; - case VFCTRL_GET_EQUALIZER: - eq = data; - if (!strcmp(eq->item,"brightness")) { - eq->value = vf->priv->brightness; - return CONTROL_TRUE; - } - else if (!strcmp(eq->item,"contrast")) { - eq->value = vf->priv->contrast; - return CONTROL_TRUE; - } - break; - } - return vf_next_control(vf, request, data); -} - -static int query_format(struct vf_instance *vf, unsigned int fmt) -{ - switch (fmt) { - case IMGFMT_YVU9: - case IMGFMT_IF09: - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_CLPL: - case IMGFMT_Y800: - case IMGFMT_Y8: - case IMGFMT_NV12: - case IMGFMT_NV21: - case IMGFMT_444P: - case IMGFMT_422P: - case IMGFMT_411P: - return vf_next_query_format(vf, fmt); - } - return 0; -} - -static void uninit(struct vf_instance *vf) -{ - free(vf->priv->buf); - free(vf->priv); -} - -static int vf_open(vf_instance_t *vf, char *args) -{ - vf->control=control; - vf->query_format=query_format; - vf->put_image=put_image; - vf->uninit=uninit; - - process = process_C; -#if HAVE_MMX - if(gCpuCaps.hasMMX) process = process_MMX; -#endif - - return 1; -} - -#define ST_OFF(f) M_ST_OFF(struct vf_priv_s,f) -static const m_option_t vf_opts_fields[] = { - {"brightness", ST_OFF(brightness), CONF_TYPE_INT, M_OPT_RANGE,-100 ,100, NULL}, - {"contrast", ST_OFF(contrast), CONF_TYPE_INT, M_OPT_RANGE,-100 ,100, NULL}, - { NULL, NULL, 0, 0, 0, 0, NULL } -}; - -static const m_struct_t vf_opts = { - "eq", - sizeof(struct vf_priv_s), - &vf_priv_dflt, - vf_opts_fields -}; - -const vf_info_t vf_info_eq = { - "soft video equalizer", - "eq", - "Richard Felker", - "", - vf_open, - &vf_opts -}; diff --git a/libmpcodecs/vf_field.c b/libmpcodecs/vf_field.c deleted file mode 100644 index f9cb06aded..0000000000 --- a/libmpcodecs/vf_field.c +++ /dev/null @@ -1,89 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "config.h" -#include "mp_msg.h" - -#include "mp_image.h" -#include "vf.h" - -struct vf_priv_s { - int field; -}; - -//===========================================================================// - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - return vf_next_config(vf,width,height/2,d_width,d_height,flags,outfmt); -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_EXPORT, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->width, mpi->height/2); - - // set up mpi as a double-stride image of dmpi: - vf->dmpi->planes[0]=mpi->planes[0]+mpi->stride[0]*vf->priv->field; - vf->dmpi->stride[0]=2*mpi->stride[0]; - if(vf->dmpi->flags&MP_IMGFLAG_PLANAR){ - vf->dmpi->planes[1]=mpi->planes[1]+ - mpi->stride[1]*vf->priv->field; - vf->dmpi->stride[1]=2*mpi->stride[1]; - vf->dmpi->planes[2]=mpi->planes[2]+ - mpi->stride[2]*vf->priv->field; - vf->dmpi->stride[2]=2*mpi->stride[2]; - } else - vf->dmpi->planes[1]=mpi->planes[1]; // passthru bgr8 palette!!! - - return vf_next_put_image(vf,vf->dmpi, pts); -} - -//===========================================================================// - -static void uninit(struct vf_instance *vf) -{ - free(vf->priv); -} - -static int vf_open(vf_instance_t *vf, char *args){ - vf->config=config; - vf->put_image=put_image; - vf->uninit=uninit; - vf->default_reqs=VFCAP_ACCEPT_STRIDE; - vf->priv=calloc(1, sizeof(struct vf_priv_s)); - if (args) sscanf(args, "%d", &vf->priv->field); - vf->priv->field &= 1; - return 1; -} - -const vf_info_t vf_info_field = { - "extract single field", - "field", - "Rich Felker", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_fil.c b/libmpcodecs/vf_fil.c deleted file mode 100644 index fb04f9504b..0000000000 --- a/libmpcodecs/vf_fil.c +++ /dev/null @@ -1,116 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "config.h" -#include "mp_msg.h" - -#include "mp_image.h" -#include "vf.h" - -struct vf_priv_s { - int interleave; - int height; - int width; - int stridefactor; -}; - -//===========================================================================// - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - int pixel_stride= (width+15)&~15; //FIXME this is ust a guess ... especially for non planar its somewhat bad one - -#if 0 - if(mpi->flags&MP_IMGFLAG_PLANAR) - pixel_stride= mpi->stride[0]; - else - pixel_stride= 8*mpi->stride[0] / mpi->bpp; - -#endif - - if(vf->priv->interleave){ - vf->priv->height= 2*height; - vf->priv->width= width - (pixel_stride/2); - vf->priv->stridefactor=1; - }else{ - vf->priv->height= height/2; - vf->priv->width= width + pixel_stride; - vf->priv->stridefactor=4; - } -//printf("hX %d %d %d\n", vf->priv->width,vf->priv->height,vf->priv->stridefactor); - - return vf_next_config(vf, vf->priv->width, vf->priv->height, - (d_width*vf->priv->stridefactor)>>1, 2*d_height/vf->priv->stridefactor, flags, outfmt); -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - if(mpi->flags&MP_IMGFLAG_DIRECT){ - // we've used DR, so we're ready... - return vf_next_put_image(vf,(mp_image_t*)mpi->priv, pts); - } - - vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_EXPORT, MP_IMGFLAG_ACCEPT_STRIDE, - vf->priv->width, vf->priv->height); - - // set up mpi as a double-stride image of dmpi: - vf->dmpi->planes[0]=mpi->planes[0]; - vf->dmpi->stride[0]=(mpi->stride[0]*vf->priv->stridefactor)>>1; - if(vf->dmpi->flags&MP_IMGFLAG_PLANAR){ - vf->dmpi->planes[1]=mpi->planes[1]; - vf->dmpi->stride[1]=(mpi->stride[1]*vf->priv->stridefactor)>>1; - vf->dmpi->planes[2]=mpi->planes[2]; - vf->dmpi->stride[2]=(mpi->stride[2]*vf->priv->stridefactor)>>1; - } else - vf->dmpi->planes[1]=mpi->planes[1]; // passthru bgr8 palette!!! - - return vf_next_put_image(vf,vf->dmpi, pts); -} - -//===========================================================================// - -static void uninit(struct vf_instance *vf) -{ - free(vf->priv); -} - -static int vf_open(vf_instance_t *vf, char *args){ - vf->config=config; - vf->put_image=put_image; - vf->uninit=uninit; - vf->default_reqs=VFCAP_ACCEPT_STRIDE; - vf->priv=calloc(1, sizeof(struct vf_priv_s)); - vf->priv->interleave= args && (*args == 'i'); - return 1; -} - -const vf_info_t vf_info_fil = { - "fast (de)interleaver", - "fil", - "Michael Niedermayer", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_filmdint.c b/libmpcodecs/vf_filmdint.c deleted file mode 100644 index 28eb1e77af..0000000000 --- a/libmpcodecs/vf_filmdint.c +++ /dev/null @@ -1,1442 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <sys/time.h> - -#include "config.h" -#include "mp_msg.h" -#include "cpudetect.h" -#include "options.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" -#include "cmmx.h" - -#include "libvo/fastmemcpy.h" - -#define NUM_STORED 4 - -enum pu_field_type_t { - PU_1ST_OF_3, - PU_2ND_OF_3, - PU_3RD_OF_3, - PU_1ST_OF_2, - PU_2ND_OF_2, - PU_INTERLACED -}; - -struct metrics { - /* This struct maps to a packed word 64-bit MMX register */ - unsigned short int even; - unsigned short int odd; - unsigned short int noise; - unsigned short int temp; -} __attribute__ ((aligned (8))); - -struct frame_stats { - struct metrics tiny, low, high, bigger, twox, max; - struct { unsigned int even, odd, noise, temp; } sad; - unsigned short interlaced_high; - unsigned short interlaced_low; - unsigned short num_blocks; -}; - -struct vf_priv_s { - unsigned long inframes; - unsigned long outframes; - enum pu_field_type_t prev_type; - unsigned swapped, chroma_swapped; - unsigned luma_only; - unsigned verbose; - unsigned fast; - unsigned long w, h, cw, ch, stride, chroma_stride, nplanes; - unsigned long sad_thres; - unsigned long dint_thres; - unsigned char *memory_allocated; - unsigned char *planes[2*NUM_STORED][4]; - unsigned char **old_planes; - unsigned long static_idx; - unsigned long temp_idx; - unsigned long crop_x, crop_y, crop_cx, crop_cy; - unsigned long export_count, merge_count; - unsigned long num_breaks; - unsigned long num_copies; - long in_inc, out_dec, iosync; - long num_fields; - long prev_fields; - long notout; - long mmx2; - unsigned small_bytes[2]; - unsigned mmx_temp[2]; - struct frame_stats stats[2]; - struct metrics thres; - char chflag; - double diff_time, merge_time, decode_time, vo_time, filter_time; - struct vf_detc_pts_buf ptsbuf; -}; - -#define PPZ { 2000, 2000, 0, 2000 } -#define PPR { 2000, 2000, 0, 2000 } -static const struct frame_stats ppzs = {PPZ,PPZ,PPZ,PPZ,PPZ,PPZ,PPZ,0,0,9999}; -static const struct frame_stats pprs = {PPR,PPR,PPR,PPR,PPR,PPR,PPR,0,0,9999}; - -#ifndef MIN -#define MIN(a,b) (((a)<(b))?(a):(b)) -#endif -#ifndef MAX -#define MAX(a,b) (((a)>(b))?(a):(b)) -#endif - -#define PDIFFUB(X,Y,T) "movq " #X "," #T "\n\t" \ - "psubusb " #Y "," #T "\n\t" \ - "psubusb " #X "," #Y "\n\t" \ - "paddusb " #Y "," #T "\n\t" - -#define PDIFFUBT(X,Y,T) "movq " #X "," #T "\n\t" \ - "psubusb " #Y "," #T "\n\t" \ - "psubusb " #X "," #Y "\n\t" \ - "paddusb " #T "," #Y "\n\t" - -#define PSUMBW(X,T,Z) "movq " #X "," #T "\n\t" \ - "punpcklbw " #Z "," #X "\n\t" \ - "punpckhbw " #Z "," #T "\n\t" \ - "paddw " #T "," #X "\n\t" \ - "movq " #X "," #T "\n\t" \ - "psllq $32, " #T "\n\t" \ - "paddw " #T "," #X "\n\t" \ - "movq " #X "," #T "\n\t" \ - "psllq $16, " #T "\n\t" \ - "paddw " #T "," #X "\n\t" \ - "psrlq $48, " #X "\n\t" - -#define PSADBW(X,Y,T,Z) PDIFFUBT(X,Y,T) PSUMBW(Y,T,Z) - -#define PMAXUB(X,Y) "psubusb " #X "," #Y "\n\tpaddusb " #X "," #Y "\n\t" -#define PMAXUW(X,Y) "psubusw " #X "," #Y "\n\tpaddusw " #X "," #Y "\n\t" -#define PMINUBT(X,Y,T) "movq " #Y "," #T "\n\t" \ - "psubusb " #X "," #T "\n\t" \ - "psubusb " #T "," #Y "\n\t" -#define PAVGB(X,Y) "pavgusb " #X "," #Y "\n\t" - -static inline void -get_metrics_c(unsigned char *a, unsigned char *b, int as, int bs, int lines, - struct metrics *m) -{ - a -= as; - b -= bs; - do { - cmmx_t old_po = *(cmmx_t*)(a ); - cmmx_t po = *(cmmx_t*)(b ); - cmmx_t e = *(cmmx_t*)(b + bs); - cmmx_t old_o = *(cmmx_t*)(a + 2*as); - cmmx_t o = *(cmmx_t*)(b + 2*bs); - cmmx_t ne = *(cmmx_t*)(b + 3*bs); - cmmx_t old_no = *(cmmx_t*)(a + 4*as); - cmmx_t no = *(cmmx_t*)(b + 4*bs); - - cmmx_t qup_old_odd = p31avgb(old_o, old_po); - cmmx_t qup_odd = p31avgb( o, po); - cmmx_t qdown_old_odd = p31avgb(old_o, old_no); - cmmx_t qdown_odd = p31avgb( o, no); - - cmmx_t qup_even = p31avgb(ne, e); - cmmx_t qdown_even = p31avgb(e, ne); - - cmmx_t temp_up_diff = pdiffub(qdown_even, qup_old_odd); - cmmx_t noise_up_diff = pdiffub(qdown_even, qup_odd); - cmmx_t temp_down_diff = pdiffub(qup_even, qdown_old_odd); - cmmx_t noise_down_diff = pdiffub(qup_even, qdown_odd); - - cmmx_t odd_diff = pdiffub(o, old_o); - m->odd += psumbw(odd_diff); - m->even += psadbw(e, *(cmmx_t*)(a+as)); - - temp_up_diff = pminub(temp_up_diff, temp_down_diff); - temp_up_diff = pminub(temp_up_diff, odd_diff); - m->temp += psumbw(temp_up_diff); - noise_up_diff = pminub(noise_up_diff, odd_diff); - noise_up_diff = pminub(noise_up_diff, noise_down_diff); - - m->noise += psumbw(noise_up_diff); - a += 2*as; - b += 2*bs; - } while (--lines); -} - -static inline void -get_metrics_fast_c(unsigned char *a, unsigned char *b, int as, int bs, - int lines, struct metrics *m) -{ - a -= as; - b -= bs; - do { - cmmx_t old_po = (*(cmmx_t*)(a ) >> 1) & ~SIGN_BITS; - cmmx_t po = (*(cmmx_t*)(b ) >> 1) & ~SIGN_BITS; - cmmx_t old_e = (*(cmmx_t*)(a + as) >> 1) & ~SIGN_BITS; - cmmx_t e = (*(cmmx_t*)(b + bs) >> 1) & ~SIGN_BITS; - cmmx_t old_o = (*(cmmx_t*)(a + 2*as) >> 1) & ~SIGN_BITS; - cmmx_t o = (*(cmmx_t*)(b + 2*bs) >> 1) & ~SIGN_BITS; - cmmx_t ne = (*(cmmx_t*)(b + 3*bs) >> 1) & ~SIGN_BITS; - cmmx_t old_no = (*(cmmx_t*)(a + 4*as) >> 1) & ~SIGN_BITS; - cmmx_t no = (*(cmmx_t*)(b + 4*bs) >> 1) & ~SIGN_BITS; - - cmmx_t qup_old_odd = p31avgb_s(old_o, old_po); - cmmx_t qup_odd = p31avgb_s( o, po); - cmmx_t qdown_old_odd = p31avgb_s(old_o, old_no); - cmmx_t qdown_odd = p31avgb_s( o, no); - - cmmx_t qup_even = p31avgb_s(ne, e); - cmmx_t qdown_even = p31avgb_s(e, ne); - - cmmx_t temp_up_diff = pdiffub_s(qdown_even, qup_old_odd); - cmmx_t noise_up_diff = pdiffub_s(qdown_even, qup_odd); - cmmx_t temp_down_diff = pdiffub_s(qup_even, qdown_old_odd); - cmmx_t noise_down_diff = pdiffub_s(qup_even, qdown_odd); - - cmmx_t odd_diff = pdiffub_s(o, old_o); - m->odd += psumbw_s(odd_diff) << 1; - m->even += psadbw_s(e, old_e) << 1; - - temp_up_diff = pminub_s(temp_up_diff, temp_down_diff); - temp_up_diff = pminub_s(temp_up_diff, odd_diff); - m->temp += psumbw_s(temp_up_diff) << 1; - noise_up_diff = pminub_s(noise_up_diff, odd_diff); - noise_up_diff = pminub_s(noise_up_diff, noise_down_diff); - - m->noise += psumbw_s(noise_up_diff) << 1; - a += 2*as; - b += 2*bs; - } while (--lines); -} - -static inline void -get_metrics_faster_c(unsigned char *a, unsigned char *b, int as, int bs, - int lines, struct metrics *m) -{ - a -= as; - b -= bs; - do { - cmmx_t old_po = (*(cmmx_t*)(a )>>1) & ~SIGN_BITS; - cmmx_t po = (*(cmmx_t*)(b )>>1) & ~SIGN_BITS; - cmmx_t old_e = (*(cmmx_t*)(a + as)>>1) & ~SIGN_BITS; - cmmx_t e = (*(cmmx_t*)(b + bs)>>1) & ~SIGN_BITS; - cmmx_t old_o = (*(cmmx_t*)(a + 2*as)>>1) & ~SIGN_BITS; - cmmx_t o = (*(cmmx_t*)(b + 2*bs)>>1) & ~SIGN_BITS; - cmmx_t ne = (*(cmmx_t*)(b + 3*bs)>>1) & ~SIGN_BITS; - - cmmx_t down_even = p31avgb_s(e, ne); - cmmx_t up_odd = p31avgb_s(o, po); - cmmx_t up_old_odd = p31avgb_s(old_o, old_po); - - cmmx_t odd_diff = pdiffub_s(o, old_o); - cmmx_t temp_diff = pdiffub_s(down_even, up_old_odd); - cmmx_t noise_diff = pdiffub_s(down_even, up_odd); - - m->even += psadbw_s(e, old_e) << 1; - m->odd += psumbw_s(odd_diff) << 1; - - temp_diff = pminub_s(temp_diff, odd_diff); - noise_diff = pminub_s(noise_diff, odd_diff); - - m->noise += psumbw_s(noise_diff) << 1; - m->temp += psumbw_s(temp_diff) << 1; - a += 2*as; - b += 2*bs; - } while (--lines); - -} - -static inline void -get_block_stats(struct metrics *m, struct vf_priv_s *p, struct frame_stats *s) -{ - unsigned two_e = m->even + MAX(m->even , p->thres.even ); - unsigned two_o = m->odd + MAX(m->odd , p->thres.odd ); - unsigned two_n = m->noise + MAX(m->noise, p->thres.noise); - unsigned two_t = m->temp + MAX(m->temp , p->thres.temp ); - - unsigned e_big = m->even >= (m->odd + two_o + 1)/2; - unsigned o_big = m->odd >= (m->even + two_e + 1)/2; - unsigned n_big = m->noise >= (m->temp + two_t + 1)/2; - unsigned t_big = m->temp >= (m->noise + two_n + 1)/2; - - unsigned e2x = m->even >= two_o; - unsigned o2x = m->odd >= two_e; - unsigned n2x = m->noise >= two_t; - unsigned t2x = m->temp >= two_n; - - unsigned ntiny_e = m->even > p->thres.even ; - unsigned ntiny_o = m->odd > p->thres.odd ; - unsigned ntiny_n = m->noise > p->thres.noise; - unsigned ntiny_t = m->temp > p->thres.temp ; - - unsigned nlow_e = m->even > 2*p->thres.even ; - unsigned nlow_o = m->odd > 2*p->thres.odd ; - unsigned nlow_n = m->noise > 2*p->thres.noise; - unsigned nlow_t = m->temp > 2*p->thres.temp ; - - unsigned high_e = m->even > 4*p->thres.even ; - unsigned high_o = m->odd > 4*p->thres.odd ; - unsigned high_n = m->noise > 4*p->thres.noise; - unsigned high_t = m->temp > 4*p->thres.temp ; - - unsigned low_il = !n_big && !t_big && ntiny_n && ntiny_t; - unsigned high_il = !n_big && !t_big && nlow_n && nlow_t; - - if (low_il | high_il) { - s->interlaced_low += low_il; - s->interlaced_high += high_il; - } else { - s->tiny.even += ntiny_e; - s->tiny.odd += ntiny_o; - s->tiny.noise += ntiny_n; - s->tiny.temp += ntiny_t; - - s->low .even += nlow_e ; - s->low .odd += nlow_o ; - s->low .noise += nlow_n ; - s->low .temp += nlow_t ; - - s->high.even += high_e ; - s->high.odd += high_o ; - s->high.noise += high_n ; - s->high.temp += high_t ; - - if (m->even >= p->sad_thres) s->sad.even += m->even ; - if (m->odd >= p->sad_thres) s->sad.odd += m->odd ; - if (m->noise >= p->sad_thres) s->sad.noise += m->noise; - if (m->temp >= p->sad_thres) s->sad.temp += m->temp ; - } - s->num_blocks++; - s->max.even = MAX(s->max.even , m->even ); - s->max.odd = MAX(s->max.odd , m->odd ); - s->max.noise = MAX(s->max.noise, m->noise); - s->max.temp = MAX(s->max.temp , m->temp ); - - s->bigger.even += e_big ; - s->bigger.odd += o_big ; - s->bigger.noise += n_big ; - s->bigger.temp += t_big ; - - s->twox.even += e2x ; - s->twox.odd += o2x ; - s->twox.noise += n2x ; - s->twox.temp += t2x ; - -} - -static inline struct metrics -block_metrics_c(unsigned char *a, unsigned char *b, int as, int bs, - int lines, struct vf_priv_s *p, struct frame_stats *s) -{ - struct metrics tm; - tm.even = tm.odd = tm.noise = tm.temp = 0; - get_metrics_c(a, b, as, bs, lines, &tm); - if (sizeof(cmmx_t) < 8) - get_metrics_c(a+4, b+4, as, bs, lines, &tm); - get_block_stats(&tm, p, s); - return tm; -} - -static inline struct metrics -block_metrics_fast_c(unsigned char *a, unsigned char *b, int as, int bs, - int lines, struct vf_priv_s *p, struct frame_stats *s) -{ - struct metrics tm; - tm.even = tm.odd = tm.noise = tm.temp = 0; - get_metrics_fast_c(a, b, as, bs, lines, &tm); - if (sizeof(cmmx_t) < 8) - get_metrics_fast_c(a+4, b+4, as, bs, lines, &tm); - get_block_stats(&tm, p, s); - return tm; -} - -static inline struct metrics -block_metrics_faster_c(unsigned char *a, unsigned char *b, int as, int bs, - int lines, struct vf_priv_s *p, struct frame_stats *s) -{ - struct metrics tm; - tm.even = tm.odd = tm.noise = tm.temp = 0; - get_metrics_faster_c(a, b, as, bs, lines, &tm); - if (sizeof(cmmx_t) < 8) - get_metrics_faster_c(a+4, b+4, as, bs, lines, &tm); - get_block_stats(&tm, p, s); - return tm; -} - -#define MEQ(X,Y) ((X).even == (Y).even && (X).odd == (Y).odd && (X).temp == (Y).temp && (X).noise == (Y).noise) - -#define BLOCK_METRICS_TEMPLATE() \ - __asm__ volatile("pxor %mm7, %mm7\n\t" /* The result is colleted in mm7 */ \ - "pxor %mm6, %mm6\n\t" /* Temp to stay at 0 */ \ - ); \ - a -= as; \ - b -= bs; \ - do { \ - __asm__ volatile( \ - "movq (%0,%2), %%mm0\n\t" \ - "movq (%1,%3), %%mm1\n\t" /* mm1 = even */ \ - PSADBW(%%mm1, %%mm0, %%mm4, %%mm6) \ - "paddusw %%mm0, %%mm7\n\t" /* even diff */ \ - "movq (%0,%2,2), %%mm0\n\t" /* mm0 = old odd */ \ - "movq (%1,%3,2), %%mm2\n\t" /* mm2 = odd */ \ - "movq (%0), %%mm3\n\t" \ - "psubusb %4, %%mm3\n\t" \ - PAVGB(%%mm0, %%mm3) \ - PAVGB(%%mm0, %%mm3) /* mm3 = qup old odd */ \ - "movq %%mm0, %%mm5\n\t" \ - PSADBW(%%mm2, %%mm0, %%mm4, %%mm6) \ - "psllq $16, %%mm0\n\t" \ - "paddusw %%mm0, %%mm7\n\t" \ - "movq (%1), %%mm4\n\t" \ - "lea (%0,%2,2), %0\n\t" \ - "lea (%1,%3,2), %1\n\t" \ - "psubusb %4, %%mm4\n\t" \ - PAVGB(%%mm2, %%mm4) \ - PAVGB(%%mm2, %%mm4) /* mm4 = qup odd */ \ - PDIFFUBT(%%mm5, %%mm2, %%mm0) /* mm2 =abs(oldodd-odd) */ \ - "movq (%1,%3), %%mm5\n\t" \ - "psubusb %4, %%mm5\n\t" \ - PAVGB(%%mm1, %%mm5) \ - PAVGB(%%mm5, %%mm1) /* mm1 = qdown even */ \ - PAVGB((%1,%3), %%mm5) /* mm5 = qup next even */ \ - PDIFFUBT(%%mm1, %%mm3, %%mm0) /* mm3 = abs(qupoldo-qde) */ \ - PDIFFUBT(%%mm1, %%mm4, %%mm0) /* mm4 = abs(qupodd-qde) */ \ - PMINUBT(%%mm2, %%mm3, %%mm0) /* limit temp to odd diff */ \ - PMINUBT(%%mm2, %%mm4, %%mm0) /* limit noise to odd diff */ \ - "movq (%1,%3,2), %%mm2\n\t" \ - "psubusb %4, %%mm2\n\t" \ - PAVGB((%1), %%mm2) \ - PAVGB((%1), %%mm2) /* mm2 = qdown odd */ \ - "movq (%0,%2,2), %%mm1\n\t" \ - "psubusb %4, %%mm1\n\t" \ - PAVGB((%0), %%mm1) \ - PAVGB((%0), %%mm1) /* mm1 = qdown old odd */ \ - PDIFFUBT(%%mm5, %%mm2, %%mm0) /* mm2 = abs(qdo-qune) */ \ - PDIFFUBT(%%mm5, %%mm1, %%mm0) /* mm1 = abs(qdoo-qune) */ \ - PMINUBT(%%mm4, %%mm2, %%mm0) /* current */ \ - PMINUBT(%%mm3, %%mm1, %%mm0) /* old */ \ - PSUMBW(%%mm2, %%mm0, %%mm6) \ - PSUMBW(%%mm1, %%mm0, %%mm6) \ - "psllq $32, %%mm2\n\t" \ - "psllq $48, %%mm1\n\t" \ - "paddusw %%mm2, %%mm7\n\t" \ - "paddusw %%mm1, %%mm7\n\t" \ - : "=r" (a), "=r" (b) \ - : "r"((x86_reg)as), "r"((x86_reg)bs), "m" (ones), "0"(a), "1"(b), "X"(*a), "X"(*b) \ - ); \ - } while (--lines); - -#undef PSUMBW -#undef PSADBW -#undef PMAXUB -#undef PMINUBT -#undef PAVGB - -#define PSUMBW(X,T,Z) "psadbw " #Z "," #X "\n\t" -#define PSADBW(X,Y,T,Z) "psadbw " #X "," #Y "\n\t" -#define PMAXUB(X,Y) "pmaxub " #X "," #Y "\n\t" -#define PMINUBT(X,Y,T) "pminub " #X "," #Y "\n\t" -#define PAVGB(X,Y) "pavgb " #X "," #Y "\n\t" - -static inline struct metrics -block_metrics_mmx2(unsigned char *a, unsigned char *b, int as, int bs, - int lines, struct vf_priv_s *p, struct frame_stats *s) -{ - struct metrics tm; -#if !HAVE_MMX - mp_msg(MSGT_VFILTER, MSGL_FATAL, "block_metrics_mmx2: internal error\n"); -#else - static const unsigned long long ones = 0x0101010101010101ull; - x86_reg interlaced; - x86_reg prefetch_line = (((long)a>>3) & 7) + 10; -#ifdef DEBUG - struct frame_stats ts = *s; -#endif - __asm__ volatile("prefetcht0 (%0,%2)\n\t" - "prefetcht0 (%1,%3)\n\t" : - : "r" (a), "r" (b), - "r" (prefetch_line * as), "r" (prefetch_line * bs)); - - BLOCK_METRICS_TEMPLATE(); - - s->num_blocks++; - __asm__ volatile( - "movq %3, %%mm0\n\t" - "movq %%mm7, %%mm1\n\t" - "psubusw %%mm0, %%mm1\n\t" - "movq %%mm1, %%mm2\n\t" - "paddusw %%mm0, %%mm2\n\t" - "paddusw %%mm7, %%mm2\n\t" - "pshufw $0xb1, %%mm2, %%mm3\n\t" - "pavgw %%mm7, %%mm2\n\t" - "pshufw $0xb1, %%mm2, %%mm2\n\t" - "psubusw %%mm7, %%mm2\n\t" - "pcmpeqw %%mm6, %%mm2\n\t" /* 1 if >= 1.5x */ - "psubusw %%mm7, %%mm3\n\t" - "pcmpeqw %%mm6, %%mm3\n\t" /* 1 if >= 2x */ - "movq %1, %%mm4\n\t" - "movq %2, %%mm5\n\t" - "psubw %%mm2, %%mm4\n\t" - "psubw %%mm3, %%mm5\n\t" - "movq %%mm4, %1\n\t" - "movq %%mm5, %2\n\t" - "pxor %%mm4, %%mm4\n\t" - "pcmpeqw %%mm1, %%mm4\n\t" /* 1 if <= t */ - "psubusw %%mm0, %%mm1\n\t" - "pxor %%mm5, %%mm5\n\t" - "pcmpeqw %%mm1, %%mm5\n\t" /* 1 if <= 2t */ - "psubusw %%mm0, %%mm1\n\t" - "psubusw %%mm0, %%mm1\n\t" - "pcmpeqw %%mm6, %%mm1\n\t" /* 1 if <= 4t */ - "pshufw $0xb1, %%mm2, %%mm0\n\t" - "por %%mm2, %%mm0\n\t" /* 1 if not close */ - "punpckhdq %%mm0, %%mm0\n\t" - "movq %%mm4, %%mm2\n\t" /* tttt */ - "punpckhdq %%mm5, %%mm2\n\t" /* ttll */ - "por %%mm2, %%mm0\n\t" - "pcmpeqd %%mm6, %%mm0\n\t" /* close && big */ - "psrlq $16, %%mm0\n\t" - "psrlw $15, %%mm0\n\t" - "movd %%mm0, %0\n\t" - : "=r" (interlaced), "=m" (s->bigger), "=m" (s->twox) - : "m" (p->thres) - ); - - if (interlaced) { - s->interlaced_high += interlaced >> 16; - s->interlaced_low += interlaced; - } else { - __asm__ volatile( - "pcmpeqw %%mm0, %%mm0\n\t" /* -1 */ - "psubw %%mm0, %%mm4\n\t" - "psubw %%mm0, %%mm5\n\t" - "psubw %%mm0, %%mm1\n\t" - "paddw %0, %%mm4\n\t" - "paddw %1, %%mm5\n\t" - "paddw %2, %%mm1\n\t" - "movq %%mm4, %0\n\t" - "movq %%mm5, %1\n\t" - "movq %%mm1, %2\n\t" - : "=m" (s->tiny), "=m" (s->low), "=m" (s->high) - ); - - __asm__ volatile( - "pshufw $0, %2, %%mm0\n\t" - "psubusw %%mm7, %%mm0\n\t" - "pcmpeqw %%mm6, %%mm0\n\t" /* 0 if below sad_thres */ - "pand %%mm7, %%mm0\n\t" - "movq %%mm0, %%mm1\n\t" - "punpcklwd %%mm6, %%mm0\n\t" /* sad even, odd */ - "punpckhwd %%mm6, %%mm1\n\t" /* sad noise, temp */ - "paddd %0, %%mm0\n\t" - "paddd %1, %%mm1\n\t" - "movq %%mm0, %0\n\t" - "movq %%mm1, %1\n\t" - : "=m" (s->sad.even), "=m" (s->sad.noise) - : "m" (p->sad_thres) - ); - } - - __asm__ volatile( - "movq %%mm7, (%1)\n\t" - PMAXUW((%0), %%mm7) - "movq %%mm7, (%0)\n\t" - "emms" - : : "r" (&s->max), "r" (&tm), "X" (s->max) - : "memory" - ); -#ifdef DEBUG - if (1) { - struct metrics cm; - a -= 7*as; - b -= 7*bs; - cm = block_metrics_c(a, b, as, bs, 4, p, &ts); - if (!MEQ(tm, cm)) - mp_msg(MSGT_VFILTER, MSGL_WARN, "Bad metrics\n"); - if (s) { -# define CHECK(X) if (!MEQ(s->X, ts.X)) \ - mp_msg(MSGT_VFILTER, MSGL_WARN, "Bad " #X "\n"); - CHECK(tiny); - CHECK(low); - CHECK(high); - CHECK(sad); - CHECK(max); - } - } -#endif -#endif - return tm; -} - -static inline int -dint_copy_line_mmx2(unsigned char *dst, unsigned char *a, long bos, - long cos, int ds, int ss, int w, int t) -{ -#if !HAVE_MMX - mp_msg(MSGT_VFILTER, MSGL_FATAL, "dint_copy_line_mmx2: internal error\n"); - return 0; -#else - unsigned long len = (w+7) >> 3; - int ret; - __asm__ volatile ( - "pxor %%mm6, %%mm6 \n\t" /* deinterlaced pixel counter */ - "movd %0, %%mm7 \n\t" - "punpcklbw %%mm7, %%mm7 \n\t" - "punpcklwd %%mm7, %%mm7 \n\t" - "punpckldq %%mm7, %%mm7 \n\t" /* mm7 = threshold */ - : /* no output */ - : "rm" (t) - ); - do { - __asm__ volatile ( - "movq (%0), %%mm0\n\t" - "movq (%0,%3,2), %%mm1\n\t" - "movq %%mm0, (%2)\n\t" - "pmaxub %%mm1, %%mm0\n\t" - "pavgb (%0), %%mm1\n\t" - "psubusb %%mm1, %%mm0\n\t" - "paddusb %%mm7, %%mm0\n\t" /* mm0 = max-avg+thr */ - "movq (%0,%1), %%mm2\n\t" - "movq (%0,%5), %%mm3\n\t" - "movq %%mm2, %%mm4\n\t" - PDIFFUBT(%%mm1, %%mm2, %%mm5) - PDIFFUBT(%%mm1, %%mm3, %%mm5) - "pminub %%mm2, %%mm3\n\t" - "pcmpeqb %%mm3, %%mm2\n\t" /* b = min */ - "pand %%mm2, %%mm4\n\t" - "pandn (%0,%5), %%mm2\n\t" - "por %%mm4, %%mm2\n\t" - "pminub %%mm0, %%mm3\n\t" - "pcmpeqb %%mm0, %%mm3\n\t" /* set to 1s if >= threshold */ - "psubb %%mm3, %%mm6\n\t" /* count pixels above thr. */ - "pand %%mm3, %%mm1 \n\t" - "pandn %%mm2, %%mm3 \n\t" - "por %%mm3, %%mm1 \n\t" /* avg if >= threshold */ - "movq %%mm1, (%2,%4) \n\t" - : /* no output */ - : "r" (a), "r" ((x86_reg)bos), "r" ((x86_reg)dst), "r" ((x86_reg)ss), "r" ((x86_reg)ds), "r" ((x86_reg)cos) - ); - a += 8; - dst += 8; - } while (--len); - - __asm__ volatile ("pxor %%mm7, %%mm7 \n\t" - "psadbw %%mm6, %%mm7 \n\t" - "movd %%mm7, %0 \n\t" - "emms \n\t" - : "=r" (ret) - ); - return ret; -#endif -} - -static inline int -dint_copy_line(unsigned char *dst, unsigned char *a, long bos, - long cos, int ds, int ss, int w, int t) -{ - unsigned long len = ((unsigned long)w+sizeof(cmmx_t)-1) / sizeof(cmmx_t); - cmmx_t dint_count = 0; - cmmx_t thr; - t |= t << 8; - thr = t | (t << 16); - if (sizeof(cmmx_t) > 4) - thr |= thr << (sizeof(cmmx_t)*4); - do { - cmmx_t e = *(cmmx_t*)a; - cmmx_t ne = *(cmmx_t*)(a+2*ss); - cmmx_t o = *(cmmx_t*)(a+bos); - cmmx_t oo = *(cmmx_t*)(a+cos); - cmmx_t maxe = pmaxub(e, ne); - cmmx_t avge = pavgb(e, ne); - cmmx_t max_diff = maxe - avge + thr; /* 0<=max-avg<128, thr<128 */ - cmmx_t diffo = pdiffub(avge, o); - cmmx_t diffoo = pdiffub(avge, oo); - cmmx_t diffcmp = pcmpgtub(diffo, diffoo); - cmmx_t bo = ((oo ^ o) & diffcmp) ^ o; - cmmx_t diffbo = ((diffoo ^ diffo) & diffcmp) ^ diffo; - cmmx_t above_thr = ~pcmpgtub(max_diff, diffbo); - cmmx_t bo_or_avg = ((avge ^ bo) & above_thr) ^ bo; - dint_count += above_thr & ONE_BYTES; - *(cmmx_t*)(dst) = e; - *(cmmx_t*)(dst+ds) = bo_or_avg; - a += sizeof(cmmx_t); - dst += sizeof(cmmx_t); - } while (--len); - return psumbw(dint_count); -} - -static int -dint_copy_plane(unsigned char *d, unsigned char *a, unsigned char *b, - unsigned char *c, unsigned long w, unsigned long h, - unsigned long ds, unsigned long ss, unsigned long threshold, - long field, long mmx2) -{ - unsigned long ret = 0; - long bos = b - a; - long cos = c - a; - if (field) { - fast_memcpy(d, b, w); - h--; - d += ds; - a += ss; - } - bos += ss; - cos += ss; - while (h > 2) { - if (threshold >= 128) { - fast_memcpy(d, a, w); - fast_memcpy(d+ds, a+bos, w); - } else if (mmx2 == 1) { - ret += dint_copy_line_mmx2(d, a, bos, cos, ds, ss, w, threshold); - } else - ret += dint_copy_line(d, a, bos, cos, ds, ss, w, threshold); - h -= 2; - d += 2*ds; - a += 2*ss; - } - fast_memcpy(d, a, w); - if (h == 2) - fast_memcpy(d+ds, a+bos, w); - return ret; -} - -static void -copy_merge_fields(struct vf_priv_s *p, mp_image_t *dmpi, - unsigned char **old, unsigned char **new, unsigned long show) -{ - unsigned long threshold = 256; - unsigned long field = p->swapped; - unsigned long dint_pixels = 0; - unsigned char **other = old; - if (show >= 12 || !(show & 3)) - show >>= 2, other = new, new = old; - if (show <= 2) { /* Single field: de-interlace */ - threshold = p->dint_thres; - field ^= show & 1; - old = new; - } else if (show == 3) - old = new; - else - field ^= 1; - dint_pixels +=dint_copy_plane(dmpi->planes[0], old[0], new[0], - other[0], p->w, p->h, dmpi->stride[0], - p->stride, threshold, field, p->mmx2); - if (dmpi->flags & MP_IMGFLAG_PLANAR) { - if (p->luma_only) - old = new, other = new; - else - threshold = threshold/2 + 1; - field ^= p->chroma_swapped; - dint_copy_plane(dmpi->planes[1], old[1], new[1], - other[1], p->cw, p->ch, dmpi->stride[1], - p->chroma_stride, threshold, field, p->mmx2); - dint_copy_plane(dmpi->planes[2], old[2], new[2], - other[2], p->cw, p->ch, dmpi->stride[2], - p->chroma_stride, threshold, field, p->mmx2); - } - if (dint_pixels > 0 && p->verbose) - mp_msg(MSGT_VFILTER,MSGL_INFO,"Deinterlaced %lu pixels\n",dint_pixels); -} - -static void diff_planes(struct vf_priv_s *p, struct frame_stats *s, - unsigned char *of, unsigned char *nf, - int w, int h, int os, int ns, int swapped) -{ - int i, y; - int align = -(long)nf & 7; - of += align; - nf += align; - w -= align; - if (swapped) - of -= os, nf -= ns; - i = (h*3 >> 7) & ~1; - of += i*os + 8; - nf += i*ns + 8; - h -= i; - w -= 16; - - memset(s, 0, sizeof(*s)); - - for (y = (h-8) >> 3; y; y--) { - if (p->mmx2 == 1) { - for (i = 0; i < w; i += 8) - block_metrics_mmx2(of+i, nf+i, os, ns, 4, p, s); - } else if (p->fast > 3) { - for (i = 0; i < w; i += 8) - block_metrics_faster_c(of+i, nf+i, os, ns, 4, p, s); - } else if (p->fast > 1) { - for (i = 0; i < w; i += 8) - block_metrics_fast_c(of+i, nf+i, os, ns, 4, p, s); - } else { - for (i = 0; i < w; i += 8) - block_metrics_c(of+i, nf+i, os, ns, 4, p, s); - } - of += 8*os; - nf += 8*ns; - } -} - -#define METRICS(X) (X).even, (X).odd, (X).noise, (X).temp - -static void diff_fields(struct vf_priv_s *p, struct frame_stats *s, - unsigned char **old, unsigned char **new) -{ - diff_planes(p, s, old[0], new[0], p->w, p->h, - p->stride, p->stride, p->swapped); - s->sad.even = (s->sad.even * 16ul) / s->num_blocks; - s->sad.odd = (s->sad.odd * 16ul) / s->num_blocks; - s->sad.noise = (s->sad.noise * 16ul) / s->num_blocks; - s->sad.temp = (s->sad.temp * 16ul) / s->num_blocks; - if (p->verbose) - mp_msg(MSGT_VFILTER, MSGL_INFO, "%lu%c M:%d/%d/%d/%d - %d, " - "t:%d/%d/%d/%d, l:%d/%d/%d/%d, h:%d/%d/%d/%d, bg:%d/%d/%d/%d, " - "2x:%d/%d/%d/%d, sad:%d/%d/%d/%d, lil:%d, hil:%d, ios:%.1f\n", - p->inframes, p->chflag, METRICS(s->max), s->num_blocks, - METRICS(s->tiny), METRICS(s->low), METRICS(s->high), - METRICS(s->bigger), METRICS(s->twox), METRICS(s->sad), - s->interlaced_low, s->interlaced_high, - p->iosync / (double) p->in_inc); -} - -static const char *parse_args(struct vf_priv_s *p, const char *args) -{ - args--; - while (args && *++args && - (sscanf(args, "io=%lu:%lu", &p->out_dec, &p->in_inc) == 2 || - sscanf(args, "diff_thres=%hu", &p->thres.even ) == 1 || - sscanf(args, "comb_thres=%hu", &p->thres.noise) == 1 || - sscanf(args, "sad_thres=%lu", &p->sad_thres ) == 1 || - sscanf(args, "dint_thres=%lu", &p->dint_thres ) == 1 || - sscanf(args, "fast=%u", &p->fast ) == 1 || - sscanf(args, "mmx2=%lu", &p->mmx2 ) == 1 || - sscanf(args, "luma_only=%u", &p->luma_only ) == 1 || - sscanf(args, "verbose=%u", &p->verbose ) == 1 || - sscanf(args, "crop=%lu:%lu:%lu:%lu", &p->w, - &p->h, &p->crop_x, &p->crop_y) == 4)) - args = strchr(args, '/'); - return args; -} - -static unsigned long gcd(unsigned long x, unsigned long y) -{ - unsigned long t; - if (x > y) - t = x, x = y, y = t; - - while (x) { - t = y % x; - y = x; - x = t; - } - return y; -} - -static void init(struct vf_priv_s *p, mp_image_t *mpi) -{ - unsigned long i; - unsigned long plane_size, chroma_plane_size; - unsigned char *plane; - unsigned long cos, los; - p->crop_cx = p->crop_x >> mpi->chroma_x_shift; - p->crop_cy = p->crop_y >> mpi->chroma_y_shift; - if (mpi->flags & MP_IMGFLAG_ACCEPT_STRIDE) { - p->stride = (mpi->w + 15) & ~15; - p->chroma_stride = p->stride >> mpi->chroma_x_shift; - } else { - p->stride = mpi->width; - p->chroma_stride = mpi->chroma_width; - } - p->cw = p->w >> mpi->chroma_x_shift; - p->ch = p->h >> mpi->chroma_y_shift; - p->nplanes = 1; - p->static_idx = 0; - p->temp_idx = 0; - p->old_planes = p->planes[0]; - plane_size = mpi->h * p->stride; - chroma_plane_size = mpi->flags & MP_IMGFLAG_PLANAR ? - mpi->chroma_height * p->chroma_stride : 0; - p->memory_allocated = - malloc(NUM_STORED * (plane_size+2*chroma_plane_size) + - 8*p->chroma_stride + 4096); - /* align to page boundary */ - plane = p->memory_allocated + (-(long)p->memory_allocated & 4095); - memset(plane, 0, NUM_STORED * plane_size); - los = p->crop_x + p->crop_y * p->stride; - cos = p->crop_cx + p->crop_cy * p->chroma_stride; - for (i = 0; i != NUM_STORED; i++, plane += plane_size) { - p->planes[i][0] = plane; - p->planes[NUM_STORED + i][0] = plane + los; - } - if (mpi->flags & MP_IMGFLAG_PLANAR) { - p->nplanes = 3; - memset(plane, 0x80, NUM_STORED * 2 * chroma_plane_size); - for (i = 0; i != NUM_STORED; i++) { - p->planes[i][1] = plane; - p->planes[NUM_STORED + i][1] = plane + cos; - plane += chroma_plane_size; - p->planes[i][2] = plane; - p->planes[NUM_STORED + i][2] = plane + cos; - plane += chroma_plane_size; - } - } - p->out_dec <<= 2; - i = gcd(p->in_inc, p->out_dec); - p->in_inc /= i; - p->out_dec /= i; - p->iosync = 0; - p->num_fields = 3; -} - -static inline double get_time(void) -{ - struct timeval tv; - gettimeofday(&tv, 0); - return tv.tv_sec + tv.tv_usec * 1e-6; -} - -static void get_image(struct vf_instance *vf, mp_image_t *mpi) -{ - struct vf_priv_s *p = vf->priv; - static unsigned char **planes, planes_idx; - - if (mpi->type == MP_IMGTYPE_STATIC) return; - - if (!p->planes[0][0]) init(p, mpi); - - if (mpi->type == MP_IMGTYPE_TEMP || - (mpi->type == MP_IMGTYPE_IPB && !(mpi->flags & MP_IMGFLAG_READABLE))) - planes_idx = NUM_STORED/2 + (++p->temp_idx % (NUM_STORED/2)); - else - planes_idx = ++p->static_idx % (NUM_STORED/2); - planes = p->planes[planes_idx]; - mpi->priv = p->planes[NUM_STORED + planes_idx]; - if (mpi->priv == p->old_planes) { - unsigned char **old_planes = - p->planes[NUM_STORED + 2 + (++p->temp_idx & 1)]; - my_memcpy_pic(old_planes[0], p->old_planes[0], - p->w, p->h, p->stride, p->stride); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - my_memcpy_pic(old_planes[1], p->old_planes[1], - p->cw, p->ch, p->chroma_stride, p->chroma_stride); - my_memcpy_pic(old_planes[2], p->old_planes[2], - p->cw, p->ch, p->chroma_stride, p->chroma_stride); - } - p->old_planes = old_planes; - p->num_copies++; - } - mpi->planes[0] = planes[0]; - mpi->stride[0] = p->stride; - if (mpi->flags & MP_IMGFLAG_PLANAR) { - mpi->planes[1] = planes[1]; - mpi->planes[2] = planes[2]; - mpi->stride[1] = mpi->stride[2] = p->chroma_stride; - } - mpi->width = p->stride; - - mpi->flags |= MP_IMGFLAG_DIRECT; - mpi->flags &= ~MP_IMGFLAG_DRAW_CALLBACK; -} - -static inline long -cmpe(unsigned long x, unsigned long y, unsigned long err, unsigned long e) -{ - long diff = x-y; - long unit = ((x+y+err) >> e); - long ret = (diff > unit) - (diff < -unit); - unit >>= 1; - return ret + (diff > unit) - (diff < -unit); -} - -static unsigned long -find_breaks(struct vf_priv_s *p, struct frame_stats *s) -{ - struct frame_stats *ps = &p->stats[(p->inframes-1) & 1]; - long notfilm = 5*p->in_inc - p->out_dec; - unsigned long n = s->num_blocks >> 8; - unsigned long sad_comb_cmp = cmpe(s->sad.temp, s->sad.noise, 512, 1); - unsigned long ret = 8; - - if (cmpe(s->sad.temp, s->sad.even, 512, 1) > 0) - mp_msg(MSGT_VFILTER, MSGL_WARN, - "@@@@@@@@ Bottom-first field??? @@@@@@@@\n"); - if (s->sad.temp > 1000 && s->sad.noise > 1000) - return 3; - if (s->interlaced_high >= 2*n && s->sad.temp > 256 && s->sad.noise > 256) - return 3; - if (s->high.noise > s->num_blocks/4 && s->sad.noise > 10000 && - s->sad.noise > 2*s->sad.even && s->sad.noise > 2*ps->sad.odd) { - // Mid-frame scene change - if (s->tiny.temp + s->interlaced_low < n || - s->low.temp + s->interlaced_high < n/4 || - s->high.temp + s->interlaced_high < n/8 || - s->sad.temp < 160) - return 1; - return 3; - } - if (s->high.temp > s->num_blocks/4 && s->sad.temp > 10000 && - s->sad.temp > 2*ps->sad.odd && s->sad.temp > 2*ps->sad.even) { - // Start frame scene change - if (s->tiny.noise + s->interlaced_low < n || - s->low.noise + s->interlaced_high < n/4 || - s->high.noise + s->interlaced_high < n/8 || - s->sad.noise < 160) - return 2; - return 3; - } - if (sad_comb_cmp == 2) - return 2; - if (sad_comb_cmp == -2) - return 1; - - if (s->tiny.odd > 3*MAX(n,s->tiny.even) + s->interlaced_low) - return 1; - if (s->tiny.even > 3*MAX(n,s->tiny.odd)+s->interlaced_low && - (!sad_comb_cmp || (s->low.noise <= n/4 && s->low.temp <= n/4))) - return 4; - - if (s->sad.noise < 64 && s->sad.temp < 64 && - s->low.noise <= n/2 && s->high.noise <= n/4 && - s->low.temp <= n/2 && s->high.temp <= n/4) - goto still; - - if (s->tiny.temp > 3*MAX(n,s->tiny.noise) + s->interlaced_low) - return 2; - if (s->tiny.noise > 3*MAX(n,s->tiny.temp) + s->interlaced_low) - return 1; - - if (s->low.odd > 3*MAX(n/4,s->low.even) + s->interlaced_high) - return 1; - if (s->low.even > 3*MAX(n/4,s->low.odd)+s->interlaced_high && - s->sad.even > 2*s->sad.odd && - (!sad_comb_cmp || (s->low.noise <= n/4 && s->low.temp <= n/4))) - return 4; - - if (s->low.temp > 3*MAX(n/4,s->low.noise) + s->interlaced_high) - return 2; - if (s->low.noise > 3*MAX(n/4,s->low.temp) + s->interlaced_high) - return 1; - - if (sad_comb_cmp == 1 && s->sad.noise < 64) - return 2; - if (sad_comb_cmp == -1 && s->sad.temp < 64) - return 1; - - if (s->tiny.odd <= n || (s->tiny.noise <= n/2 && s->tiny.temp <= n/2)) { - if (s->interlaced_low <= n) { - if (p->num_fields == 1) - goto still; - if (s->tiny.even <= n || ps->tiny.noise <= n/2) - /* Still frame */ - goto still; - if (s->bigger.even >= 2*MAX(n,s->bigger.odd) + s->interlaced_low) - return 4; - if (s->low.even >= 2*n + s->interlaced_low) - return 4; - goto still; - } - } - if (s->low.odd <= n/4) { - if (s->interlaced_high <= n/4) { - if (p->num_fields == 1) - goto still; - if (s->low.even <= n/4) - /* Still frame */ - goto still; - if (s->bigger.even >= 2*MAX(n/4,s->bigger.odd)+s->interlaced_high) - return 4; - if (s->low.even >= n/2 + s->interlaced_high) - return 4; - goto still; - } - } - if (s->bigger.temp > 2*MAX(n,s->bigger.noise) + s->interlaced_low) - return 2; - if (s->bigger.noise > 2*MAX(n,s->bigger.temp) + s->interlaced_low) - return 1; - if (s->bigger.temp > 2*MAX(n,s->bigger.noise) + s->interlaced_high) - return 2; - if (s->bigger.noise > 2*MAX(n,s->bigger.temp) + s->interlaced_high) - return 1; - if (s->twox.temp > 2*MAX(n,s->twox.noise) + s->interlaced_high) - return 2; - if (s->twox.noise > 2*MAX(n,s->twox.temp) + s->interlaced_high) - return 1; - if (s->bigger.even > 2*MAX(n,s->bigger.odd) + s->interlaced_low && - s->bigger.temp < n && s->bigger.noise < n) - return 4; - if (s->interlaced_low > MIN(2*n, s->tiny.odd)) - return 3; - ret = 8 + (1 << (s->sad.temp > s->sad.noise)); - still: - if (p->num_fields == 1 && p->prev_fields == 3 && notfilm >= 0 && - (s->tiny.temp <= s->tiny.noise || s->sad.temp < s->sad.noise+16)) - return 1; - if (p->notout < p->num_fields && p->iosync > 2*p->in_inc && notfilm < 0) - notfilm = 0; - if (p->num_fields < 2 || - (p->num_fields == 2 && p->prev_fields == 2 && notfilm < 0)) - return ret; - if (!notfilm && (p->prev_fields&~1) == 2) { - if (p->prev_fields + p->num_fields == 5) { - if (s->tiny.noise <= s->tiny.temp || - s->low.noise == 0 || s->low.noise < s->low.temp || - s->sad.noise < s->sad.temp+16) - return 2; - } - if (p->prev_fields + p->num_fields == 4) { - if (s->tiny.temp <= s->tiny.noise || - s->low.temp == 0 || s->low.temp < s->low.noise || - s->sad.temp < s->sad.noise+16) - return 1; - } - } - if (p->num_fields > 2 && - ps->sad.noise > s->sad.noise && ps->sad.noise > s->sad.temp) - return 4; - return 2 >> (s->sad.noise > s->sad.temp); -} - -#define ITOC(X) (!(X) ? ' ' : (X) + ((X)>9 ? 'a'-10 : '0')) - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - mp_image_t *dmpi = NULL; - struct vf_priv_s *p = vf->priv; - unsigned char **planes, **old_planes; - struct frame_stats *s = &p->stats[p->inframes & 1]; - struct frame_stats *ps = &p->stats[(p->inframes-1) & 1]; - int swapped = 0; - const int flags = mpi->fields; - int breaks, prev; - int show_fields = 0; - int dropped_fields = 0; - double start_time, diff_time; - char prev_chflag = p->chflag; - int keep_rate; - - if (!p->planes[0][0]) init(p, mpi); - - old_planes = p->old_planes; - - if ((mpi->flags & MP_IMGFLAG_DIRECT) && mpi->priv) { - planes = mpi->priv; - mpi->priv = 0; - } else { - planes = p->planes[2 + (++p->temp_idx & 1)]; - my_memcpy_pic(planes[0], - mpi->planes[0] + p->crop_x + p->crop_y * mpi->stride[0], - p->w, p->h, p->stride, mpi->stride[0]); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - my_memcpy_pic(planes[1], - mpi->planes[1] + p->crop_cx + p->crop_cy * mpi->stride[1], - p->cw, p->ch, p->chroma_stride, mpi->stride[1]); - my_memcpy_pic(planes[2], - mpi->planes[2] + p->crop_cx + p->crop_cy * mpi->stride[2], - p->cw, p->ch, p->chroma_stride, mpi->stride[2]); - p->num_copies++; - } - } - - p->old_planes = planes; - p->chflag = ';'; - if (flags & MP_IMGFIELD_ORDERED) { - swapped = !(flags & MP_IMGFIELD_TOP_FIRST); - p->chflag = (flags & MP_IMGFIELD_REPEAT_FIRST ? '|' : - flags & MP_IMGFIELD_TOP_FIRST ? ':' : '.'); - } - p->swapped = swapped; - - start_time = get_time(); - if (p->chflag == '|') { - *s = ppzs; - p->iosync += p->in_inc; - } else if ((p->fast & 1) && prev_chflag == '|') - *s = pprs; - else - diff_fields(p, s, old_planes, planes); - diff_time = get_time(); - p->diff_time += diff_time - start_time; - breaks = p->inframes ? find_breaks(p, s) : 2; - p->inframes++; - keep_rate = 4*p->in_inc == p->out_dec; - - switch (breaks) { - case 0: - case 8: - case 9: - case 10: - if (!keep_rate && p->notout < p->num_fields && p->iosync < 2*p->in_inc) - break; - if (p->notout < p->num_fields) - dropped_fields = -2; - case 4: - if (keep_rate || p->iosync >= -2*p->in_inc) - show_fields = (4<<p->num_fields)-1; - break; - case 3: - if (keep_rate) - show_fields = 2; - else if (p->iosync > 0) { - if (p->notout >= p->num_fields && p->iosync > 2*p->in_inc) { - show_fields = 4; /* prev odd only */ - if (p->num_fields > 1) - show_fields |= 8; /* + prev even */ - } else { - show_fields = 2; /* even only */ - if (p->notout >= p->num_fields) - dropped_fields += p->num_fields; - } - } - break; - case 2: - if (p->iosync <= -3*p->in_inc) { - if (p->notout >= p->num_fields) - dropped_fields = p->num_fields; - break; - } - if (p->num_fields == 1) { - int prevbreak = ps->sad.noise >= 128; - if (p->iosync < 4*p->in_inc) { - show_fields = 3; - dropped_fields = prevbreak; - } else { - show_fields = 4 | (!prevbreak << 3); - if (p->notout < 1 + p->prev_fields) - dropped_fields = -!prevbreak; - } - break; - } - default: - if (keep_rate) - show_fields = 3 << (breaks & 1); - else if (p->notout >= p->num_fields && - p->iosync >= (breaks == 1 ? -p->in_inc : - p->in_inc << (p->num_fields == 1))) { - show_fields = (1 << (2 + p->num_fields)) - (1<<breaks); - } else { - if (p->notout >= p->num_fields) - dropped_fields += p->num_fields + 2 - breaks; - if (breaks == 1) { - if (p->iosync >= 4*p->in_inc) - show_fields = 6; - } else if (p->iosync > -3*p->in_inc) - show_fields = 3; /* odd+even */ - } - break; - } - - show_fields &= 15; - prev = p->prev_fields; - if (breaks < 8) { - if (p->num_fields == 1) - breaks &= ~4; - if (breaks) - p->num_breaks++; - if (breaks == 3) - p->prev_fields = p->num_fields = 1; - else if (breaks) { - p->prev_fields = p->num_fields + (breaks==1) - (breaks==4); - p->num_fields = breaks - (breaks == 4) + (p->chflag == '|'); - } else - p->num_fields += 2; - } else - p->num_fields += 2; - - p->iosync += 4 * p->in_inc; - if (p->chflag == '|') - p->iosync += p->in_inc; - - if (show_fields) { - p->iosync -= p->out_dec; - p->notout = !(show_fields & 1) + !(show_fields & 3); - if (((show_fields & 3) == 3 && - (s->low.noise + s->interlaced_low < (s->num_blocks>>8) || - s->sad.noise < 160)) || - ((show_fields & 12) == 12 && - (ps->low.noise + ps->interlaced_low < (s->num_blocks>>8) || - ps->sad.noise < 160))) { - p->export_count++; - dmpi = vf_get_image(vf->next, mpi->imgfmt, MP_IMGTYPE_EXPORT, - MP_IMGFLAG_PRESERVE|MP_IMGFLAG_READABLE, - p->w, p->h); - if ((show_fields & 3) != 3) planes = old_planes; - dmpi->planes[0] = planes[0]; - dmpi->stride[0] = p->stride; - dmpi->width = mpi->width; - if (mpi->flags & MP_IMGFLAG_PLANAR) { - dmpi->planes[1] = planes[1]; - dmpi->planes[2] = planes[2]; - dmpi->stride[1] = p->chroma_stride; - dmpi->stride[2] = p->chroma_stride; - } - } else { - p->merge_count++; - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - p->w, p->h); - copy_merge_fields(p, dmpi, old_planes, planes, show_fields); - } - p->outframes++; - } else - p->notout += 2; - - if (p->verbose) - mp_msg(MSGT_VFILTER, MSGL_INFO, "%lu %lu: %x %c %c %lu%s%s%c%s\n", - p->inframes, p->outframes, - breaks, breaks<8 && breaks>0 ? (int) p->prev_fields+'0' : ' ', - ITOC(show_fields), - p->num_breaks, 5*p->in_inc == p->out_dec && breaks<8 && - breaks>0 && ((prev&~1)!=2 || prev+p->prev_fields!=5) ? - " ######## bad telecine ########" : "", - dropped_fields ? " ======== dropped ":"", ITOC(dropped_fields), - !show_fields || (show_fields & (show_fields-1)) ? - "" : " @@@@@@@@@@@@@@@@@"); - - p->merge_time += get_time() - diff_time; - pts = vf_detc_adjust_pts(&p->ptsbuf, pts, 0, !show_fields); - return show_fields ? vf_next_put_image(vf, dmpi, pts) : 0; -} - -static int query_format(struct vf_instance *vf, unsigned int fmt) -{ - /* FIXME - support more formats */ - switch (fmt) { - case IMGFMT_YV12: - case IMGFMT_IYUV: - case IMGFMT_I420: - case IMGFMT_411P: - case IMGFMT_422P: - case IMGFMT_444P: - return vf_next_query_format(vf, fmt); - } - return 0; -} - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt) -{ - struct MPOpts *opts = vf->opts; - unsigned long cxm = 0; - unsigned long cym = 0; - struct vf_priv_s *p = vf->priv; - vf_detc_init_pts_buf(&p->ptsbuf); - // rounding: - if(!IMGFMT_IS_RGB(outfmt) && !IMGFMT_IS_BGR(outfmt)){ - switch(outfmt){ - case IMGFMT_444P: - case IMGFMT_Y800: - case IMGFMT_Y8: - break; - case IMGFMT_YVU9: - case IMGFMT_IF09: - cym = 3; - case IMGFMT_411P: - cxm = 3; - break; - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - cym = 1; - default: - cxm = 1; - } - } - p->chroma_swapped = !!(p->crop_y & (cym+1)); - if (p->w) p->w += p->crop_x & cxm; - if (p->h) p->h += p->crop_y & cym; - p->crop_x &= ~cxm; - p->crop_y &= ~cym; - if (!p->w || p->w > width ) p->w = width; - if (!p->h || p->h > height) p->h = height; - if (p->crop_x + p->w > width ) p->crop_x = 0; - if (p->crop_y + p->h > height) p->crop_y = 0; - - if(!opts->screen_size_x && !opts->screen_size_y){ - d_width = d_width * p->w/width; - d_height = d_height * p->h/height; - } - return vf_next_config(vf, p->w, p->h, d_width, d_height, flags, outfmt); -} - -static void uninit(struct vf_instance *vf) -{ - struct vf_priv_s *p = vf->priv; - mp_msg(MSGT_VFILTER, MSGL_INFO, "diff_time: %.3f, merge_time: %.3f, " - "export: %lu, merge: %lu, copy: %lu\n", p->diff_time, p->merge_time, - p->export_count, p->merge_count, p->num_copies); - free(p->memory_allocated); - free(p); -} - -static int vf_open(vf_instance_t *vf, char *args) -{ - struct vf_priv_s *p; - vf->get_image = get_image; - vf->put_image = put_image; - vf->config = config; - vf->query_format = query_format; - vf->uninit = uninit; - vf->default_reqs = VFCAP_ACCEPT_STRIDE; - vf->priv = p = calloc(1, sizeof(struct vf_priv_s)); - p->out_dec = 5; - p->in_inc = 4; - p->thres.noise = 128; - p->thres.even = 128; - p->sad_thres = 64; - p->dint_thres = 4; - p->luma_only = 0; - p->fast = 3; - p->mmx2 = gCpuCaps.hasMMX2; - if (args) { - const char *args_remain = parse_args(p, args); - if (args_remain) { - mp_msg(MSGT_VFILTER, MSGL_FATAL, - "filmdint: unknown suboption: %s\n", args_remain); - return 0; - } - if (p->out_dec < p->in_inc) { - mp_msg(MSGT_VFILTER, MSGL_FATAL, - "filmdint: increasing the frame rate is not supported\n"); - return 0; - } - } - if (p->mmx2 > 2) - p->mmx2 = 0; -#if !HAVE_MMX - p->mmx2 = 0; -#endif - p->thres.odd = p->thres.even; - p->thres.temp = p->thres.noise; - p->diff_time = 0; - p->merge_time = 0; - return 1; -} - -const vf_info_t vf_info_filmdint = { - "Advanced inverse telecine filer", - "filmdint", - "Zoltan Hidvegi", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_fixpts.c b/libmpcodecs/vf_fixpts.c deleted file mode 100644 index 507c41c660..0000000000 --- a/libmpcodecs/vf_fixpts.c +++ /dev/null @@ -1,136 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -struct vf_priv_s { - double current; - double step; - int autostart; - int autostep; - unsigned have_step:1; - unsigned print:1; -}; - -static int put_image(vf_instance_t *vf, mp_image_t *src, double pts) -{ - struct vf_priv_s *p = vf->priv; - - if (p->print) { - if (pts == MP_NOPTS_VALUE) - mp_msg(MSGT_VFILTER, MSGL_INFO, "PTS: undef\n"); - else - mp_msg(MSGT_VFILTER, MSGL_INFO, "PTS: %f\n", pts); - } - if (pts != MP_NOPTS_VALUE && p->autostart != 0) { - p->current = pts; - if (p->autostart > 0) - p->autostart--; - } else if (pts != MP_NOPTS_VALUE && p->autostep > 0) { - p->step = pts - p->current; - p->current = pts; - p->autostep--; - p->have_step = 1; - } else if (p->have_step) { - p->current += p->step; - pts = p->current; - } else { - pts = MP_NOPTS_VALUE; - } - return vf_next_put_image(vf, src, pts); -} - -static void uninit(vf_instance_t *vf) -{ - free(vf->priv); -} - -static int parse_args(struct vf_priv_s *p, const char *args) -{ - int pos; - double num, denom = 1; - int iarg; - - while (*args != 0) { - pos = 0; - if (sscanf(args, "print%n", &pos) == 0 && pos > 0) { - p->print = 1; - } else if (sscanf(args, "fps=%lf%n/%lf%n", &num, &pos, &denom, &pos) >= - 1 && pos > 0) { - p->step = denom / num; - p->have_step = 1; - } else if (sscanf(args, "start=%lf%n", &num, &pos) >= 1 && pos > 0) { - p->current = num; - } else if (sscanf(args, "autostart=%d%n", &iarg, &pos) == 1 && pos > 0) { - p->autostart = iarg; - } else if (sscanf(args, "autofps=%d%n", &iarg, &pos) == 1 && pos > 0) { - p->autostep = iarg; - } else { - mp_msg(MSGT_VFILTER, MSGL_FATAL, - "fixpts: unknown suboption: %s\n", args); - return 0; - } - args += pos; - if (*args == ':') - args++; - } - return 1; -} - -static int open(vf_instance_t *vf, char *args) -{ - struct vf_priv_s *p; - struct vf_priv_s ptmp = { - .current = 0, - .step = 0, - .autostart = 0, - .autostep = 0, - .have_step = 0, - .print = 0, - }; - - if (!parse_args(&ptmp, args == NULL ? "" : args)) - return 0; - - vf->put_image = put_image; - vf->uninit = uninit; - vf->priv = p = malloc(sizeof(struct vf_priv_s)); - *p = ptmp; - p->current = -p->step; - - return 1; -} - -const vf_info_t vf_info_fixpts = { - "Fix presentation timestamps", - "fixpts", - "Nicolas George", - "", - &open, - NULL -}; diff --git a/libmpcodecs/vf_framestep.c b/libmpcodecs/vf_framestep.c deleted file mode 100644 index d6aad9a90a..0000000000 --- a/libmpcodecs/vf_framestep.c +++ /dev/null @@ -1,203 +0,0 @@ -/* - * filter to ouput only 1 every n frame, or only the I (key)frame - * - * The parameters are: - * - * [I] | [i]num - * - * if you call the filter with I (uppercase) as the parameter - * ... -vf framestep=I ... - * then ONLY the keyframes are outputted. - * For DVD it means, generally, one every 15 frames (IBBPBBPBBPBBPBB), for avi it means - * every scene change or every keyint value (see -lavcopts). - * - * if you call the filter with the i (lowercase) - * ... -vf framestep=i ... - * then a I! followed by a cr is printed when a key frame (eg Intra frame) is - * found, leaving the current line of mplayer, where you got the time, in - * seconds, and frame of the key. Use this information to split the AVI. - * - * After the i or alone you can put a positive number and only one frame every - * x (the number you set) is passed on the filter chain, limiting the output - * of the frame. - * - * Example - * ... -vf framestep=i20 ... - * Dump one every 20 frames, printing on the console when a I-Frame is encounter. - * - * ... -vf framestep=25 - * Dump one every 25 frames. - * - * If you call the filter without parameter it does nothing (except using memory - * and resource of your system,. of course). - * - * This filter doesn' t work like the option -sstep seconds. - * - * The -sstep seek to the new position, without decoding all frames but, - * expecially on avi file coded whith mpeg4 (lavc or xvid or divx), the - * seek is not always too much precise. - * - * This filter simply discard the unwanted frames, so you are very precise in - * counting the frame but sometime you use a lot of CPU for nothing. - * - * As usual it depends on what you're doing. - * - * copyright (c) 2003 Daniele Forghieri ( guru@digitalfantasy.it ) - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "config.h" -#include "mp_msg.h" -#include "cpudetect.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -/* Uncomment if you want to print some info on the format */ -// #define DUMP_FORMAT_DATA - -/* Private data */ -struct vf_priv_s { - /* Current frame */ - int frame_cur; - /* Frame output step, 0 = all */ - int frame_step; - /* Only I-Frame (2), print on I-Frame (1) */ - int dump_iframe; -}; - -/* Filter handler */ -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - mp_image_t *dmpi; - struct vf_priv_s *priv; - int skip; - - priv = vf->priv; - - /* Print the 'I' if is a intra frame. The \n advance the current line so you got the - * current file time (in second) and the frame number on the console ;-) - */ - if (priv->dump_iframe) { - if (mpi->pict_type == 1) { - mp_msg(MSGT_VFILTER, MSGL_INFO, "I!\n"); - } - } - - /* decide if frame must be shown */ - if (priv->dump_iframe == 2) { - /* Only key frame */ - skip = mpi->pict_type == 1 ? 0 : 1; - } - else { - /* Only 1 every frame_step */ - skip = 0; - if ((priv->frame_step != 0) && ((priv->frame_cur % priv->frame_step) != 0)) { - skip = 1; - } - } - /* Increment current frame */ - ++priv->frame_cur; - - if (skip == 0) { - /* Get image, export type (we don't modify tghe image) */ - dmpi=vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_EXPORT, 0, - mpi->w, mpi->h); - /* Copy only the pointer ( MP_IMGTYPE_EXPORT ! ) */ - dmpi->planes[0] = mpi->planes[0]; - dmpi->planes[1] = mpi->planes[1]; - dmpi->planes[2] = mpi->planes[2]; - - dmpi->stride[0] = mpi->stride[0]; - dmpi->stride[1] = mpi->stride[1]; - dmpi->stride[2] = mpi->stride[2]; - - dmpi->width = mpi->width; - dmpi->height = mpi->height; - - /* Chain to next filter / output ... */ - return vf_next_put_image(vf, dmpi, pts); - } - - /* Skip the frame */ - return 0; -} - -static void uninit(struct vf_instance *vf) -{ - /* Free private data */ - free(vf->priv); -} - -/* Main entry funct for the filter */ -static int vf_open(vf_instance_t *vf, char *args) -{ - struct vf_priv_s *p; - - vf->put_image = put_image; - vf->uninit = uninit; - vf->default_reqs = VFCAP_ACCEPT_STRIDE; - vf->priv = p = calloc(1, sizeof(struct vf_priv_s)); - if (p == NULL) { - return 0; - } - - if (args != NULL) { -#ifdef DUMP_FORMAT_DATA - if (*args == 'd') { - p->dump_iframe = 3; - } - else -#endif - if (*args == 'I') { - /* Dump only KEY (ie INTRA) frame */ - p->dump_iframe = 2; - } - else { - if (*args == 'i') { - /* Print a 'I!' when a i-frame is encounter */ - p->dump_iframe = 1; - ++args; - } - - if (*args != '\0') { - p->frame_step = atoi(args); - if (p->frame_step <= 0) { - mp_tmsg(MSGT_VFILTER, MSGL_WARN, "[VF_FRAMESTEP] Error parsing argument.\n"); - return 0; - } - } - } - } - return 1; -} - -const vf_info_t vf_info_framestep = { - "Dump one every n / key frames", - "framestep", - "Daniele Forghieri", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_fspp.c b/libmpcodecs/vf_fspp.c deleted file mode 100644 index 59d731c529..0000000000 --- a/libmpcodecs/vf_fspp.c +++ /dev/null @@ -1,2112 +0,0 @@ -/* - * Copyright (C) 2003 Michael Niedermayer <michaelni@gmx.at> - * Copyright (C) 2005 Nikolaj Poroshin <porosh3@psu.ru> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -/* - * This implementation is based on an algorithm described in - * "Aria Nosratinia Embedded Post-Processing for - * Enhancement of Compressed Images (1999)" - * (http://citeseer.nj.nec.com/nosratinia99embedded.html) - * Futher, with splitting (i)dct into hor/ver passes, one of them can be - * performed once per block, not pixel. This allows for much better speed. - */ - -/* - Heavily optimized version of SPP filter by Nikolaj - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <math.h> - -#include <libavutil/intreadwrite.h> -#include <libavutil/mem.h> -#include <libavcodec/avcodec.h> - -#include "config.h" - -#include "mp_msg.h" -#include "cpudetect.h" -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" -#include "libvo/fastmemcpy.h" -#include "mangle.h" - -typedef short DCTELEM; - -//===========================================================================// -#define BLOCKSZ 12 - -static const short custom_threshold[64]= -// values (296) can't be too high -// -it causes too big quant dependence -// or maybe overflow(check), which results in some flashing -{ 71, 296, 295, 237, 71, 40, 38, 19, - 245, 193, 185, 121, 102, 73, 53, 27, - 158, 129, 141, 107, 97, 73, 50, 26, - 102, 116, 109, 98, 82, 66, 45, 23, - 71, 94, 95, 81, 70, 56, 38, 20, - 56, 77, 74, 66, 56, 44, 30, 15, - 38, 53, 50, 45, 38, 30, 21, 11, - 20, 27, 26, 23, 20, 15, 11, 5 -}; - -static const uint8_t __attribute__((aligned(32))) dither[8][8]={ - { 0, 48, 12, 60, 3, 51, 15, 63, }, - { 32, 16, 44, 28, 35, 19, 47, 31, }, - { 8, 56, 4, 52, 11, 59, 7, 55, }, - { 40, 24, 36, 20, 43, 27, 39, 23, }, - { 2, 50, 14, 62, 1, 49, 13, 61, }, - { 34, 18, 46, 30, 33, 17, 45, 29, }, - { 10, 58, 6, 54, 9, 57, 5, 53, }, - { 42, 26, 38, 22, 41, 25, 37, 21, }, -}; - -struct vf_priv_s { //align 16 ! - uint64_t threshold_mtx_noq[8*2]; - uint64_t threshold_mtx[8*2];//used in both C & MMX (& later SSE2) versions - - int log2_count; - int temp_stride; - int qp; - int mpeg2; - int prev_q; - uint8_t *src; - int16_t *temp; - int bframes; - char *non_b_qp; -}; - - -#if !HAVE_MMX - -//This func reads from 1 slice, 1 and clears 0 & 1 -static void store_slice_c(uint8_t *dst, int16_t *src, int dst_stride, int src_stride, int width, int height, int log2_scale) -{int y, x; -#define STORE(pos) \ - temp= (src[x + pos] + (d[pos]>>log2_scale))>>(6-log2_scale); \ - src[x + pos]=src[x + pos - 8*src_stride]=0; \ - if(temp & 0x100) temp= ~(temp>>31); \ - dst[x + pos]= temp; - - for(y=0; y<height; y++){ - const uint8_t *d= dither[y]; - for(x=0; x<width; x+=8){ - int temp; - STORE(0); - STORE(1); - STORE(2); - STORE(3); - STORE(4); - STORE(5); - STORE(6); - STORE(7); - } - src+=src_stride; - dst+=dst_stride; - } -} - -//This func reads from 2 slices, 0 & 2 and clears 2-nd -static void store_slice2_c(uint8_t *dst, int16_t *src, int dst_stride, int src_stride, int width, int height, int log2_scale) -{int y, x; -#define STORE2(pos) \ - temp= (src[x + pos] + src[x + pos + 16*src_stride] + (d[pos]>>log2_scale))>>(6-log2_scale); \ - src[x + pos + 16*src_stride]=0; \ - if(temp & 0x100) temp= ~(temp>>31); \ - dst[x + pos]= temp; - - for(y=0; y<height; y++){ - const uint8_t *d= dither[y]; - for(x=0; x<width; x+=8){ - int temp; - STORE2(0); - STORE2(1); - STORE2(2); - STORE2(3); - STORE2(4); - STORE2(5); - STORE2(6); - STORE2(7); - } - src+=src_stride; - dst+=dst_stride; - } -} - -static void mul_thrmat_c(struct vf_priv_s *p,int q) -{ - int a; - for(a=0;a<64;a++) - ((short*)p->threshold_mtx)[a]=q * ((short*)p->threshold_mtx_noq)[a];//ints faster in C -} - -static void column_fidct_c(int16_t* thr_adr, DCTELEM *data, DCTELEM *output, int cnt); -static void row_idct_c(DCTELEM* workspace, - int16_t* output_adr, int output_stride, int cnt); -static void row_fdct_c(DCTELEM *data, const uint8_t *pixels, int line_size, int cnt); - -//this is rather ugly, but there is no need for function pointers -#define store_slice_s store_slice_c -#define store_slice2_s store_slice2_c -#define mul_thrmat_s mul_thrmat_c -#define column_fidct_s column_fidct_c -#define row_idct_s row_idct_c -#define row_fdct_s row_fdct_c - -#else /* HAVE_MMX */ - -//This func reads from 1 slice, 1 and clears 0 & 1 -static void store_slice_mmx(uint8_t *dst, int16_t *src, long dst_stride, long src_stride, long width, long height, long log2_scale) -{ - const uint8_t *od=&dither[0][0]; - const uint8_t *end=&dither[height][0]; - width = (width+7)&~7; - dst_stride-=width; - //src_stride=(src_stride-width)*2; - __asm__ volatile( - "mov %5, %%"REG_d" \n\t" - "mov %6, %%"REG_S" \n\t" - "mov %7, %%"REG_D" \n\t" - "mov %1, %%"REG_a" \n\t" - "movd %%"REG_d", %%mm5 \n\t" - "xor $-1, %%"REG_d" \n\t" - "mov %%"REG_a", %%"REG_c" \n\t" - "add $7, %%"REG_d" \n\t" - "neg %%"REG_a" \n\t" - "sub %0, %%"REG_c" \n\t" - "add %%"REG_c", %%"REG_c" \n\t" - "movd %%"REG_d", %%mm2 \n\t" - "mov %%"REG_c", %1 \n\t" - "mov %2, %%"REG_d" \n\t" - "shl $4, %%"REG_a" \n\t" - - "2: \n\t" - "movq (%%"REG_d"), %%mm3 \n\t" - "movq %%mm3, %%mm4 \n\t" - "pxor %%mm7, %%mm7 \n\t" - "punpcklbw %%mm7, %%mm3 \n\t" - "punpckhbw %%mm7, %%mm4 \n\t" - "mov %0, %%"REG_c" \n\t" - "psraw %%mm5, %%mm3 \n\t" - "psraw %%mm5, %%mm4 \n\t" - "1: \n\t" - "movq %%mm7, (%%"REG_S",%%"REG_a",) \n\t" - "movq (%%"REG_S"), %%mm0 \n\t" - "movq 8(%%"REG_S"), %%mm1 \n\t" - - "movq %%mm7, 8(%%"REG_S",%%"REG_a",) \n\t" - "paddw %%mm3, %%mm0 \n\t" - "paddw %%mm4, %%mm1 \n\t" - - "movq %%mm7, (%%"REG_S") \n\t" - "psraw %%mm2, %%mm0 \n\t" - "psraw %%mm2, %%mm1 \n\t" - - "movq %%mm7, 8(%%"REG_S") \n\t" - "packuswb %%mm1, %%mm0 \n\t" - "add $16, %%"REG_S" \n\t" - - "movq %%mm0, (%%"REG_D") \n\t" - "add $8, %%"REG_D" \n\t" - "sub $8, %%"REG_c" \n\t" - "jg 1b \n\t" - "add %1, %%"REG_S" \n\t" - "add $8, %%"REG_d" \n\t" - "add %3, %%"REG_D" \n\t" - "cmp %4, %%"REG_d" \n\t" - "jl 2b \n\t" - - : - : "m" (width), "m" (src_stride), "erm" (od), "m" (dst_stride), "erm" (end), - "m" (log2_scale), "m" (src), "m" (dst) //input - : "%"REG_a, "%"REG_c, "%"REG_d, "%"REG_S, "%"REG_D - ); -} - -//This func reads from 2 slices, 0 & 2 and clears 2-nd -static void store_slice2_mmx(uint8_t *dst, int16_t *src, long dst_stride, long src_stride, long width, long height, long log2_scale) -{ - const uint8_t *od=&dither[0][0]; - const uint8_t *end=&dither[height][0]; - width = (width+7)&~7; - dst_stride-=width; - //src_stride=(src_stride-width)*2; - __asm__ volatile( - "mov %5, %%"REG_d" \n\t" - "mov %6, %%"REG_S" \n\t" - "mov %7, %%"REG_D" \n\t" - "mov %1, %%"REG_a" \n\t" - "movd %%"REG_d", %%mm5 \n\t" - "xor $-1, %%"REG_d" \n\t" - "mov %%"REG_a", %%"REG_c" \n\t" - "add $7, %%"REG_d" \n\t" - "sub %0, %%"REG_c" \n\t" - "add %%"REG_c", %%"REG_c" \n\t" - "movd %%"REG_d", %%mm2 \n\t" - "mov %%"REG_c", %1 \n\t" - "mov %2, %%"REG_d" \n\t" - "shl $5, %%"REG_a" \n\t" - - "2: \n\t" - "movq (%%"REG_d"), %%mm3 \n\t" - "movq %%mm3, %%mm4 \n\t" - "pxor %%mm7, %%mm7 \n\t" - "punpcklbw %%mm7, %%mm3 \n\t" - "punpckhbw %%mm7, %%mm4 \n\t" - "mov %0, %%"REG_c" \n\t" - "psraw %%mm5, %%mm3 \n\t" - "psraw %%mm5, %%mm4 \n\t" - "1: \n\t" - "movq (%%"REG_S"), %%mm0 \n\t" - "movq 8(%%"REG_S"), %%mm1 \n\t" - "paddw %%mm3, %%mm0 \n\t" - - "paddw (%%"REG_S",%%"REG_a",), %%mm0 \n\t" - "paddw %%mm4, %%mm1 \n\t" - "movq 8(%%"REG_S",%%"REG_a",), %%mm6 \n\t" - - "movq %%mm7, (%%"REG_S",%%"REG_a",) \n\t" - "psraw %%mm2, %%mm0 \n\t" - "paddw %%mm6, %%mm1 \n\t" - - "movq %%mm7, 8(%%"REG_S",%%"REG_a",) \n\t" - "psraw %%mm2, %%mm1 \n\t" - "packuswb %%mm1, %%mm0 \n\t" - - "movq %%mm0, (%%"REG_D") \n\t" - "add $16, %%"REG_S" \n\t" - "add $8, %%"REG_D" \n\t" - "sub $8, %%"REG_c" \n\t" - "jg 1b \n\t" - "add %1, %%"REG_S" \n\t" - "add $8, %%"REG_d" \n\t" - "add %3, %%"REG_D" \n\t" - "cmp %4, %%"REG_d" \n\t" - "jl 2b \n\t" - - : - : "m" (width), "m" (src_stride), "erm" (od), "m" (dst_stride), "erm" (end), - "m" (log2_scale), "m" (src), "m" (dst) //input - : "%"REG_a, "%"REG_c, "%"REG_d, "%"REG_D, "%"REG_S - ); -} - -static void mul_thrmat_mmx(struct vf_priv_s *p, int q) -{ - uint64_t *adr=&p->threshold_mtx_noq[0]; - __asm__ volatile( - "movd %0, %%mm7 \n\t" - "add $8*8*2, %%"REG_D" \n\t" - "movq 0*8(%%"REG_S"), %%mm0 \n\t" - "punpcklwd %%mm7, %%mm7 \n\t" - "movq 1*8(%%"REG_S"), %%mm1 \n\t" - "punpckldq %%mm7, %%mm7 \n\t" - "pmullw %%mm7, %%mm0 \n\t" - - "movq 2*8(%%"REG_S"), %%mm2 \n\t" - "pmullw %%mm7, %%mm1 \n\t" - - "movq 3*8(%%"REG_S"), %%mm3 \n\t" - "pmullw %%mm7, %%mm2 \n\t" - - "movq %%mm0, 0*8(%%"REG_D") \n\t" - "movq 4*8(%%"REG_S"), %%mm4 \n\t" - "pmullw %%mm7, %%mm3 \n\t" - - "movq %%mm1, 1*8(%%"REG_D") \n\t" - "movq 5*8(%%"REG_S"), %%mm5 \n\t" - "pmullw %%mm7, %%mm4 \n\t" - - "movq %%mm2, 2*8(%%"REG_D") \n\t" - "movq 6*8(%%"REG_S"), %%mm6 \n\t" - "pmullw %%mm7, %%mm5 \n\t" - - "movq %%mm3, 3*8(%%"REG_D") \n\t" - "movq 7*8+0*8(%%"REG_S"), %%mm0 \n\t" - "pmullw %%mm7, %%mm6 \n\t" - - "movq %%mm4, 4*8(%%"REG_D") \n\t" - "movq 7*8+1*8(%%"REG_S"), %%mm1 \n\t" - "pmullw %%mm7, %%mm0 \n\t" - - "movq %%mm5, 5*8(%%"REG_D") \n\t" - "movq 7*8+2*8(%%"REG_S"), %%mm2 \n\t" - "pmullw %%mm7, %%mm1 \n\t" - - "movq %%mm6, 6*8(%%"REG_D") \n\t" - "movq 7*8+3*8(%%"REG_S"), %%mm3 \n\t" - "pmullw %%mm7, %%mm2 \n\t" - - "movq %%mm0, 7*8+0*8(%%"REG_D") \n\t" - "movq 7*8+4*8(%%"REG_S"), %%mm4 \n\t" - "pmullw %%mm7, %%mm3 \n\t" - - "movq %%mm1, 7*8+1*8(%%"REG_D") \n\t" - "movq 7*8+5*8(%%"REG_S"), %%mm5 \n\t" - "pmullw %%mm7, %%mm4 \n\t" - - "movq %%mm2, 7*8+2*8(%%"REG_D") \n\t" - "movq 7*8+6*8(%%"REG_S"), %%mm6 \n\t" - "pmullw %%mm7, %%mm5 \n\t" - - "movq %%mm3, 7*8+3*8(%%"REG_D") \n\t" - "movq 14*8+0*8(%%"REG_S"), %%mm0 \n\t" - "pmullw %%mm7, %%mm6 \n\t" - - "movq %%mm4, 7*8+4*8(%%"REG_D") \n\t" - "movq 14*8+1*8(%%"REG_S"), %%mm1 \n\t" - "pmullw %%mm7, %%mm0 \n\t" - - "movq %%mm5, 7*8+5*8(%%"REG_D") \n\t" - "pmullw %%mm7, %%mm1 \n\t" - - "movq %%mm6, 7*8+6*8(%%"REG_D") \n\t" - "movq %%mm0, 14*8+0*8(%%"REG_D") \n\t" - "movq %%mm1, 14*8+1*8(%%"REG_D") \n\t" - - : "+g" (q), "+S" (adr), "+D" (adr) - : - ); -} - -static void column_fidct_mmx(int16_t* thr_adr, DCTELEM *data, DCTELEM *output, int cnt); -static void row_idct_mmx(DCTELEM* workspace, - int16_t* output_adr, int output_stride, int cnt); -static void row_fdct_mmx(DCTELEM *data, const uint8_t *pixels, int line_size, int cnt); - -#define store_slice_s store_slice_mmx -#define store_slice2_s store_slice2_mmx -#define mul_thrmat_s mul_thrmat_mmx -#define column_fidct_s column_fidct_mmx -#define row_idct_s row_idct_mmx -#define row_fdct_s row_fdct_mmx -#endif // HAVE_MMX - -static void filter(struct vf_priv_s *p, uint8_t *dst, uint8_t *src, - int dst_stride, int src_stride, - int width, int height, - uint8_t *qp_store, int qp_stride, int is_luma) -{ - int x, x0, y, es, qy, t; - const int stride= is_luma ? p->temp_stride : (width+16);//((width+16+15)&(~15)) - const int step=6-p->log2_count; - const int qps= 3 + is_luma; - int32_t __attribute__((aligned(32))) block_align[4*8*BLOCKSZ+ 4*8*BLOCKSZ]; - DCTELEM *block= (DCTELEM *)block_align; - DCTELEM *block3=(DCTELEM *)(block_align+4*8*BLOCKSZ); - - memset(block3, 0, 4*8*BLOCKSZ); - - //p->src=src-src_stride*8-8;//! - if (!src || !dst) return; // HACK avoid crash for Y8 colourspace - for(y=0; y<height; y++){ - int index= 8 + 8*stride + y*stride; - fast_memcpy(p->src + index, src + y*src_stride, width);//this line can be avoided by using DR & user fr.buffers - for(x=0; x<8; x++){ - p->src[index - x - 1]= p->src[index + x ]; - p->src[index + width + x ]= p->src[index + width - x - 1]; - } - } - for(y=0; y<8; y++){ - fast_memcpy(p->src + ( 7-y)*stride, p->src + ( y+8)*stride, stride); - fast_memcpy(p->src + (height+8+y)*stride, p->src + (height-y+7)*stride, stride); - } - //FIXME (try edge emu) - - for(y=8; y<24; y++) - memset(p->temp+ 8 +y*stride, 0,width*sizeof(int16_t)); - - for(y=step; y<height+8; y+=step){ //step= 1,2 - qy=y-4; - if (qy>height-1) qy=height-1; - if (qy<0) qy=0; - qy=(qy>>qps)*qp_stride; - row_fdct_s(block, p->src + y*stride +2-(y&1), stride, 2); - for(x0=0; x0<width+8-8*(BLOCKSZ-1); x0+=8*(BLOCKSZ-1)){ - row_fdct_s(block+8*8, p->src + y*stride+8+x0 +2-(y&1), stride, 2*(BLOCKSZ-1)); - if(p->qp) - column_fidct_s((int16_t*)(&p->threshold_mtx[0]), block+0*8, block3+0*8, 8*(BLOCKSZ-1)); //yes, this is a HOTSPOT - else - for (x=0; x<8*(BLOCKSZ-1); x+=8) { - t=x+x0-2; //correct t=x+x0-2-(y&1), but its the same - if (t<0) t=0;//t always < width-2 - t=qp_store[qy+(t>>qps)]; - t=norm_qscale(t, p->mpeg2); - if (t!=p->prev_q) p->prev_q=t, mul_thrmat_s(p, t); - column_fidct_s((int16_t*)(&p->threshold_mtx[0]), block+x*8, block3+x*8, 8); //yes, this is a HOTSPOT - } - row_idct_s(block3+0*8, p->temp + (y&15)*stride+x0+2-(y&1), stride, 2*(BLOCKSZ-1)); - memmove(block, block+(BLOCKSZ-1)*64, 8*8*sizeof(DCTELEM)); //cycling - memmove(block3, block3+(BLOCKSZ-1)*64, 6*8*sizeof(DCTELEM)); - } - // - es=width+8-x0; // 8, ... - if (es>8) - row_fdct_s(block+8*8, p->src + y*stride+8+x0 +2-(y&1), stride, (es-4)>>2); - column_fidct_s((int16_t*)(&p->threshold_mtx[0]), block, block3, es&(~1)); - row_idct_s(block3+0*8, p->temp + (y&15)*stride+x0+2-(y&1), stride, es>>2); - {const int y1=y-8+step;//l5-7 l4-6 - if (!(y1&7) && y1) { - if (y1&8) store_slice_s(dst + (y1-8)*dst_stride, p->temp+ 8 +8*stride, - dst_stride, stride, width, 8, 5-p->log2_count); - else store_slice2_s(dst + (y1-8)*dst_stride, p->temp+ 8 +0*stride, - dst_stride, stride, width, 8, 5-p->log2_count); - } } - } - - if (y&7) { // == height & 7 - if (y&8) store_slice_s(dst + ((y-8)&~7)*dst_stride, p->temp+ 8 +8*stride, - dst_stride, stride, width, y&7, 5-p->log2_count); - else store_slice2_s(dst + ((y-8)&~7)*dst_stride, p->temp+ 8 +0*stride, - dst_stride, stride, width, y&7, 5-p->log2_count); - } -} - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt) -{ - int h= (height+16+15)&(~15); - - vf->priv->temp_stride= (width+16+15)&(~15); - vf->priv->temp= (int16_t*)av_mallocz(vf->priv->temp_stride*3*8*sizeof(int16_t)); - //this can also be avoided, see above - vf->priv->src = (uint8_t*)av_malloc(vf->priv->temp_stride*h*sizeof(uint8_t)); - - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static void get_image(struct vf_instance *vf, mp_image_t *mpi) -{ - if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change - // ok, we can do pp in-place (or pp disabled): - vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, - mpi->type, mpi->flags, mpi->width, mpi->height); - mpi->planes[0]=vf->dmpi->planes[0]; - mpi->stride[0]=vf->dmpi->stride[0]; - mpi->width=vf->dmpi->width; - if(mpi->flags&MP_IMGFLAG_PLANAR){ - mpi->planes[1]=vf->dmpi->planes[1]; - mpi->planes[2]=vf->dmpi->planes[2]; - mpi->stride[1]=vf->dmpi->stride[1]; - mpi->stride[2]=vf->dmpi->stride[2]; - } - mpi->flags|=MP_IMGFLAG_DIRECT; -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - mp_image_t *dmpi; - if(!(mpi->flags&MP_IMGFLAG_DIRECT)){ - // no DR, so get a new image! hope we'll get DR buffer: - dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, - MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE, - mpi->width,mpi->height); - vf_clone_mpi_attributes(dmpi, mpi); - }else{ - dmpi=vf->dmpi; - } - - vf->priv->mpeg2= mpi->qscale_type; - if(mpi->pict_type != 3 && mpi->qscale && !vf->priv->qp){ - int w = mpi->qstride; - int h = (mpi->h + 15) >> 4; - if (!w) { - w = (mpi->w + 15) >> 4; - h = 1; - } - if(!vf->priv->non_b_qp) - vf->priv->non_b_qp= malloc(w*h); - fast_memcpy(vf->priv->non_b_qp, mpi->qscale, w*h); - } - if(vf->priv->log2_count || !(mpi->flags&MP_IMGFLAG_DIRECT)){ - char *qp_tab= vf->priv->non_b_qp; - if(vf->priv->bframes || !qp_tab) - qp_tab= mpi->qscale; - - if(qp_tab || vf->priv->qp){ - filter(vf->priv, dmpi->planes[0], mpi->planes[0], dmpi->stride[0], mpi->stride[0], - mpi->w, mpi->h, qp_tab, mpi->qstride, 1); - filter(vf->priv, dmpi->planes[1], mpi->planes[1], dmpi->stride[1], mpi->stride[1], - mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, qp_tab, mpi->qstride, 0); - filter(vf->priv, dmpi->planes[2], mpi->planes[2], dmpi->stride[2], mpi->stride[2], - mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, qp_tab, mpi->qstride, 0); - }else{ - memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h, dmpi->stride[0], mpi->stride[0]); - memcpy_pic(dmpi->planes[1], mpi->planes[1], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[1], mpi->stride[1]); - memcpy_pic(dmpi->planes[2], mpi->planes[2], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[2], mpi->stride[2]); - } - } - -#if HAVE_MMX - if(gCpuCaps.hasMMX) __asm__ volatile ("emms\n\t"); -#endif -#if HAVE_MMX2 - if(gCpuCaps.hasMMX2) __asm__ volatile ("sfence\n\t"); -#endif - return vf_next_put_image(vf,dmpi, pts); -} - -static void uninit(struct vf_instance *vf) -{ - if(!vf->priv) return; - - av_free(vf->priv->temp); - vf->priv->temp= NULL; - av_free(vf->priv->src); - vf->priv->src= NULL; - //free(vf->priv->avctx); - //vf->priv->avctx= NULL; - free(vf->priv->non_b_qp); - vf->priv->non_b_qp= NULL; - - av_free(vf->priv); - vf->priv=NULL; -} - -//===========================================================================// - -static int query_format(struct vf_instance *vf, unsigned int fmt) -{ - switch(fmt){ - case IMGFMT_YVU9: - case IMGFMT_IF09: - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_CLPL: - case IMGFMT_Y800: - case IMGFMT_Y8: - case IMGFMT_444P: - case IMGFMT_422P: - case IMGFMT_411P: - return vf_next_query_format(vf,fmt); - } - return 0; -} - -static int control(struct vf_instance *vf, int request, void* data) -{ - switch(request){ - case VFCTRL_QUERY_MAX_PP_LEVEL: - return 5; - case VFCTRL_SET_PP_LEVEL: - vf->priv->log2_count= *((unsigned int*)data); - if (vf->priv->log2_count < 4) vf->priv->log2_count=4; - return CONTROL_TRUE; - } - return vf_next_control(vf,request,data); -} - -static int vf_open(vf_instance_t *vf, char *args) -{ - int i=0, bias; - int custom_threshold_m[64]; - int log2c=-1; - - vf->config=config; - vf->put_image=put_image; - vf->get_image=get_image; - vf->query_format=query_format; - vf->uninit=uninit; - vf->control= control; - vf->priv=av_mallocz(sizeof(struct vf_priv_s));//assumes align 16 ! - - //vf->priv->avctx= avcodec_alloc_context(); - //ff_dsputil_init(&vf->priv->dsp, vf->priv->avctx); - - vf->priv->log2_count= 4; - vf->priv->bframes = 0; - - if (args) sscanf(args, "%d:%d:%d:%d", &log2c, &vf->priv->qp, &i, &vf->priv->bframes); - - if( log2c >=4 && log2c <=5 ) - vf->priv->log2_count = log2c; - else if( log2c >= 6 ) - vf->priv->log2_count = 5; - - if(vf->priv->qp < 0) - vf->priv->qp = 0; - - if (i < -15) i = -15; - if (i > 32) i = 32; - - bias= (1<<4)+i; //regulable - vf->priv->prev_q=0; - // - for(i=0;i<64;i++) //FIXME: tune custom_threshold[] and remove this ! - custom_threshold_m[i]=(int)(custom_threshold[i]*(bias/71.)+ 0.5); - for(i=0;i<8;i++){ - vf->priv->threshold_mtx_noq[2*i]=(uint64_t)custom_threshold_m[i*8+2] - |(((uint64_t)custom_threshold_m[i*8+6])<<16) - |(((uint64_t)custom_threshold_m[i*8+0])<<32) - |(((uint64_t)custom_threshold_m[i*8+4])<<48); - vf->priv->threshold_mtx_noq[2*i+1]=(uint64_t)custom_threshold_m[i*8+5] - |(((uint64_t)custom_threshold_m[i*8+3])<<16) - |(((uint64_t)custom_threshold_m[i*8+1])<<32) - |(((uint64_t)custom_threshold_m[i*8+7])<<48); - } - - if (vf->priv->qp) vf->priv->prev_q=vf->priv->qp, mul_thrmat_s(vf->priv, vf->priv->qp); - - return 1; -} - -const vf_info_t vf_info_fspp = { - "fast simple postprocess", - "fspp", - "Michael Niedermayer, Nikolaj Poroshin", - "", - vf_open, - NULL -}; - -//==================================================================== -//Specific spp's dct, idct and threshold functions -//I'd prefer to have them in the separate file. - -//#define MANGLE(a) #a - -//typedef int16_t DCTELEM; //! only int16_t - -#define DCTSIZE 8 -#define DCTSIZE_S "8" - -#define FIX(x,s) ((int) ((x) * (1<<s) + 0.5)&0xffff) -#define C64(x) ((uint64_t)((x)|(x)<<16))<<32 | (uint64_t)(x) | (uint64_t)(x)<<16 -#define FIX64(x,s) C64(FIX(x,s)) - -#define MULTIPLY16H(x,k) (((x)*(k))>>16) -#define THRESHOLD(r,x,t) if(((unsigned)((x)+t))>t*2) r=(x);else r=0; -#define DESCALE(x,n) (((x) + (1 << ((n)-1))) >> n) - -#if HAVE_MMX - -DECLARE_ASM_CONST(8, uint64_t, MM_FIX_0_382683433)=FIX64(0.382683433, 14); -DECLARE_ASM_CONST(8, uint64_t, MM_FIX_0_541196100)=FIX64(0.541196100, 14); -DECLARE_ASM_CONST(8, uint64_t, MM_FIX_0_707106781)=FIX64(0.707106781, 14); -DECLARE_ASM_CONST(8, uint64_t, MM_FIX_1_306562965)=FIX64(1.306562965, 14); - -DECLARE_ASM_CONST(8, uint64_t, MM_FIX_1_414213562_A)=FIX64(1.414213562, 14); - -DECLARE_ASM_CONST(8, uint64_t, MM_FIX_1_847759065)=FIX64(1.847759065, 13); -DECLARE_ASM_CONST(8, uint64_t, MM_FIX_2_613125930)=FIX64(-2.613125930, 13); //- -DECLARE_ASM_CONST(8, uint64_t, MM_FIX_1_414213562)=FIX64(1.414213562, 13); -DECLARE_ASM_CONST(8, uint64_t, MM_FIX_1_082392200)=FIX64(1.082392200, 13); -//for t3,t5,t7 == 0 shortcut -DECLARE_ASM_CONST(8, uint64_t, MM_FIX_0_847759065)=FIX64(0.847759065, 14); -DECLARE_ASM_CONST(8, uint64_t, MM_FIX_0_566454497)=FIX64(0.566454497, 14); -DECLARE_ASM_CONST(8, uint64_t, MM_FIX_0_198912367)=FIX64(0.198912367, 14); - -DECLARE_ASM_CONST(8, uint64_t, MM_DESCALE_RND)=C64(4); -DECLARE_ASM_CONST(8, uint64_t, MM_2)=C64(2); - -#else /* !HAVE_MMX */ - -typedef int32_t int_simd16_t; -static const int16_t FIX_0_382683433=FIX(0.382683433, 14); -static const int16_t FIX_0_541196100=FIX(0.541196100, 14); -static const int16_t FIX_0_707106781=FIX(0.707106781, 14); -static const int16_t FIX_1_306562965=FIX(1.306562965, 14); -static const int16_t FIX_1_414213562_A=FIX(1.414213562, 14); -static const int16_t FIX_1_847759065=FIX(1.847759065, 13); -static const int16_t FIX_2_613125930=FIX(-2.613125930, 13); //- -static const int16_t FIX_1_414213562=FIX(1.414213562, 13); -static const int16_t FIX_1_082392200=FIX(1.082392200, 13); - -#endif - -#if !HAVE_MMX - -static void column_fidct_c(int16_t* thr_adr, DCTELEM *data, DCTELEM *output, int cnt) -{ - int_simd16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - int_simd16_t tmp10, tmp11, tmp12, tmp13; - int_simd16_t z1,z2,z3,z4,z5, z10, z11, z12, z13; - int_simd16_t d0, d1, d2, d3, d4, d5, d6, d7; - - DCTELEM* dataptr; - DCTELEM* wsptr; - int16_t *threshold; - int ctr; - - dataptr = data; - wsptr = output; - - for (; cnt > 0; cnt-=2) { //start positions - threshold=(int16_t*)thr_adr;//threshold_mtx - for (ctr = DCTSIZE; ctr > 0; ctr--) { - // Process columns from input, add to output. - tmp0 = dataptr[DCTSIZE*0] + dataptr[DCTSIZE*7]; - tmp7 = dataptr[DCTSIZE*0] - dataptr[DCTSIZE*7]; - - tmp1 = dataptr[DCTSIZE*1] + dataptr[DCTSIZE*6]; - tmp6 = dataptr[DCTSIZE*1] - dataptr[DCTSIZE*6]; - - tmp2 = dataptr[DCTSIZE*2] + dataptr[DCTSIZE*5]; - tmp5 = dataptr[DCTSIZE*2] - dataptr[DCTSIZE*5]; - - tmp3 = dataptr[DCTSIZE*3] + dataptr[DCTSIZE*4]; - tmp4 = dataptr[DCTSIZE*3] - dataptr[DCTSIZE*4]; - - // Even part of FDCT - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - d0 = tmp10 + tmp11; - d4 = tmp10 - tmp11; - - z1 = MULTIPLY16H((tmp12 + tmp13) <<2, FIX_0_707106781); - d2 = tmp13 + z1; - d6 = tmp13 - z1; - - // Even part of IDCT - - THRESHOLD(tmp0, d0, threshold[0*8]); - THRESHOLD(tmp1, d2, threshold[2*8]); - THRESHOLD(tmp2, d4, threshold[4*8]); - THRESHOLD(tmp3, d6, threshold[6*8]); - tmp0+=2; - tmp10 = (tmp0 + tmp2)>>2; - tmp11 = (tmp0 - tmp2)>>2; - - tmp13 = (tmp1 + tmp3)>>2; //+2 ! (psnr decides) - tmp12 = MULTIPLY16H((tmp1 - tmp3), FIX_1_414213562_A) - tmp13; //<<2 - - tmp0 = tmp10 + tmp13; //->temps - tmp3 = tmp10 - tmp13; //->temps - tmp1 = tmp11 + tmp12; //->temps - tmp2 = tmp11 - tmp12; //->temps - - // Odd part of FDCT - - tmp10 = tmp4 + tmp5; - tmp11 = tmp5 + tmp6; - tmp12 = tmp6 + tmp7; - - z5 = MULTIPLY16H((tmp10 - tmp12)<<2, FIX_0_382683433); - z2 = MULTIPLY16H(tmp10 <<2, FIX_0_541196100) + z5; - z4 = MULTIPLY16H(tmp12 <<2, FIX_1_306562965) + z5; - z3 = MULTIPLY16H(tmp11 <<2, FIX_0_707106781); - - z11 = tmp7 + z3; - z13 = tmp7 - z3; - - d5 = z13 + z2; - d3 = z13 - z2; - d1 = z11 + z4; - d7 = z11 - z4; - - // Odd part of IDCT - - THRESHOLD(tmp4, d1, threshold[1*8]); - THRESHOLD(tmp5, d3, threshold[3*8]); - THRESHOLD(tmp6, d5, threshold[5*8]); - THRESHOLD(tmp7, d7, threshold[7*8]); - - //Simd version uses here a shortcut for the tmp5,tmp6,tmp7 == 0 - z13 = tmp6 + tmp5; - z10 = (tmp6 - tmp5)<<1; - z11 = tmp4 + tmp7; - z12 = (tmp4 - tmp7)<<1; - - tmp7 = (z11 + z13)>>2; //+2 ! - tmp11 = MULTIPLY16H((z11 - z13)<<1, FIX_1_414213562); - z5 = MULTIPLY16H(z10 + z12, FIX_1_847759065); - tmp10 = MULTIPLY16H(z12, FIX_1_082392200) - z5; - tmp12 = MULTIPLY16H(z10, FIX_2_613125930) + z5; // - !! - - tmp6 = tmp12 - tmp7; - tmp5 = tmp11 - tmp6; - tmp4 = tmp10 + tmp5; - - wsptr[DCTSIZE*0]+= (tmp0 + tmp7); - wsptr[DCTSIZE*1]+= (tmp1 + tmp6); - wsptr[DCTSIZE*2]+= (tmp2 + tmp5); - wsptr[DCTSIZE*3]+= (tmp3 - tmp4); - wsptr[DCTSIZE*4]+= (tmp3 + tmp4); - wsptr[DCTSIZE*5]+= (tmp2 - tmp5); - wsptr[DCTSIZE*6]= (tmp1 - tmp6); - wsptr[DCTSIZE*7]= (tmp0 - tmp7); - // - dataptr++; //next column - wsptr++; - threshold++; - } - dataptr+=8; //skip each second start pos - wsptr +=8; - } -} - -#else /* HAVE_MMX */ - -static void column_fidct_mmx(int16_t* thr_adr, DCTELEM *data, DCTELEM *output, int cnt) -{ - uint64_t __attribute__((aligned(8))) temps[4]; - __asm__ volatile( - ASMALIGN(4) - "1: \n\t" - "movq "DCTSIZE_S"*0*2(%%"REG_S"), %%mm1 \n\t" - // - "movq "DCTSIZE_S"*3*2(%%"REG_S"), %%mm7 \n\t" - "movq %%mm1, %%mm0 \n\t" - - "paddw "DCTSIZE_S"*7*2(%%"REG_S"), %%mm1 \n\t" //t0 - "movq %%mm7, %%mm3 \n\t" - - "paddw "DCTSIZE_S"*4*2(%%"REG_S"), %%mm7 \n\t" //t3 - "movq %%mm1, %%mm5 \n\t" - - "movq "DCTSIZE_S"*1*2(%%"REG_S"), %%mm6 \n\t" - "psubw %%mm7, %%mm1 \n\t" //t13 - - "movq "DCTSIZE_S"*2*2(%%"REG_S"), %%mm2 \n\t" - "movq %%mm6, %%mm4 \n\t" - - "paddw "DCTSIZE_S"*6*2(%%"REG_S"), %%mm6 \n\t" //t1 - "paddw %%mm7, %%mm5 \n\t" //t10 - - "paddw "DCTSIZE_S"*5*2(%%"REG_S"), %%mm2 \n\t" //t2 - "movq %%mm6, %%mm7 \n\t" - - "paddw %%mm2, %%mm6 \n\t" //t11 - "psubw %%mm2, %%mm7 \n\t" //t12 - - "movq %%mm5, %%mm2 \n\t" - "paddw %%mm6, %%mm5 \n\t" //d0 - // i0 t13 t12 i3 i1 d0 - d4 - "psubw %%mm6, %%mm2 \n\t" //d4 - "paddw %%mm1, %%mm7 \n\t" - - "movq 4*16(%%"REG_d"), %%mm6 \n\t" - "psllw $2, %%mm7 \n\t" - - "psubw 0*16(%%"REG_d"), %%mm5 \n\t" - "psubw %%mm6, %%mm2 \n\t" - - "paddusw 0*16(%%"REG_d"), %%mm5 \n\t" - "paddusw %%mm6, %%mm2 \n\t" - - "pmulhw "MANGLE(MM_FIX_0_707106781)", %%mm7 \n\t" - // - "paddw 0*16(%%"REG_d"), %%mm5 \n\t" - "paddw %%mm6, %%mm2 \n\t" - - "psubusw 0*16(%%"REG_d"), %%mm5 \n\t" - "psubusw %%mm6, %%mm2 \n\t" - -//This func is totally compute-bound, operates at huge speed. So, DC shortcut -// at this place isn't worthwhile due to BTB miss penalty (checked on Pent. 3). -//However, typical numbers: nondc - 29%%, dc - 46%%, zero - 25%%. All <> 0 case is very rare. - "paddw "MANGLE(MM_2)", %%mm5 \n\t" - "movq %%mm2, %%mm6 \n\t" - - "paddw %%mm5, %%mm2 \n\t" - "psubw %%mm6, %%mm5 \n\t" - - "movq %%mm1, %%mm6 \n\t" - "paddw %%mm7, %%mm1 \n\t" //d2 - - "psubw 2*16(%%"REG_d"), %%mm1 \n\t" - "psubw %%mm7, %%mm6 \n\t" //d6 - - "movq 6*16(%%"REG_d"), %%mm7 \n\t" - "psraw $2, %%mm5 \n\t" - - "paddusw 2*16(%%"REG_d"), %%mm1 \n\t" - "psubw %%mm7, %%mm6 \n\t" - // t7 d2 /t11 t4 t6 - d6 /t10 - - "paddw 2*16(%%"REG_d"), %%mm1 \n\t" - "paddusw %%mm7, %%mm6 \n\t" - - "psubusw 2*16(%%"REG_d"), %%mm1 \n\t" - "paddw %%mm7, %%mm6 \n\t" - - "psubw "DCTSIZE_S"*4*2(%%"REG_S"), %%mm3 \n\t" - "psubusw %%mm7, %%mm6 \n\t" - - //movq [edi+"DCTSIZE_S"*2*2], mm1 - //movq [edi+"DCTSIZE_S"*6*2], mm6 - "movq %%mm1, %%mm7 \n\t" - "psraw $2, %%mm2 \n\t" - - "psubw "DCTSIZE_S"*6*2(%%"REG_S"), %%mm4 \n\t" - "psubw %%mm6, %%mm1 \n\t" - - "psubw "DCTSIZE_S"*7*2(%%"REG_S"), %%mm0 \n\t" - "paddw %%mm7, %%mm6 \n\t" //'t13 - - "psraw $2, %%mm6 \n\t" //paddw mm6, MM_2 !! --- - "movq %%mm2, %%mm7 \n\t" - - "pmulhw "MANGLE(MM_FIX_1_414213562_A)", %%mm1 \n\t" - "paddw %%mm6, %%mm2 \n\t" //'t0 - - "movq %%mm2, 0*8+%3 \n\t" //! - "psubw %%mm6, %%mm7 \n\t" //'t3 - - "movq "DCTSIZE_S"*2*2(%%"REG_S"), %%mm2 \n\t" - "psubw %%mm6, %%mm1 \n\t" //'t12 - - "psubw "DCTSIZE_S"*5*2(%%"REG_S"), %%mm2 \n\t" //t5 - "movq %%mm5, %%mm6 \n\t" - - "movq %%mm7, 3*8+%3 \n\t" - "paddw %%mm2, %%mm3 \n\t" //t10 - - "paddw %%mm4, %%mm2 \n\t" //t11 - "paddw %%mm0, %%mm4 \n\t" //t12 - - "movq %%mm3, %%mm7 \n\t" - "psubw %%mm4, %%mm3 \n\t" - - "psllw $2, %%mm3 \n\t" - "psllw $2, %%mm7 \n\t" //opt for P6 - - "pmulhw "MANGLE(MM_FIX_0_382683433)", %%mm3 \n\t" - "psllw $2, %%mm4 \n\t" - - "pmulhw "MANGLE(MM_FIX_0_541196100)", %%mm7 \n\t" - "psllw $2, %%mm2 \n\t" - - "pmulhw "MANGLE(MM_FIX_1_306562965)", %%mm4 \n\t" - "paddw %%mm1, %%mm5 \n\t" //'t1 - - "pmulhw "MANGLE(MM_FIX_0_707106781)", %%mm2 \n\t" - "psubw %%mm1, %%mm6 \n\t" //'t2 - // t7 't12 't11 t4 t6 - 't13 't10 --- - - "paddw %%mm3, %%mm7 \n\t" //z2 - - "movq %%mm5, 1*8+%3 \n\t" - "paddw %%mm3, %%mm4 \n\t" //z4 - - "movq 3*16(%%"REG_d"), %%mm3 \n\t" - "movq %%mm0, %%mm1 \n\t" - - "movq %%mm6, 2*8+%3 \n\t" - "psubw %%mm2, %%mm1 \n\t" //z13 - -//=== - "paddw %%mm2, %%mm0 \n\t" //z11 - "movq %%mm1, %%mm5 \n\t" - - "movq 5*16(%%"REG_d"), %%mm2 \n\t" - "psubw %%mm7, %%mm1 \n\t" //d3 - - "paddw %%mm7, %%mm5 \n\t" //d5 - "psubw %%mm3, %%mm1 \n\t" - - "movq 1*16(%%"REG_d"), %%mm7 \n\t" - "psubw %%mm2, %%mm5 \n\t" - - "movq %%mm0, %%mm6 \n\t" - "paddw %%mm4, %%mm0 \n\t" //d1 - - "paddusw %%mm3, %%mm1 \n\t" - "psubw %%mm4, %%mm6 \n\t" //d7 - - // d1 d3 - - - d5 d7 - - "movq 7*16(%%"REG_d"), %%mm4 \n\t" - "psubw %%mm7, %%mm0 \n\t" - - "psubw %%mm4, %%mm6 \n\t" - "paddusw %%mm2, %%mm5 \n\t" - - "paddusw %%mm4, %%mm6 \n\t" - "paddw %%mm3, %%mm1 \n\t" - - "paddw %%mm2, %%mm5 \n\t" - "paddw %%mm4, %%mm6 \n\t" - - "psubusw %%mm3, %%mm1 \n\t" - "psubusw %%mm2, %%mm5 \n\t" - - "psubusw %%mm4, %%mm6 \n\t" - "movq %%mm1, %%mm4 \n\t" - - "por %%mm5, %%mm4 \n\t" - "paddusw %%mm7, %%mm0 \n\t" - - "por %%mm6, %%mm4 \n\t" - "paddw %%mm7, %%mm0 \n\t" - - "packssdw %%mm4, %%mm4 \n\t" - "psubusw %%mm7, %%mm0 \n\t" - - "movd %%mm4, %%"REG_a" \n\t" - "or %%"REG_a", %%"REG_a" \n\t" - "jnz 2f \n\t" - //movq [edi+"DCTSIZE_S"*3*2], mm1 - //movq [edi+"DCTSIZE_S"*5*2], mm5 - //movq [edi+"DCTSIZE_S"*1*2], mm0 - //movq [edi+"DCTSIZE_S"*7*2], mm6 - // t4 t5 - - - t6 t7 - - //--- t4 (mm0) may be <>0; mm1, mm5, mm6 == 0 -//Typical numbers: nondc - 19%%, dc - 26%%, zero - 55%%. zero case alone isn't worthwhile - "movq 0*8+%3, %%mm4 \n\t" - "movq %%mm0, %%mm1 \n\t" - - "pmulhw "MANGLE(MM_FIX_0_847759065)", %%mm0 \n\t" //tmp6 - "movq %%mm1, %%mm2 \n\t" - - "movq "DCTSIZE_S"*0*2(%%"REG_D"), %%mm5 \n\t" - "movq %%mm2, %%mm3 \n\t" - - "pmulhw "MANGLE(MM_FIX_0_566454497)", %%mm1 \n\t" //tmp5 - "paddw %%mm4, %%mm5 \n\t" - - "movq 1*8+%3, %%mm6 \n\t" - //paddw mm3, MM_2 - "psraw $2, %%mm3 \n\t" //tmp7 - - "pmulhw "MANGLE(MM_FIX_0_198912367)", %%mm2 \n\t" //-tmp4 - "psubw %%mm3, %%mm4 \n\t" - - "movq "DCTSIZE_S"*1*2(%%"REG_D"), %%mm7 \n\t" - "paddw %%mm3, %%mm5 \n\t" - - "movq %%mm4, "DCTSIZE_S"*7*2(%%"REG_D") \n\t" - "paddw %%mm6, %%mm7 \n\t" - - "movq 2*8+%3, %%mm3 \n\t" - "psubw %%mm0, %%mm6 \n\t" - - "movq "DCTSIZE_S"*2*2(%%"REG_D"), %%mm4 \n\t" - "paddw %%mm0, %%mm7 \n\t" - - "movq %%mm5, "DCTSIZE_S"*0*2(%%"REG_D") \n\t" - "paddw %%mm3, %%mm4 \n\t" - - "movq %%mm6, "DCTSIZE_S"*6*2(%%"REG_D") \n\t" - "psubw %%mm1, %%mm3 \n\t" - - "movq "DCTSIZE_S"*5*2(%%"REG_D"), %%mm5 \n\t" - "paddw %%mm1, %%mm4 \n\t" - - "movq "DCTSIZE_S"*3*2(%%"REG_D"), %%mm6 \n\t" - "paddw %%mm3, %%mm5 \n\t" - - "movq 3*8+%3, %%mm0 \n\t" - "add $8, %%"REG_S" \n\t" - - "movq %%mm7, "DCTSIZE_S"*1*2(%%"REG_D") \n\t" - "paddw %%mm0, %%mm6 \n\t" - - "movq %%mm4, "DCTSIZE_S"*2*2(%%"REG_D") \n\t" - "psubw %%mm2, %%mm0 \n\t" - - "movq "DCTSIZE_S"*4*2(%%"REG_D"), %%mm7 \n\t" - "paddw %%mm2, %%mm6 \n\t" - - "movq %%mm5, "DCTSIZE_S"*5*2(%%"REG_D") \n\t" - "paddw %%mm0, %%mm7 \n\t" - - "movq %%mm6, "DCTSIZE_S"*3*2(%%"REG_D") \n\t" - - "movq %%mm7, "DCTSIZE_S"*4*2(%%"REG_D") \n\t" - "add $8, %%"REG_D" \n\t" - "jmp 4f \n\t" - - "2: \n\t" - //--- non DC2 - //psraw mm1, 2 w/o it -> offset. thr1, thr1, thr1 (actually thr1, thr1, thr1-1) - //psraw mm5, 2 - //psraw mm0, 2 - //psraw mm6, 2 - "movq %%mm5, %%mm3 \n\t" - "psubw %%mm1, %%mm5 \n\t" - - "psllw $1, %%mm5 \n\t" //'z10 - "paddw %%mm1, %%mm3 \n\t" //'z13 - - "movq %%mm0, %%mm2 \n\t" - "psubw %%mm6, %%mm0 \n\t" - - "movq %%mm5, %%mm1 \n\t" - "psllw $1, %%mm0 \n\t" //'z12 - - "pmulhw "MANGLE(MM_FIX_2_613125930)", %%mm1 \n\t" //- - "paddw %%mm0, %%mm5 \n\t" - - "pmulhw "MANGLE(MM_FIX_1_847759065)", %%mm5 \n\t" //'z5 - "paddw %%mm6, %%mm2 \n\t" //'z11 - - "pmulhw "MANGLE(MM_FIX_1_082392200)", %%mm0 \n\t" - "movq %%mm2, %%mm7 \n\t" - - //--- - "movq 0*8+%3, %%mm4 \n\t" - "psubw %%mm3, %%mm2 \n\t" - - "psllw $1, %%mm2 \n\t" - "paddw %%mm3, %%mm7 \n\t" //'t7 - - "pmulhw "MANGLE(MM_FIX_1_414213562)", %%mm2 \n\t" //'t11 - "movq %%mm4, %%mm6 \n\t" - //paddw mm7, MM_2 - "psraw $2, %%mm7 \n\t" - - "paddw "DCTSIZE_S"*0*2(%%"REG_D"), %%mm4 \n\t" - "psubw %%mm7, %%mm6 \n\t" - - "movq 1*8+%3, %%mm3 \n\t" - "paddw %%mm7, %%mm4 \n\t" - - "movq %%mm6, "DCTSIZE_S"*7*2(%%"REG_D") \n\t" - "paddw %%mm5, %%mm1 \n\t" //'t12 - - "movq %%mm4, "DCTSIZE_S"*0*2(%%"REG_D") \n\t" - "psubw %%mm7, %%mm1 \n\t" //'t6 - - "movq 2*8+%3, %%mm7 \n\t" - "psubw %%mm5, %%mm0 \n\t" //'t10 - - "movq 3*8+%3, %%mm6 \n\t" - "movq %%mm3, %%mm5 \n\t" - - "paddw "DCTSIZE_S"*1*2(%%"REG_D"), %%mm3 \n\t" - "psubw %%mm1, %%mm5 \n\t" - - "psubw %%mm1, %%mm2 \n\t" //'t5 - "paddw %%mm1, %%mm3 \n\t" - - "movq %%mm5, "DCTSIZE_S"*6*2(%%"REG_D") \n\t" - "movq %%mm7, %%mm4 \n\t" - - "paddw "DCTSIZE_S"*2*2(%%"REG_D"), %%mm7 \n\t" - "psubw %%mm2, %%mm4 \n\t" - - "paddw "DCTSIZE_S"*5*2(%%"REG_D"), %%mm4 \n\t" - "paddw %%mm2, %%mm7 \n\t" - - "movq %%mm3, "DCTSIZE_S"*1*2(%%"REG_D") \n\t" - "paddw %%mm2, %%mm0 \n\t" //'t4 - - // 't4 't6 't5 - - - - 't7 - "movq %%mm7, "DCTSIZE_S"*2*2(%%"REG_D") \n\t" - "movq %%mm6, %%mm1 \n\t" - - "paddw "DCTSIZE_S"*4*2(%%"REG_D"), %%mm6 \n\t" - "psubw %%mm0, %%mm1 \n\t" - - "paddw "DCTSIZE_S"*3*2(%%"REG_D"), %%mm1 \n\t" - "paddw %%mm0, %%mm6 \n\t" - - "movq %%mm4, "DCTSIZE_S"*5*2(%%"REG_D") \n\t" - "add $8, %%"REG_S" \n\t" - - "movq %%mm6, "DCTSIZE_S"*4*2(%%"REG_D") \n\t" - - "movq %%mm1, "DCTSIZE_S"*3*2(%%"REG_D") \n\t" - "add $8, %%"REG_D" \n\t" - - "4: \n\t" -//=part 2 (the same)=========================================================== - "movq "DCTSIZE_S"*0*2(%%"REG_S"), %%mm1 \n\t" - // - "movq "DCTSIZE_S"*3*2(%%"REG_S"), %%mm7 \n\t" - "movq %%mm1, %%mm0 \n\t" - - "paddw "DCTSIZE_S"*7*2(%%"REG_S"), %%mm1 \n\t" //t0 - "movq %%mm7, %%mm3 \n\t" - - "paddw "DCTSIZE_S"*4*2(%%"REG_S"), %%mm7 \n\t" //t3 - "movq %%mm1, %%mm5 \n\t" - - "movq "DCTSIZE_S"*1*2(%%"REG_S"), %%mm6 \n\t" - "psubw %%mm7, %%mm1 \n\t" //t13 - - "movq "DCTSIZE_S"*2*2(%%"REG_S"), %%mm2 \n\t" - "movq %%mm6, %%mm4 \n\t" - - "paddw "DCTSIZE_S"*6*2(%%"REG_S"), %%mm6 \n\t" //t1 - "paddw %%mm7, %%mm5 \n\t" //t10 - - "paddw "DCTSIZE_S"*5*2(%%"REG_S"), %%mm2 \n\t" //t2 - "movq %%mm6, %%mm7 \n\t" - - "paddw %%mm2, %%mm6 \n\t" //t11 - "psubw %%mm2, %%mm7 \n\t" //t12 - - "movq %%mm5, %%mm2 \n\t" - "paddw %%mm6, %%mm5 \n\t" //d0 - // i0 t13 t12 i3 i1 d0 - d4 - "psubw %%mm6, %%mm2 \n\t" //d4 - "paddw %%mm1, %%mm7 \n\t" - - "movq 1*8+4*16(%%"REG_d"), %%mm6 \n\t" - "psllw $2, %%mm7 \n\t" - - "psubw 1*8+0*16(%%"REG_d"), %%mm5 \n\t" - "psubw %%mm6, %%mm2 \n\t" - - "paddusw 1*8+0*16(%%"REG_d"), %%mm5 \n\t" - "paddusw %%mm6, %%mm2 \n\t" - - "pmulhw "MANGLE(MM_FIX_0_707106781)", %%mm7 \n\t" - // - "paddw 1*8+0*16(%%"REG_d"), %%mm5 \n\t" - "paddw %%mm6, %%mm2 \n\t" - - "psubusw 1*8+0*16(%%"REG_d"), %%mm5 \n\t" - "psubusw %%mm6, %%mm2 \n\t" - -//This func is totally compute-bound, operates at huge speed. So, DC shortcut -// at this place isn't worthwhile due to BTB miss penalty (checked on Pent. 3). -//However, typical numbers: nondc - 29%%, dc - 46%%, zero - 25%%. All <> 0 case is very rare. - "paddw "MANGLE(MM_2)", %%mm5 \n\t" - "movq %%mm2, %%mm6 \n\t" - - "paddw %%mm5, %%mm2 \n\t" - "psubw %%mm6, %%mm5 \n\t" - - "movq %%mm1, %%mm6 \n\t" - "paddw %%mm7, %%mm1 \n\t" //d2 - - "psubw 1*8+2*16(%%"REG_d"), %%mm1 \n\t" - "psubw %%mm7, %%mm6 \n\t" //d6 - - "movq 1*8+6*16(%%"REG_d"), %%mm7 \n\t" - "psraw $2, %%mm5 \n\t" - - "paddusw 1*8+2*16(%%"REG_d"), %%mm1 \n\t" - "psubw %%mm7, %%mm6 \n\t" - // t7 d2 /t11 t4 t6 - d6 /t10 - - "paddw 1*8+2*16(%%"REG_d"), %%mm1 \n\t" - "paddusw %%mm7, %%mm6 \n\t" - - "psubusw 1*8+2*16(%%"REG_d"), %%mm1 \n\t" - "paddw %%mm7, %%mm6 \n\t" - - "psubw "DCTSIZE_S"*4*2(%%"REG_S"), %%mm3 \n\t" - "psubusw %%mm7, %%mm6 \n\t" - - //movq [edi+"DCTSIZE_S"*2*2], mm1 - //movq [edi+"DCTSIZE_S"*6*2], mm6 - "movq %%mm1, %%mm7 \n\t" - "psraw $2, %%mm2 \n\t" - - "psubw "DCTSIZE_S"*6*2(%%"REG_S"), %%mm4 \n\t" - "psubw %%mm6, %%mm1 \n\t" - - "psubw "DCTSIZE_S"*7*2(%%"REG_S"), %%mm0 \n\t" - "paddw %%mm7, %%mm6 \n\t" //'t13 - - "psraw $2, %%mm6 \n\t" //paddw mm6, MM_2 !! --- - "movq %%mm2, %%mm7 \n\t" - - "pmulhw "MANGLE(MM_FIX_1_414213562_A)", %%mm1 \n\t" - "paddw %%mm6, %%mm2 \n\t" //'t0 - - "movq %%mm2, 0*8+%3 \n\t" //! - "psubw %%mm6, %%mm7 \n\t" //'t3 - - "movq "DCTSIZE_S"*2*2(%%"REG_S"), %%mm2 \n\t" - "psubw %%mm6, %%mm1 \n\t" //'t12 - - "psubw "DCTSIZE_S"*5*2(%%"REG_S"), %%mm2 \n\t" //t5 - "movq %%mm5, %%mm6 \n\t" - - "movq %%mm7, 3*8+%3 \n\t" - "paddw %%mm2, %%mm3 \n\t" //t10 - - "paddw %%mm4, %%mm2 \n\t" //t11 - "paddw %%mm0, %%mm4 \n\t" //t12 - - "movq %%mm3, %%mm7 \n\t" - "psubw %%mm4, %%mm3 \n\t" - - "psllw $2, %%mm3 \n\t" - "psllw $2, %%mm7 \n\t" //opt for P6 - - "pmulhw "MANGLE(MM_FIX_0_382683433)", %%mm3 \n\t" - "psllw $2, %%mm4 \n\t" - - "pmulhw "MANGLE(MM_FIX_0_541196100)", %%mm7 \n\t" - "psllw $2, %%mm2 \n\t" - - "pmulhw "MANGLE(MM_FIX_1_306562965)", %%mm4 \n\t" - "paddw %%mm1, %%mm5 \n\t" //'t1 - - "pmulhw "MANGLE(MM_FIX_0_707106781)", %%mm2 \n\t" - "psubw %%mm1, %%mm6 \n\t" //'t2 - // t7 't12 't11 t4 t6 - 't13 't10 --- - - "paddw %%mm3, %%mm7 \n\t" //z2 - - "movq %%mm5, 1*8+%3 \n\t" - "paddw %%mm3, %%mm4 \n\t" //z4 - - "movq 1*8+3*16(%%"REG_d"), %%mm3 \n\t" - "movq %%mm0, %%mm1 \n\t" - - "movq %%mm6, 2*8+%3 \n\t" - "psubw %%mm2, %%mm1 \n\t" //z13 - -//=== - "paddw %%mm2, %%mm0 \n\t" //z11 - "movq %%mm1, %%mm5 \n\t" - - "movq 1*8+5*16(%%"REG_d"), %%mm2 \n\t" - "psubw %%mm7, %%mm1 \n\t" //d3 - - "paddw %%mm7, %%mm5 \n\t" //d5 - "psubw %%mm3, %%mm1 \n\t" - - "movq 1*8+1*16(%%"REG_d"), %%mm7 \n\t" - "psubw %%mm2, %%mm5 \n\t" - - "movq %%mm0, %%mm6 \n\t" - "paddw %%mm4, %%mm0 \n\t" //d1 - - "paddusw %%mm3, %%mm1 \n\t" - "psubw %%mm4, %%mm6 \n\t" //d7 - - // d1 d3 - - - d5 d7 - - "movq 1*8+7*16(%%"REG_d"), %%mm4 \n\t" - "psubw %%mm7, %%mm0 \n\t" - - "psubw %%mm4, %%mm6 \n\t" - "paddusw %%mm2, %%mm5 \n\t" - - "paddusw %%mm4, %%mm6 \n\t" - "paddw %%mm3, %%mm1 \n\t" - - "paddw %%mm2, %%mm5 \n\t" - "paddw %%mm4, %%mm6 \n\t" - - "psubusw %%mm3, %%mm1 \n\t" - "psubusw %%mm2, %%mm5 \n\t" - - "psubusw %%mm4, %%mm6 \n\t" - "movq %%mm1, %%mm4 \n\t" - - "por %%mm5, %%mm4 \n\t" - "paddusw %%mm7, %%mm0 \n\t" - - "por %%mm6, %%mm4 \n\t" - "paddw %%mm7, %%mm0 \n\t" - - "packssdw %%mm4, %%mm4 \n\t" - "psubusw %%mm7, %%mm0 \n\t" - - "movd %%mm4, %%"REG_a" \n\t" - "or %%"REG_a", %%"REG_a" \n\t" - "jnz 3f \n\t" - //movq [edi+"DCTSIZE_S"*3*2], mm1 - //movq [edi+"DCTSIZE_S"*5*2], mm5 - //movq [edi+"DCTSIZE_S"*1*2], mm0 - //movq [edi+"DCTSIZE_S"*7*2], mm6 - // t4 t5 - - - t6 t7 - - //--- t4 (mm0) may be <>0; mm1, mm5, mm6 == 0 -//Typical numbers: nondc - 19%%, dc - 26%%, zero - 55%%. zero case alone isn't worthwhile - "movq 0*8+%3, %%mm4 \n\t" - "movq %%mm0, %%mm1 \n\t" - - "pmulhw "MANGLE(MM_FIX_0_847759065)", %%mm0 \n\t" //tmp6 - "movq %%mm1, %%mm2 \n\t" - - "movq "DCTSIZE_S"*0*2(%%"REG_D"), %%mm5 \n\t" - "movq %%mm2, %%mm3 \n\t" - - "pmulhw "MANGLE(MM_FIX_0_566454497)", %%mm1 \n\t" //tmp5 - "paddw %%mm4, %%mm5 \n\t" - - "movq 1*8+%3, %%mm6 \n\t" - //paddw mm3, MM_2 - "psraw $2, %%mm3 \n\t" //tmp7 - - "pmulhw "MANGLE(MM_FIX_0_198912367)", %%mm2 \n\t" //-tmp4 - "psubw %%mm3, %%mm4 \n\t" - - "movq "DCTSIZE_S"*1*2(%%"REG_D"), %%mm7 \n\t" - "paddw %%mm3, %%mm5 \n\t" - - "movq %%mm4, "DCTSIZE_S"*7*2(%%"REG_D") \n\t" - "paddw %%mm6, %%mm7 \n\t" - - "movq 2*8+%3, %%mm3 \n\t" - "psubw %%mm0, %%mm6 \n\t" - - "movq "DCTSIZE_S"*2*2(%%"REG_D"), %%mm4 \n\t" - "paddw %%mm0, %%mm7 \n\t" - - "movq %%mm5, "DCTSIZE_S"*0*2(%%"REG_D") \n\t" - "paddw %%mm3, %%mm4 \n\t" - - "movq %%mm6, "DCTSIZE_S"*6*2(%%"REG_D") \n\t" - "psubw %%mm1, %%mm3 \n\t" - - "movq "DCTSIZE_S"*5*2(%%"REG_D"), %%mm5 \n\t" - "paddw %%mm1, %%mm4 \n\t" - - "movq "DCTSIZE_S"*3*2(%%"REG_D"), %%mm6 \n\t" - "paddw %%mm3, %%mm5 \n\t" - - "movq 3*8+%3, %%mm0 \n\t" - "add $24, %%"REG_S" \n\t" - - "movq %%mm7, "DCTSIZE_S"*1*2(%%"REG_D") \n\t" - "paddw %%mm0, %%mm6 \n\t" - - "movq %%mm4, "DCTSIZE_S"*2*2(%%"REG_D") \n\t" - "psubw %%mm2, %%mm0 \n\t" - - "movq "DCTSIZE_S"*4*2(%%"REG_D"), %%mm7 \n\t" - "paddw %%mm2, %%mm6 \n\t" - - "movq %%mm5, "DCTSIZE_S"*5*2(%%"REG_D") \n\t" - "paddw %%mm0, %%mm7 \n\t" - - "movq %%mm6, "DCTSIZE_S"*3*2(%%"REG_D") \n\t" - - "movq %%mm7, "DCTSIZE_S"*4*2(%%"REG_D") \n\t" - "add $24, %%"REG_D" \n\t" - "sub $2, %%"REG_c" \n\t" - "jnz 1b \n\t" - "jmp 5f \n\t" - - "3: \n\t" - //--- non DC2 - //psraw mm1, 2 w/o it -> offset. thr1, thr1, thr1 (actually thr1, thr1, thr1-1) - //psraw mm5, 2 - //psraw mm0, 2 - //psraw mm6, 2 - "movq %%mm5, %%mm3 \n\t" - "psubw %%mm1, %%mm5 \n\t" - - "psllw $1, %%mm5 \n\t" //'z10 - "paddw %%mm1, %%mm3 \n\t" //'z13 - - "movq %%mm0, %%mm2 \n\t" - "psubw %%mm6, %%mm0 \n\t" - - "movq %%mm5, %%mm1 \n\t" - "psllw $1, %%mm0 \n\t" //'z12 - - "pmulhw "MANGLE(MM_FIX_2_613125930)", %%mm1 \n\t" //- - "paddw %%mm0, %%mm5 \n\t" - - "pmulhw "MANGLE(MM_FIX_1_847759065)", %%mm5 \n\t" //'z5 - "paddw %%mm6, %%mm2 \n\t" //'z11 - - "pmulhw "MANGLE(MM_FIX_1_082392200)", %%mm0 \n\t" - "movq %%mm2, %%mm7 \n\t" - - //--- - "movq 0*8+%3, %%mm4 \n\t" - "psubw %%mm3, %%mm2 \n\t" - - "psllw $1, %%mm2 \n\t" - "paddw %%mm3, %%mm7 \n\t" //'t7 - - "pmulhw "MANGLE(MM_FIX_1_414213562)", %%mm2 \n\t" //'t11 - "movq %%mm4, %%mm6 \n\t" - //paddw mm7, MM_2 - "psraw $2, %%mm7 \n\t" - - "paddw "DCTSIZE_S"*0*2(%%"REG_D"), %%mm4 \n\t" - "psubw %%mm7, %%mm6 \n\t" - - "movq 1*8+%3, %%mm3 \n\t" - "paddw %%mm7, %%mm4 \n\t" - - "movq %%mm6, "DCTSIZE_S"*7*2(%%"REG_D") \n\t" - "paddw %%mm5, %%mm1 \n\t" //'t12 - - "movq %%mm4, "DCTSIZE_S"*0*2(%%"REG_D") \n\t" - "psubw %%mm7, %%mm1 \n\t" //'t6 - - "movq 2*8+%3, %%mm7 \n\t" - "psubw %%mm5, %%mm0 \n\t" //'t10 - - "movq 3*8+%3, %%mm6 \n\t" - "movq %%mm3, %%mm5 \n\t" - - "paddw "DCTSIZE_S"*1*2(%%"REG_D"), %%mm3 \n\t" - "psubw %%mm1, %%mm5 \n\t" - - "psubw %%mm1, %%mm2 \n\t" //'t5 - "paddw %%mm1, %%mm3 \n\t" - - "movq %%mm5, "DCTSIZE_S"*6*2(%%"REG_D") \n\t" - "movq %%mm7, %%mm4 \n\t" - - "paddw "DCTSIZE_S"*2*2(%%"REG_D"), %%mm7 \n\t" - "psubw %%mm2, %%mm4 \n\t" - - "paddw "DCTSIZE_S"*5*2(%%"REG_D"), %%mm4 \n\t" - "paddw %%mm2, %%mm7 \n\t" - - "movq %%mm3, "DCTSIZE_S"*1*2(%%"REG_D") \n\t" - "paddw %%mm2, %%mm0 \n\t" //'t4 - - // 't4 't6 't5 - - - - 't7 - "movq %%mm7, "DCTSIZE_S"*2*2(%%"REG_D") \n\t" - "movq %%mm6, %%mm1 \n\t" - - "paddw "DCTSIZE_S"*4*2(%%"REG_D"), %%mm6 \n\t" - "psubw %%mm0, %%mm1 \n\t" - - "paddw "DCTSIZE_S"*3*2(%%"REG_D"), %%mm1 \n\t" - "paddw %%mm0, %%mm6 \n\t" - - "movq %%mm4, "DCTSIZE_S"*5*2(%%"REG_D") \n\t" - "add $24, %%"REG_S" \n\t" - - "movq %%mm6, "DCTSIZE_S"*4*2(%%"REG_D") \n\t" - - "movq %%mm1, "DCTSIZE_S"*3*2(%%"REG_D") \n\t" - "add $24, %%"REG_D" \n\t" - "sub $2, %%"REG_c" \n\t" - "jnz 1b \n\t" - "5: \n\t" - - : "+S"(data), "+D"(output), "+c"(cnt), "=o"(temps) - : "d"(thr_adr) - : "%"REG_a - ); -} - -#endif // HAVE_MMX - -#if !HAVE_MMX - -static void row_idct_c(DCTELEM* workspace, - int16_t* output_adr, int output_stride, int cnt) -{ - int_simd16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - int_simd16_t tmp10, tmp11, tmp12, tmp13; - int_simd16_t z5, z10, z11, z12, z13; - int16_t* outptr; - DCTELEM* wsptr; - - cnt*=4; - wsptr = workspace; - outptr = output_adr; - for (; cnt > 0; cnt--) { - // Even part - //Simd version reads 4x4 block and transposes it - tmp10 = ( wsptr[2] + wsptr[3]); - tmp11 = ( wsptr[2] - wsptr[3]); - - tmp13 = ( wsptr[0] + wsptr[1]); - tmp12 = (MULTIPLY16H( wsptr[0] - wsptr[1], FIX_1_414213562_A)<<2) - tmp13;//this shift order to avoid overflow - - tmp0 = tmp10 + tmp13; //->temps - tmp3 = tmp10 - tmp13; //->temps - tmp1 = tmp11 + tmp12; - tmp2 = tmp11 - tmp12; - - // Odd part - //Also transpose, with previous: - // ---- ---- |||| - // ---- ---- idct |||| - // ---- ---- ---> |||| - // ---- ---- |||| - z13 = wsptr[4] + wsptr[5]; - z10 = wsptr[4] - wsptr[5]; - z11 = wsptr[6] + wsptr[7]; - z12 = wsptr[6] - wsptr[7]; - - tmp7 = z11 + z13; - tmp11 = MULTIPLY16H(z11 - z13, FIX_1_414213562); - - z5 = MULTIPLY16H(z10 + z12, FIX_1_847759065); - tmp10 = MULTIPLY16H(z12, FIX_1_082392200) - z5; - tmp12 = MULTIPLY16H(z10, FIX_2_613125930) + z5; // - FIX_ - - tmp6 = (tmp12<<3) - tmp7; - tmp5 = (tmp11<<3) - tmp6; - tmp4 = (tmp10<<3) + tmp5; - - // Final output stage: descale and write column - outptr[0*output_stride]+= DESCALE(tmp0 + tmp7, 3); - outptr[1*output_stride]+= DESCALE(tmp1 + tmp6, 3); - outptr[2*output_stride]+= DESCALE(tmp2 + tmp5, 3); - outptr[3*output_stride]+= DESCALE(tmp3 - tmp4, 3); - outptr[4*output_stride]+= DESCALE(tmp3 + tmp4, 3); - outptr[5*output_stride]+= DESCALE(tmp2 - tmp5, 3); - outptr[6*output_stride]+= DESCALE(tmp1 - tmp6, 3); //no += ? - outptr[7*output_stride]+= DESCALE(tmp0 - tmp7, 3); //no += ? - outptr++; - - wsptr += DCTSIZE; // advance pointer to next row - } -} - -#else /* HAVE_MMX */ - -static void row_idct_mmx (DCTELEM* workspace, - int16_t* output_adr, int output_stride, int cnt) -{ - uint64_t __attribute__((aligned(8))) temps[4]; - __asm__ volatile( - "lea (%%"REG_a",%%"REG_a",2), %%"REG_d" \n\t" - "1: \n\t" - "movq "DCTSIZE_S"*0*2(%%"REG_S"), %%mm0 \n\t" - // - - "movq "DCTSIZE_S"*1*2(%%"REG_S"), %%mm1 \n\t" - "movq %%mm0, %%mm4 \n\t" - - "movq "DCTSIZE_S"*2*2(%%"REG_S"), %%mm2 \n\t" - "punpcklwd %%mm1, %%mm0 \n\t" - - "movq "DCTSIZE_S"*3*2(%%"REG_S"), %%mm3 \n\t" - "punpckhwd %%mm1, %%mm4 \n\t" - - //transpose 4x4 - "movq %%mm2, %%mm7 \n\t" - "punpcklwd %%mm3, %%mm2 \n\t" - - "movq %%mm0, %%mm6 \n\t" - "punpckldq %%mm2, %%mm0 \n\t" //0 - - "punpckhdq %%mm2, %%mm6 \n\t" //1 - "movq %%mm0, %%mm5 \n\t" - - "punpckhwd %%mm3, %%mm7 \n\t" - "psubw %%mm6, %%mm0 \n\t" - - "pmulhw "MANGLE(MM_FIX_1_414213562_A)", %%mm0 \n\t" - "movq %%mm4, %%mm2 \n\t" - - "punpckldq %%mm7, %%mm4 \n\t" //2 - "paddw %%mm6, %%mm5 \n\t" - - "punpckhdq %%mm7, %%mm2 \n\t" //3 - "movq %%mm4, %%mm1 \n\t" - - "psllw $2, %%mm0 \n\t" - "paddw %%mm2, %%mm4 \n\t" //t10 - - "movq "DCTSIZE_S"*0*2+"DCTSIZE_S"(%%"REG_S"), %%mm3 \n\t" - "psubw %%mm2, %%mm1 \n\t" //t11 - - "movq "DCTSIZE_S"*1*2+"DCTSIZE_S"(%%"REG_S"), %%mm2 \n\t" - "psubw %%mm5, %%mm0 \n\t" - - "movq %%mm4, %%mm6 \n\t" - "paddw %%mm5, %%mm4 \n\t" //t0 - - "psubw %%mm5, %%mm6 \n\t" //t3 - "movq %%mm1, %%mm7 \n\t" - - "movq "DCTSIZE_S"*2*2+"DCTSIZE_S"(%%"REG_S"), %%mm5 \n\t" - "paddw %%mm0, %%mm1 \n\t" //t1 - - "movq %%mm4, 0*8+%3 \n\t" //t0 - "movq %%mm3, %%mm4 \n\t" - - "movq %%mm6, 1*8+%3 \n\t" //t3 - "punpcklwd %%mm2, %%mm3 \n\t" - - //transpose 4x4 - "movq "DCTSIZE_S"*3*2+"DCTSIZE_S"(%%"REG_S"), %%mm6 \n\t" - "punpckhwd %%mm2, %%mm4 \n\t" - - "movq %%mm5, %%mm2 \n\t" - "punpcklwd %%mm6, %%mm5 \n\t" - - "psubw %%mm0, %%mm7 \n\t" //t2 - "punpckhwd %%mm6, %%mm2 \n\t" - - "movq %%mm3, %%mm0 \n\t" - "punpckldq %%mm5, %%mm3 \n\t" //4 - - "punpckhdq %%mm5, %%mm0 \n\t" //5 - "movq %%mm4, %%mm5 \n\t" - - // - "movq %%mm3, %%mm6 \n\t" - "punpckldq %%mm2, %%mm4 \n\t" //6 - - "psubw %%mm0, %%mm3 \n\t" //z10 - "punpckhdq %%mm2, %%mm5 \n\t" //7 - - "paddw %%mm0, %%mm6 \n\t" //z13 - "movq %%mm4, %%mm2 \n\t" - - "movq %%mm3, %%mm0 \n\t" - "psubw %%mm5, %%mm4 \n\t" //z12 - - "pmulhw "MANGLE(MM_FIX_2_613125930)", %%mm0 \n\t" //- - "paddw %%mm4, %%mm3 \n\t" - - "pmulhw "MANGLE(MM_FIX_1_847759065)", %%mm3 \n\t" //z5 - "paddw %%mm5, %%mm2 \n\t" //z11 > - - "pmulhw "MANGLE(MM_FIX_1_082392200)", %%mm4 \n\t" - "movq %%mm2, %%mm5 \n\t" - - "psubw %%mm6, %%mm2 \n\t" - "paddw %%mm6, %%mm5 \n\t" //t7 - - "pmulhw "MANGLE(MM_FIX_1_414213562)", %%mm2 \n\t" //t11 - "paddw %%mm3, %%mm0 \n\t" //t12 - - "psllw $3, %%mm0 \n\t" - "psubw %%mm3, %%mm4 \n\t" //t10 - - "movq 0*8+%3, %%mm6 \n\t" - "movq %%mm1, %%mm3 \n\t" - - "psllw $3, %%mm4 \n\t" - "psubw %%mm5, %%mm0 \n\t" //t6 - - "psllw $3, %%mm2 \n\t" - "paddw %%mm0, %%mm1 \n\t" //d1 - - "psubw %%mm0, %%mm2 \n\t" //t5 - "psubw %%mm0, %%mm3 \n\t" //d6 - - "paddw %%mm2, %%mm4 \n\t" //t4 - "movq %%mm7, %%mm0 \n\t" - - "paddw %%mm2, %%mm7 \n\t" //d2 - "psubw %%mm2, %%mm0 \n\t" //d5 - - "movq "MANGLE(MM_DESCALE_RND)", %%mm2 \n\t" //4 - "psubw %%mm5, %%mm6 \n\t" //d7 - - "paddw 0*8+%3, %%mm5 \n\t" //d0 - "paddw %%mm2, %%mm1 \n\t" - - "paddw %%mm2, %%mm5 \n\t" - "psraw $3, %%mm1 \n\t" - - "paddw %%mm2, %%mm7 \n\t" - "psraw $3, %%mm5 \n\t" - - "paddw (%%"REG_D"), %%mm5 \n\t" - "psraw $3, %%mm7 \n\t" - - "paddw (%%"REG_D",%%"REG_a",), %%mm1 \n\t" - "paddw %%mm2, %%mm0 \n\t" - - "paddw (%%"REG_D",%%"REG_a",2), %%mm7 \n\t" - "paddw %%mm2, %%mm3 \n\t" - - "movq %%mm5, (%%"REG_D") \n\t" - "paddw %%mm2, %%mm6 \n\t" - - "movq %%mm1, (%%"REG_D",%%"REG_a",) \n\t" - "psraw $3, %%mm0 \n\t" - - "movq %%mm7, (%%"REG_D",%%"REG_a",2) \n\t" - "add %%"REG_d", %%"REG_D" \n\t" //3*ls - - "movq 1*8+%3, %%mm5 \n\t" //t3 - "psraw $3, %%mm3 \n\t" - - "paddw (%%"REG_D",%%"REG_a",2), %%mm0 \n\t" - "psubw %%mm4, %%mm5 \n\t" //d3 - - "paddw (%%"REG_D",%%"REG_d",), %%mm3 \n\t" - "psraw $3, %%mm6 \n\t" - - "paddw 1*8+%3, %%mm4 \n\t" //d4 - "paddw %%mm2, %%mm5 \n\t" - - "paddw (%%"REG_D",%%"REG_a",4), %%mm6 \n\t" - "paddw %%mm2, %%mm4 \n\t" - - "movq %%mm0, (%%"REG_D",%%"REG_a",2) \n\t" - "psraw $3, %%mm5 \n\t" - - "paddw (%%"REG_D"), %%mm5 \n\t" - "psraw $3, %%mm4 \n\t" - - "paddw (%%"REG_D",%%"REG_a",), %%mm4 \n\t" - "add $"DCTSIZE_S"*2*4, %%"REG_S" \n\t" //4 rows - - "movq %%mm3, (%%"REG_D",%%"REG_d",) \n\t" - "movq %%mm6, (%%"REG_D",%%"REG_a",4) \n\t" - "movq %%mm5, (%%"REG_D") \n\t" - "movq %%mm4, (%%"REG_D",%%"REG_a",) \n\t" - - "sub %%"REG_d", %%"REG_D" \n\t" - "add $8, %%"REG_D" \n\t" - "dec %%"REG_c" \n\t" - "jnz 1b \n\t" - - : "+S"(workspace), "+D"(output_adr), "+c"(cnt), "=o"(temps) - : "a"(output_stride*sizeof(short)) - : "%"REG_d - ); -} - -#endif // HAVE_MMX - -#if !HAVE_MMX - -static void row_fdct_c(DCTELEM *data, const uint8_t *pixels, int line_size, int cnt) -{ - int_simd16_t tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7; - int_simd16_t tmp10, tmp11, tmp12, tmp13; - int_simd16_t z1, z2, z3, z4, z5, z11, z13; - DCTELEM *dataptr; - - cnt*=4; - // Pass 1: process rows. - - dataptr = data; - for (; cnt > 0; cnt--) { - tmp0 = pixels[line_size*0] + pixels[line_size*7]; - tmp7 = pixels[line_size*0] - pixels[line_size*7]; - tmp1 = pixels[line_size*1] + pixels[line_size*6]; - tmp6 = pixels[line_size*1] - pixels[line_size*6]; - tmp2 = pixels[line_size*2] + pixels[line_size*5]; - tmp5 = pixels[line_size*2] - pixels[line_size*5]; - tmp3 = pixels[line_size*3] + pixels[line_size*4]; - tmp4 = pixels[line_size*3] - pixels[line_size*4]; - - // Even part - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - //Even columns are written first, this leads to different order of columns - //in column_fidct(), but they are processed independently, so all ok. - //Later in the row_idct() columns readed at the same order. - dataptr[2] = tmp10 + tmp11; - dataptr[3] = tmp10 - tmp11; - - z1 = MULTIPLY16H((tmp12 + tmp13)<<2, FIX_0_707106781); - dataptr[0] = tmp13 + z1; - dataptr[1] = tmp13 - z1; - - // Odd part - - tmp10 = (tmp4 + tmp5) <<2; - tmp11 = (tmp5 + tmp6) <<2; - tmp12 = (tmp6 + tmp7) <<2; - - z5 = MULTIPLY16H(tmp10 - tmp12, FIX_0_382683433); - z2 = MULTIPLY16H(tmp10, FIX_0_541196100) + z5; - z4 = MULTIPLY16H(tmp12, FIX_1_306562965) + z5; - z3 = MULTIPLY16H(tmp11, FIX_0_707106781); - - z11 = tmp7 + z3; - z13 = tmp7 - z3; - - dataptr[4] = z13 + z2; - dataptr[5] = z13 - z2; - dataptr[6] = z11 + z4; - dataptr[7] = z11 - z4; - - pixels++; // advance pointer to next column - dataptr += DCTSIZE; - } -} - -#else /* HAVE_MMX */ - -static void row_fdct_mmx(DCTELEM *data, const uint8_t *pixels, int line_size, int cnt) -{ - uint64_t __attribute__((aligned(8))) temps[4]; - __asm__ volatile( - "lea (%%"REG_a",%%"REG_a",2), %%"REG_d" \n\t" - "6: \n\t" - "movd (%%"REG_S"), %%mm0 \n\t" - "pxor %%mm7, %%mm7 \n\t" - - "movd (%%"REG_S",%%"REG_a",), %%mm1 \n\t" - "punpcklbw %%mm7, %%mm0 \n\t" - - "movd (%%"REG_S",%%"REG_a",2), %%mm2 \n\t" - "punpcklbw %%mm7, %%mm1 \n\t" - - "punpcklbw %%mm7, %%mm2 \n\t" - "add %%"REG_d", %%"REG_S" \n\t" - - "movq %%mm0, %%mm5 \n\t" - // - - "movd (%%"REG_S",%%"REG_a",4), %%mm3 \n\t" //7 ;prefetch! - "movq %%mm1, %%mm6 \n\t" - - "movd (%%"REG_S",%%"REG_d",), %%mm4 \n\t" //6 - "punpcklbw %%mm7, %%mm3 \n\t" - - "psubw %%mm3, %%mm5 \n\t" - "punpcklbw %%mm7, %%mm4 \n\t" - - "paddw %%mm3, %%mm0 \n\t" - "psubw %%mm4, %%mm6 \n\t" - - "movd (%%"REG_S",%%"REG_a",2), %%mm3 \n\t" //5 - "paddw %%mm4, %%mm1 \n\t" - - "movq %%mm5, 0*8+%3 \n\t" //t7 - "punpcklbw %%mm7, %%mm3 \n\t" - - "movq %%mm6, 1*8+%3 \n\t" //t6 - "movq %%mm2, %%mm4 \n\t" - - "movd (%%"REG_S"), %%mm5 \n\t" //3 - "paddw %%mm3, %%mm2 \n\t" - - "movd (%%"REG_S",%%"REG_a",), %%mm6 \n\t" //4 - "punpcklbw %%mm7, %%mm5 \n\t" - - "psubw %%mm3, %%mm4 \n\t" - "punpcklbw %%mm7, %%mm6 \n\t" - - "movq %%mm5, %%mm3 \n\t" - "paddw %%mm6, %%mm5 \n\t" //t3 - - "psubw %%mm6, %%mm3 \n\t" //t4 ; t0 t1 t2 t4 t5 t3 - - - "movq %%mm0, %%mm6 \n\t" - - "movq %%mm1, %%mm7 \n\t" - "psubw %%mm5, %%mm0 \n\t" //t13 - - "psubw %%mm2, %%mm1 \n\t" - "paddw %%mm2, %%mm7 \n\t" //t11 - - "paddw %%mm0, %%mm1 \n\t" - "movq %%mm7, %%mm2 \n\t" - - "psllw $2, %%mm1 \n\t" - "paddw %%mm5, %%mm6 \n\t" //t10 - - "pmulhw "MANGLE(MM_FIX_0_707106781)", %%mm1 \n\t" - "paddw %%mm6, %%mm7 \n\t" //d2 - - "psubw %%mm2, %%mm6 \n\t" //d3 - "movq %%mm0, %%mm5 \n\t" - - //transpose 4x4 - "movq %%mm7, %%mm2 \n\t" - "punpcklwd %%mm6, %%mm7 \n\t" - - "paddw %%mm1, %%mm0 \n\t" //d0 - "punpckhwd %%mm6, %%mm2 \n\t" - - "psubw %%mm1, %%mm5 \n\t" //d1 - "movq %%mm0, %%mm6 \n\t" - - "movq 1*8+%3, %%mm1 \n\t" - "punpcklwd %%mm5, %%mm0 \n\t" - - "punpckhwd %%mm5, %%mm6 \n\t" - "movq %%mm0, %%mm5 \n\t" - - "punpckldq %%mm7, %%mm0 \n\t" //0 - "paddw %%mm4, %%mm3 \n\t" - - "punpckhdq %%mm7, %%mm5 \n\t" //1 - "movq %%mm6, %%mm7 \n\t" - - "movq %%mm0, "DCTSIZE_S"*0*2(%%"REG_D") \n\t" - "punpckldq %%mm2, %%mm6 \n\t" //2 - - "movq %%mm5, "DCTSIZE_S"*1*2(%%"REG_D") \n\t" - "punpckhdq %%mm2, %%mm7 \n\t" //3 - - "movq %%mm6, "DCTSIZE_S"*2*2(%%"REG_D") \n\t" - "paddw %%mm1, %%mm4 \n\t" - - "movq %%mm7, "DCTSIZE_S"*3*2(%%"REG_D") \n\t" - "psllw $2, %%mm3 \n\t" //t10 - - "movq 0*8+%3, %%mm2 \n\t" - "psllw $2, %%mm4 \n\t" //t11 - - "pmulhw "MANGLE(MM_FIX_0_707106781)", %%mm4 \n\t" //z3 - "paddw %%mm2, %%mm1 \n\t" - - "psllw $2, %%mm1 \n\t" //t12 - "movq %%mm3, %%mm0 \n\t" - - "pmulhw "MANGLE(MM_FIX_0_541196100)", %%mm0 \n\t" - "psubw %%mm1, %%mm3 \n\t" - - "pmulhw "MANGLE(MM_FIX_0_382683433)", %%mm3 \n\t" //z5 - "movq %%mm2, %%mm5 \n\t" - - "pmulhw "MANGLE(MM_FIX_1_306562965)", %%mm1 \n\t" - "psubw %%mm4, %%mm2 \n\t" //z13 - - "paddw %%mm4, %%mm5 \n\t" //z11 - "movq %%mm2, %%mm6 \n\t" - - "paddw %%mm3, %%mm0 \n\t" //z2 - "movq %%mm5, %%mm7 \n\t" - - "paddw %%mm0, %%mm2 \n\t" //d4 - "psubw %%mm0, %%mm6 \n\t" //d5 - - "movq %%mm2, %%mm4 \n\t" - "paddw %%mm3, %%mm1 \n\t" //z4 - - //transpose 4x4 - "punpcklwd %%mm6, %%mm2 \n\t" - "paddw %%mm1, %%mm5 \n\t" //d6 - - "punpckhwd %%mm6, %%mm4 \n\t" - "psubw %%mm1, %%mm7 \n\t" //d7 - - "movq %%mm5, %%mm6 \n\t" - "punpcklwd %%mm7, %%mm5 \n\t" - - "punpckhwd %%mm7, %%mm6 \n\t" - "movq %%mm2, %%mm7 \n\t" - - "punpckldq %%mm5, %%mm2 \n\t" //4 - "sub %%"REG_d", %%"REG_S" \n\t" - - "punpckhdq %%mm5, %%mm7 \n\t" //5 - "movq %%mm4, %%mm5 \n\t" - - "movq %%mm2, "DCTSIZE_S"*0*2+"DCTSIZE_S"(%%"REG_D") \n\t" - "punpckldq %%mm6, %%mm4 \n\t" //6 - - "movq %%mm7, "DCTSIZE_S"*1*2+"DCTSIZE_S"(%%"REG_D") \n\t" - "punpckhdq %%mm6, %%mm5 \n\t" //7 - - "movq %%mm4, "DCTSIZE_S"*2*2+"DCTSIZE_S"(%%"REG_D") \n\t" - "add $4, %%"REG_S" \n\t" - - "movq %%mm5, "DCTSIZE_S"*3*2+"DCTSIZE_S"(%%"REG_D") \n\t" - "add $"DCTSIZE_S"*2*4, %%"REG_D" \n\t" //4 rows - "dec %%"REG_c" \n\t" - "jnz 6b \n\t" - - : "+S"(pixels), "+D"(data), "+c"(cnt), "=o"(temps) - : "a"(line_size) - : "%"REG_d); -} - -#endif // HAVE_MMX diff --git a/libmpcodecs/vf_geq.c b/libmpcodecs/vf_geq.c deleted file mode 100644 index 5c2e6c32c7..0000000000 --- a/libmpcodecs/vf_geq.c +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (C) 2006 Michael Niedermayer <michaelni@gmx.at> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> -#include <inttypes.h> - -#include <libavutil/eval.h> -#include <libavutil/common.h> - -#include "config.h" - -#include "mp_msg.h" -#include "cpudetect.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -struct vf_priv_s { - AVExpr * e[3]; - int framenum; - mp_image_t *mpi; -}; - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static inline double getpix(struct vf_instance *vf, double x, double y, int plane){ - int xi, yi; - mp_image_t *mpi= vf->priv->mpi; - int stride= mpi->stride[plane]; - uint8_t *src= mpi->planes[plane]; - xi=x= FFMIN(FFMAX(x, 0), (mpi->w >> (plane ? mpi->chroma_x_shift : 0))-1); - yi=y= FFMIN(FFMAX(y, 0), (mpi->h >> (plane ? mpi->chroma_y_shift : 0))-1); - - x-=xi; - y-=yi; - - return - (1-y)*((1-x)*src[xi + yi * stride] + x*src[xi + 1 + yi * stride]) - + y *((1-x)*src[xi + (yi+1) * stride] + x*src[xi + 1 + (yi+1) * stride]); -} - -//FIXME cubic interpolate -//FIXME keep the last few frames -static double lum(void *vf, double x, double y){ - return getpix(vf, x, y, 0); -} - -static double cb(void *vf, double x, double y){ - return getpix(vf, x, y, 1); -} - -static double cr(void *vf, double x, double y){ - return getpix(vf, x, y, 2); -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - int x,y, plane; - - if(!(mpi->flags&MP_IMGFLAG_DIRECT)){ - // no DR, so get a new image! hope we'll get DR buffer: - vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, MP_IMGTYPE_TEMP, - MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE, - mpi->w,mpi->h); - } - - dmpi= vf->dmpi; - vf->priv->mpi= mpi; - - vf_clone_mpi_attributes(dmpi, mpi); - - for(plane=0; plane<3; plane++){ - int w= mpi->w >> (plane ? mpi->chroma_x_shift : 0); - int h= mpi->h >> (plane ? mpi->chroma_y_shift : 0); - uint8_t *dst = dmpi->planes[plane]; - int dst_stride= dmpi->stride[plane]; - double const_values[]={ - M_PI, - M_E, - 0, - 0, - w, - h, - vf->priv->framenum, - w/(double)mpi->w, - h/(double)mpi->h, - 0 - }; - if (!vf->priv->e[plane]) continue; - for(y=0; y<h; y++){ - const_values[3]=y; - for(x=0; x<w; x++){ - const_values[2]=x; - dst[x + y * dst_stride] = av_expr_eval(vf->priv->e[plane], - const_values, vf); - } - } - } - - vf->priv->framenum++; - - return vf_next_put_image(vf,dmpi, pts); -} - -static void uninit(struct vf_instance *vf){ - av_free(vf->priv); - vf->priv=NULL; -} - -//===========================================================================// -static int vf_open(vf_instance_t *vf, char *args){ - char eq[3][2000] = { { 0 }, { 0 }, { 0 } }; - int plane, res; - - vf->config=config; - vf->put_image=put_image; -// vf->get_image=get_image; - vf->uninit=uninit; - vf->priv=av_malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - - if (args) sscanf(args, "%1999[^:]:%1999[^:]:%1999[^:]", eq[0], eq[1], eq[2]); - - if (!eq[1][0]) strncpy(eq[1], eq[0], sizeof(eq[0])-1); - if (!eq[2][0]) strncpy(eq[2], eq[1], sizeof(eq[0])-1); - - for(plane=0; plane<3; plane++){ - const char * const const_names[]={ - "PI", - "E", - "X", - "Y", - "W", - "H", - "N", - "SW", - "SH", - NULL - }; - const char * const func2_names[]={ - "lum", - "cb", - "cr", - "p", - NULL - }; - double (*func2[])(void *, double, double)={ - lum, - cb, - cr, - plane==0 ? lum : (plane==1 ? cb : cr), - NULL - }; - res = av_expr_parse(&vf->priv->e[plane], eq[plane], const_names, NULL, NULL, func2_names, func2, 0, NULL); - - if (res < 0) { - mp_msg(MSGT_VFILTER, MSGL_ERR, "geq: error loading equation `%s'\n", eq[plane]); - return 0; - } - } - - return 1; -} - -const vf_info_t vf_info_geq = { - "generic equation filter", - "geq", - "Michael Niedermayer", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_halfpack.c b/libmpcodecs/vf_halfpack.c deleted file mode 100644 index b67f8237b2..0000000000 --- a/libmpcodecs/vf_halfpack.c +++ /dev/null @@ -1,254 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" -#include "cpudetect.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" -#include "vf_scale.h" - -#include "libswscale/swscale.h" -#include "fmt-conversion.h" - -struct vf_priv_s { - int field; - struct SwsContext *ctx; -}; - -#if HAVE_MMX -static void halfpack_MMX(unsigned char *dst, unsigned char *src[3], - int dststride, int srcstride[3], - int w, int h) -{ - int j; - unsigned char *y1, *y2, *u, *v; - int dstinc, yinc, uinc, vinc; - - y1 = src[0]; - y2 = src[0] + srcstride[0]; - u = src[1]; - v = src[2]; - - dstinc = dststride - 2*w; - yinc = 2*srcstride[0] - w; - uinc = srcstride[1] - w/2; - vinc = srcstride[2] - w/2; - - for (h/=2; h; h--) { - __asm__ ( - "pxor %%mm0, %%mm0 \n\t" - ASMALIGN(4) - "1: \n\t" - "movq (%0), %%mm1 \n\t" - "movq (%0), %%mm2 \n\t" - "movq (%1), %%mm3 \n\t" - "movq (%1), %%mm4 \n\t" - "punpcklbw %%mm0, %%mm1 \n\t" - "punpckhbw %%mm0, %%mm2 \n\t" - "punpcklbw %%mm0, %%mm3 \n\t" - "punpckhbw %%mm0, %%mm4 \n\t" - "paddw %%mm3, %%mm1 \n\t" - "paddw %%mm4, %%mm2 \n\t" - "psrlw $1, %%mm1 \n\t" - "psrlw $1, %%mm2 \n\t" - - "movq (%2), %%mm3 \n\t" - "movq (%3), %%mm5 \n\t" - "punpcklbw %%mm0, %%mm3 \n\t" - "punpcklbw %%mm0, %%mm5 \n\t" - "movq %%mm3, %%mm4 \n\t" - "movq %%mm5, %%mm6 \n\t" - "punpcklwd %%mm0, %%mm3 \n\t" - "punpckhwd %%mm0, %%mm4 \n\t" - "punpcklwd %%mm0, %%mm5 \n\t" - "punpckhwd %%mm0, %%mm6 \n\t" - "pslld $8, %%mm3 \n\t" - "pslld $8, %%mm4 \n\t" - "pslld $24, %%mm5 \n\t" - "pslld $24, %%mm6 \n\t" - - "por %%mm3, %%mm1 \n\t" - "por %%mm4, %%mm2 \n\t" - "por %%mm5, %%mm1 \n\t" - "por %%mm6, %%mm2 \n\t" - - "add $8, %0 \n\t" - "add $8, %1 \n\t" - "add $4, %2 \n\t" - "add $4, %3 \n\t" - "movq %%mm1, (%8) \n\t" - "movq %%mm2, 8(%8) \n\t" - "add $16, %8 \n\t" - "decl %9 \n\t" - "jnz 1b \n\t" - : "=r" (y1), "=r" (y2), "=r" (u), "=r" (v) - : "0" (y1), "1" (y2), "2" (u), "3" (v), "r" (dst), "r" (w/8) - : "memory" - ); - for (j = (w&7)/2; j; j--) { - *dst++ = (*y1++ + *y2++)/2; - *dst++ = *u++; - *dst++ = (*y1++ + *y2++)/2; - *dst++ = *v++; - } - y1 += yinc; - y2 += yinc; - u += uinc; - v += vinc; - dst += dstinc; - } - __asm__ volatile ( "emms \n\t" ::: "memory" ); -} -#endif - - - -static void halfpack_C(unsigned char *dst, unsigned char *src[3], - int dststride, int srcstride[3], - int w, int h) -{ - int i, j; - unsigned char *y1, *y2, *u, *v; - int dstinc, yinc, uinc, vinc; - - y1 = src[0]; - y2 = src[0] + srcstride[0]; - u = src[1]; - v = src[2]; - - dstinc = dststride - 2*w; - yinc = 2*srcstride[0] - w; - uinc = srcstride[1] - w/2; - vinc = srcstride[2] - w/2; - - for (i = h/2; i; i--) { - for (j = w/2; j; j--) { - *dst++ = (*y1++ + *y2++)>>1; - *dst++ = *u++; - *dst++ = (*y1++ + *y2++)>>1; - *dst++ = *v++; - } - y1 += yinc; - y2 += yinc; - u += uinc; - v += vinc; - dst += dstinc; - } -} - -static void (*halfpack)(unsigned char *dst, unsigned char *src[3], - int dststride, int srcstride[3], int w, int h); - - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - const uint8_t *src[MP_MAX_PLANES] = { - mpi->planes[0] + mpi->stride[0]*vf->priv->field, - mpi->planes[1], mpi->planes[2], NULL}; - int src_stride[MP_MAX_PLANES] = {mpi->stride[0]*2, mpi->stride[1], mpi->stride[2], 0}; - mp_image_t *dmpi; - - // hope we'll get DR buffer: - dmpi=vf_get_image(vf->next, IMGFMT_YUY2, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->w, mpi->h/2); - - switch(vf->priv->field) { - case 0: - case 1: - sws_scale(vf->priv->ctx, src, src_stride, - 0, mpi->h/2, dmpi->planes, dmpi->stride); - break; - default: - halfpack(dmpi->planes[0], mpi->planes, dmpi->stride[0], - mpi->stride, mpi->w, mpi->h); - } - - return vf_next_put_image(vf,dmpi, pts); -} - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt) -{ - if (vf->priv->field < 2) { - sws_freeContext(vf->priv->ctx); - // get unscaled 422p -> yuy2 conversion - vf->priv->ctx = - sws_getContext(width, height / 2, PIX_FMT_YUV422P, - width, height / 2, PIX_FMT_YUYV422, - SWS_POINT | SWS_PRINT_INFO, - NULL, NULL, NULL); - } - /* FIXME - also support UYVY output? */ - return vf_next_config(vf, width, height/2, d_width, d_height, flags, IMGFMT_YUY2); -} - - -static int query_format(struct vf_instance *vf, unsigned int fmt) -{ - /* FIXME - really any YUV 4:2:0 input format should work */ - switch (fmt) { - case IMGFMT_YV12: - case IMGFMT_IYUV: - case IMGFMT_I420: - return vf_next_query_format(vf,IMGFMT_YUY2); - } - return 0; -} - -static void uninit(struct vf_instance *vf) -{ - sws_freeContext(vf->priv->ctx); - free(vf->priv); -} - -static int vf_open(vf_instance_t *vf, char *args) -{ - vf->config=config; - vf->query_format=query_format; - vf->put_image=put_image; - vf->uninit=uninit; - - vf->priv = calloc(1, sizeof (struct vf_priv_s)); - vf->priv->field = 2; - if (args) sscanf(args, "%d", &vf->priv->field); - - halfpack = halfpack_C; -#if HAVE_MMX - if(gCpuCaps.hasMMX) halfpack = halfpack_MMX; -#endif - return 1; -} - -const vf_info_t vf_info_halfpack = { - "yuv planar 4:2:0 -> packed 4:2:2, half height", - "halfpack", - "Richard Felker", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_harddup.c b/libmpcodecs/vf_harddup.c deleted file mode 100644 index b2b1bd6483..0000000000 --- a/libmpcodecs/vf_harddup.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -struct vf_priv_s { - mp_image_t *last_mpi; -}; - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - mp_image_t *dmpi; - - vf->priv->last_mpi = mpi; - - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_EXPORT, 0, mpi->width, mpi->height); - - dmpi->planes[0] = mpi->planes[0]; - dmpi->stride[0] = mpi->stride[0]; - if (dmpi->flags&MP_IMGFLAG_PLANAR) { - dmpi->planes[1] = mpi->planes[1]; - dmpi->stride[1] = mpi->stride[1]; - dmpi->planes[2] = mpi->planes[2]; - dmpi->stride[2] = mpi->stride[2]; - } - - return vf_next_put_image(vf, dmpi, pts); -} - -static int control(struct vf_instance *vf, int request, void* data) -{ - switch (request) { - case VFCTRL_DUPLICATE_FRAME: - if (!vf->priv->last_mpi) break; - // This is a huge hack. We assume nothing - // has been called earlier in the filter chain - // since the last put_image. This is reasonable - // because we're handling a duplicate frame! - if (put_image(vf, vf->priv->last_mpi, MP_NOPTS_VALUE)) - return CONTROL_TRUE; - break; - } - return vf_next_control(vf, request, data); -} - -static void uninit(struct vf_instance *vf) -{ - free(vf->priv); -} - -static int vf_open(vf_instance_t *vf, char *args) -{ - vf->put_image = put_image; - vf->control = control; - vf->uninit = uninit; - vf->priv = calloc(1, sizeof(struct vf_priv_s)); - return 1; -} - -const vf_info_t vf_info_harddup = { - "resubmit duplicate frames for encoding", - "harddup", - "Rich Felker", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_hue.c b/libmpcodecs/vf_hue.c deleted file mode 100644 index 47fe19ac57..0000000000 --- a/libmpcodecs/vf_hue.c +++ /dev/null @@ -1,200 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <math.h> - -#include "config.h" -#include "mp_msg.h" -#include "cpudetect.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -#include "libvo/video_out.h" - -#include "m_option.h" -#include "m_struct.h" - -static struct vf_priv_s { - uint8_t *buf[2]; - float hue; - float saturation; -} const vf_priv_dflt = { - {NULL, NULL}, - 0.0, - 1.0, -}; - -static void process_C(uint8_t *udst, uint8_t *vdst, uint8_t *usrc, uint8_t *vsrc, int dststride, int srcstride, - int w, int h, float hue, float sat) -{ - int i; - const int s= rint(sin(hue) * (1<<16) * sat); - const int c= rint(cos(hue) * (1<<16) * sat); - - while (h--) { - for (i = 0; i<w; i++) - { - const int u= usrc[i] - 128; - const int v= vsrc[i] - 128; - int new_u= (c*u - s*v + (1<<15) + (128<<16))>>16; - int new_v= (s*u + c*v + (1<<15) + (128<<16))>>16; - if(new_u & 768) new_u= (-new_u)>>31; - if(new_v & 768) new_v= (-new_v)>>31; - udst[i]= new_u; - vdst[i]= new_v; - } - usrc += srcstride; - vsrc += srcstride; - udst += dststride; - vdst += dststride; - } -} - -static void (*process)(uint8_t *udst, uint8_t *vdst, uint8_t *usrc, uint8_t *vsrc, int dststride, int srcstride, - int w, int h, float hue, float sat); - -/* FIXME: add packed yuv version of process */ - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - mp_image_t *dmpi; - - dmpi=vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_EXPORT, 0, - mpi->w, mpi->h); - - dmpi->planes[0] = mpi->planes[0]; - dmpi->stride[0] = mpi->stride[0]; - dmpi->stride[1] = mpi->stride[1]; - dmpi->stride[2] = mpi->stride[2]; - - if (!vf->priv->buf[0]){ - vf->priv->buf[0] = malloc(mpi->stride[1]*mpi->h >> mpi->chroma_y_shift); - vf->priv->buf[1] = malloc(mpi->stride[2]*mpi->h >> mpi->chroma_y_shift); - } - - if (vf->priv->hue == 0 && vf->priv->saturation == 1){ - dmpi->planes[1] = mpi->planes[1]; - dmpi->planes[2] = mpi->planes[2]; - }else { - dmpi->planes[1] = vf->priv->buf[0]; - dmpi->planes[2] = vf->priv->buf[1]; - process(dmpi->planes[1], dmpi->planes[2], - mpi->planes[1], mpi->planes[2], - dmpi->stride[1],mpi->stride[1], - mpi->w>> mpi->chroma_x_shift, mpi->h>> mpi->chroma_y_shift, - vf->priv->hue, vf->priv->saturation); - } - - return vf_next_put_image(vf,dmpi, pts); -} - -static int control(struct vf_instance *vf, int request, void* data) -{ - vf_equalizer_t *eq; - - switch (request) { - case VFCTRL_SET_EQUALIZER: - eq = data; - if (!strcmp(eq->item,"hue")) { - vf->priv->hue = eq->value * M_PI / 100; - return CONTROL_TRUE; - } else if (!strcmp(eq->item,"saturation")) { - vf->priv->saturation = (eq->value + 100)/100.0; - return CONTROL_TRUE; - } - break; - case VFCTRL_GET_EQUALIZER: - eq = data; - if (!strcmp(eq->item,"hue")) { - eq->value = rint(vf->priv->hue *100 / M_PI); - return CONTROL_TRUE; - }else if (!strcmp(eq->item,"saturation")) { - eq->value = rint(vf->priv->saturation*100 - 100); - return CONTROL_TRUE; - } - break; - } - return vf_next_control(vf, request, data); -} - -static int query_format(struct vf_instance *vf, unsigned int fmt) -{ - switch (fmt) { - case IMGFMT_YVU9: - case IMGFMT_IF09: - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_CLPL: - case IMGFMT_444P: - case IMGFMT_422P: - case IMGFMT_411P: - return vf_next_query_format(vf, fmt); - } - return 0; -} - -static void uninit(struct vf_instance *vf) -{ - free(vf->priv->buf[0]); - free(vf->priv->buf[1]); - free(vf->priv); -} - -static int vf_open(vf_instance_t *vf, char *args) -{ - vf->control=control; - vf->query_format=query_format; - vf->put_image=put_image; - vf->uninit=uninit; - - vf->priv->hue *= M_PI / 180.0; - - process = process_C; - return 1; -} - -#define ST_OFF(f) M_ST_OFF(struct vf_priv_s,f) -static const m_option_t vf_opts_fields[] = { - {"hue", ST_OFF(hue), CONF_TYPE_FLOAT, M_OPT_RANGE,-180.0 ,180.0, NULL}, - {"saturation", ST_OFF(saturation), CONF_TYPE_FLOAT, M_OPT_RANGE,-10.0 ,10.0, NULL}, - { NULL, NULL, 0, 0, 0, 0, NULL } -}; - -static const m_struct_t vf_opts = { - "hue", - sizeof(struct vf_priv_s), - &vf_priv_dflt, - vf_opts_fields -}; - -const vf_info_t vf_info_hue = { - "hue changer", - "hue", - "Michael Niedermayer", - "", - vf_open, - &vf_opts -}; diff --git a/libmpcodecs/vf_il.c b/libmpcodecs/vf_il.c deleted file mode 100644 index f209197376..0000000000 --- a/libmpcodecs/vf_il.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <assert.h> - -#include "mp_msg.h" -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" -#include "libvo/fastmemcpy.h" - - -//===========================================================================// - -typedef struct FilterParam{ - int interleave; - int swap; -}FilterParam; - -struct vf_priv_s { - FilterParam lumaParam; - FilterParam chromaParam; -}; - -/***************************************************************************/ - -static void interleave(uint8_t *dst, uint8_t *src, int w, int h, int dstStride, int srcStride, int interleave, int swap){ - const int a= swap; - const int b= 1-a; - const int m= h>>1; - int y; - - switch(interleave){ - case -1: - for(y=0; y < m; y++){ - fast_memcpy(dst + dstStride* y , src + srcStride*(y*2 + a), w); - fast_memcpy(dst + dstStride*(y + m), src + srcStride*(y*2 + b), w); - } - break; - case 0: - for(y=0; y < m; y++){ - fast_memcpy(dst + dstStride* y*2 , src + srcStride*(y*2 + a), w); - fast_memcpy(dst + dstStride*(y*2+1), src + srcStride*(y*2 + b), w); - } - break; - case 1: - for(y=0; y < m; y++){ - fast_memcpy(dst + dstStride*(y*2+a), src + srcStride* y , w); - fast_memcpy(dst + dstStride*(y*2+b), src + srcStride*(y + m), w); - } - break; - } -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - int w; - FilterParam *luma = &vf->priv->lumaParam; - FilterParam *chroma= &vf->priv->chromaParam; - - mp_image_t *dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->w,mpi->h); - - if(mpi->flags&MP_IMGFLAG_PLANAR) - w= mpi->w; - else - w= mpi->w * mpi->bpp/8; - - interleave(dmpi->planes[0], mpi->planes[0], - w, mpi->h, dmpi->stride[0], mpi->stride[0], luma->interleave, luma->swap); - - if(mpi->flags&MP_IMGFLAG_PLANAR){ - int cw= mpi->w >> mpi->chroma_x_shift; - int ch= mpi->h >> mpi->chroma_y_shift; - - interleave(dmpi->planes[1], mpi->planes[1], cw,ch, - dmpi->stride[1], mpi->stride[1], chroma->interleave, luma->swap); - interleave(dmpi->planes[2], mpi->planes[2], cw,ch, - dmpi->stride[2], mpi->stride[2], chroma->interleave, luma->swap); - } - - return vf_next_put_image(vf,dmpi, pts); -} - -//===========================================================================// - -static void parse(FilterParam *fp, char* args){ - char *pos; - char *max= strchr(args, ':'); - - if(!max) max= args + strlen(args); - - pos= strchr(args, 's'); - if(pos && pos<max) fp->swap=1; - pos= strchr(args, 'i'); - if(pos && pos<max) fp->interleave=1; - pos= strchr(args, 'd'); - if(pos && pos<max) fp->interleave=-1; -} - -static int vf_open(vf_instance_t *vf, char *args){ - - vf->put_image=put_image; -// vf->get_image=get_image; - vf->priv=malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - - if(args) - { - char *arg2= strchr(args,':'); - if(arg2) parse(&vf->priv->chromaParam, arg2+1); - parse(&vf->priv->lumaParam, args); - } - - return 1; -} - -const vf_info_t vf_info_il = { - "(de)interleave", - "il", - "Michael Niedermayer", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_ivtc.c b/libmpcodecs/vf_ivtc.c deleted file mode 100644 index 966292ff14..0000000000 --- a/libmpcodecs/vf_ivtc.c +++ /dev/null @@ -1,555 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "config.h" -#include "mp_msg.h" -#include "cpudetect.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -#include "libvo/fastmemcpy.h" - - -struct metrics { - /* difference: total, even lines, odd lines */ - int d, e, o; - /* noise: temporal, spacial (current), spacial (past) */ - int t, s, p; -}; - -struct frameinfo { - /* peak, relative, mean */ - struct metrics p, r, m; -}; - -struct vf_priv_s { - struct frameinfo fi[2]; - mp_image_t *dmpi; - int first; - int drop, lastdrop, dropnext; - int inframes, outframes; - struct vf_detc_pts_buf ptsbuf; -}; - -enum { - F_DROP, - F_MERGE, - F_NEXT, - F_SHOW -}; - -#if HAVE_MMX && HAVE_EBX_AVAILABLE -static void block_diffs_MMX(struct metrics *m, unsigned char *old, unsigned char *new, int os, int ns) -{ - int i; - short out[24]; // output buffer for the partial metrics from the mmx code - - __asm__ ( - "movl $4, %%ecx \n\t" - "pxor %%mm4, %%mm4 \n\t" // 4 even difference sums - "pxor %%mm5, %%mm5 \n\t" // 4 odd difference sums - "pxor %%mm7, %%mm7 \n\t" // all zeros - - ASMALIGN(4) - "1: \n\t" - - // Even difference - "movq (%%"REG_S"), %%mm0 \n\t" - "movq (%%"REG_S"), %%mm2 \n\t" - "add %%"REG_a", %%"REG_S" \n\t" - "movq (%%"REG_D"), %%mm1 \n\t" - "add %%"REG_b", %%"REG_D" \n\t" - "psubusb %%mm1, %%mm2 \n\t" - "psubusb %%mm0, %%mm1 \n\t" - "movq %%mm2, %%mm0 \n\t" - "movq %%mm1, %%mm3 \n\t" - "punpcklbw %%mm7, %%mm0 \n\t" - "punpcklbw %%mm7, %%mm1 \n\t" - "punpckhbw %%mm7, %%mm2 \n\t" - "punpckhbw %%mm7, %%mm3 \n\t" - "paddw %%mm0, %%mm4 \n\t" - "paddw %%mm1, %%mm4 \n\t" - "paddw %%mm2, %%mm4 \n\t" - "paddw %%mm3, %%mm4 \n\t" - - // Odd difference - "movq (%%"REG_S"), %%mm0 \n\t" - "movq (%%"REG_S"), %%mm2 \n\t" - "add %%"REG_a", %%"REG_S" \n\t" - "movq (%%"REG_D"), %%mm1 \n\t" - "add %%"REG_b", %%"REG_D" \n\t" - "psubusb %%mm1, %%mm2 \n\t" - "psubusb %%mm0, %%mm1 \n\t" - "movq %%mm2, %%mm0 \n\t" - "movq %%mm1, %%mm3 \n\t" - "punpcklbw %%mm7, %%mm0 \n\t" - "punpcklbw %%mm7, %%mm1 \n\t" - "punpckhbw %%mm7, %%mm2 \n\t" - "punpckhbw %%mm7, %%mm3 \n\t" - "paddw %%mm0, %%mm5 \n\t" - "paddw %%mm1, %%mm5 \n\t" - "paddw %%mm2, %%mm5 \n\t" - "paddw %%mm3, %%mm5 \n\t" - - "decl %%ecx \n\t" - "jnz 1b \n\t" - "movq %%mm4, (%%"REG_d") \n\t" - "movq %%mm5, 8(%%"REG_d") \n\t" - : - : "S" (old), "D" (new), "a" (os), "b" (ns), "d" (out) - : "memory" - ); - m->e = out[0]+out[1]+out[2]+out[3]; - m->o = out[4]+out[5]+out[6]+out[7]; - m->d = m->e + m->o; - - __asm__ ( - // First loop to measure first four columns - "movl $4, %%ecx \n\t" - "pxor %%mm4, %%mm4 \n\t" // Past spacial noise - "pxor %%mm5, %%mm5 \n\t" // Temporal noise - "pxor %%mm6, %%mm6 \n\t" // Current spacial noise - - ASMALIGN(4) - "2: \n\t" - - "movq (%%"REG_S"), %%mm0 \n\t" - "movq (%%"REG_S",%%"REG_a"), %%mm1 \n\t" - "add %%"REG_a", %%"REG_S" \n\t" - "add %%"REG_a", %%"REG_S" \n\t" - "movq (%%"REG_D"), %%mm2 \n\t" - "movq (%%"REG_D",%%"REG_b"), %%mm3 \n\t" - "add %%"REG_b", %%"REG_D" \n\t" - "add %%"REG_b", %%"REG_D" \n\t" - "punpcklbw %%mm7, %%mm0 \n\t" - "punpcklbw %%mm7, %%mm1 \n\t" - "punpcklbw %%mm7, %%mm2 \n\t" - "punpcklbw %%mm7, %%mm3 \n\t" - "paddw %%mm1, %%mm4 \n\t" - "paddw %%mm1, %%mm5 \n\t" - "paddw %%mm3, %%mm6 \n\t" - "psubw %%mm0, %%mm4 \n\t" - "psubw %%mm2, %%mm5 \n\t" - "psubw %%mm2, %%mm6 \n\t" - - "decl %%ecx \n\t" - "jnz 2b \n\t" - - "movq %%mm0, %%mm1 \n\t" - "movq %%mm0, %%mm2 \n\t" - "movq %%mm0, %%mm3 \n\t" - "pcmpgtw %%mm4, %%mm1 \n\t" - "pcmpgtw %%mm5, %%mm2 \n\t" - "pcmpgtw %%mm6, %%mm3 \n\t" - "pxor %%mm1, %%mm4 \n\t" - "pxor %%mm2, %%mm5 \n\t" - "pxor %%mm3, %%mm6 \n\t" - "psubw %%mm1, %%mm4 \n\t" - "psubw %%mm2, %%mm5 \n\t" - "psubw %%mm3, %%mm6 \n\t" - "movq %%mm4, (%%"REG_d") \n\t" - "movq %%mm5, 16(%%"REG_d") \n\t" - "movq %%mm6, 32(%%"REG_d") \n\t" - - "mov %%"REG_a", %%"REG_c" \n\t" - "shl $3, %%"REG_c" \n\t" - "sub %%"REG_c", %%"REG_S" \n\t" - "mov %%"REG_b", %%"REG_c" \n\t" - "shl $3, %%"REG_c" \n\t" - "sub %%"REG_c", %%"REG_D" \n\t" - - // Second loop for the last four columns - "movl $4, %%ecx \n\t" - "pxor %%mm4, %%mm4 \n\t" - "pxor %%mm5, %%mm5 \n\t" - "pxor %%mm6, %%mm6 \n\t" - - ASMALIGN(4) - "3: \n\t" - - "movq (%%"REG_S"), %%mm0 \n\t" - "movq (%%"REG_S",%%"REG_a"), %%mm1 \n\t" - "add %%"REG_a", %%"REG_S" \n\t" - "add %%"REG_a", %%"REG_S" \n\t" - "movq (%%"REG_D"), %%mm2 \n\t" - "movq (%%"REG_D",%%"REG_b"), %%mm3 \n\t" - "add %%"REG_b", %%"REG_D" \n\t" - "add %%"REG_b", %%"REG_D" \n\t" - "punpckhbw %%mm7, %%mm0 \n\t" - "punpckhbw %%mm7, %%mm1 \n\t" - "punpckhbw %%mm7, %%mm2 \n\t" - "punpckhbw %%mm7, %%mm3 \n\t" - "paddw %%mm1, %%mm4 \n\t" - "paddw %%mm1, %%mm5 \n\t" - "paddw %%mm3, %%mm6 \n\t" - "psubw %%mm0, %%mm4 \n\t" - "psubw %%mm2, %%mm5 \n\t" - "psubw %%mm2, %%mm6 \n\t" - - "decl %%ecx \n\t" - "jnz 3b \n\t" - - "movq %%mm0, %%mm1 \n\t" - "movq %%mm0, %%mm2 \n\t" - "movq %%mm0, %%mm3 \n\t" - "pcmpgtw %%mm4, %%mm1 \n\t" - "pcmpgtw %%mm5, %%mm2 \n\t" - "pcmpgtw %%mm6, %%mm3 \n\t" - "pxor %%mm1, %%mm4 \n\t" - "pxor %%mm2, %%mm5 \n\t" - "pxor %%mm3, %%mm6 \n\t" - "psubw %%mm1, %%mm4 \n\t" - "psubw %%mm2, %%mm5 \n\t" - "psubw %%mm3, %%mm6 \n\t" - "movq %%mm4, 8(%%"REG_d") \n\t" - "movq %%mm5, 24(%%"REG_d") \n\t" - "movq %%mm6, 40(%%"REG_d") \n\t" - - "emms \n\t" - : - : "S" (old), "D" (new), "a" ((long)os), "b" ((long)ns), "d" (out) - : "memory" - ); - m->p = m->t = m->s = 0; - for (i=0; i<8; i++) { - m->p += out[i]; - m->t += out[8+i]; - m->s += out[16+i]; - } - //printf("e=%d o=%d d=%d p=%d t=%d s=%d\n", m->e, m->o, m->d, m->p, m->t, m->s); -} -#endif - -//#define MAG(a) ((a)*(a)) -//#define MAG(a) (abs(a)) -#define MAG(a) (((a)^((a)>>31))-((a)>>31)) - -//#define LOWPASS(s) (((s)[-2] + 4*(s)[-1] + 6*(s)[0] + 4*(s)[1] + (s)[2])>>4) -//#define LOWPASS(s) (((s)[-1] + 2*(s)[0] + (s)[1])>>2) -#define LOWPASS(s) ((s)[0]) - - -static void block_diffs_C(struct metrics *m, unsigned char *old, unsigned char *new, int os, int ns) -{ - int x, y, e=0, o=0, s=0, p=0, t=0; - unsigned char *oldp, *newp; - m->s = m->p = m->t = 0; - for (x = 8; x; x--) { - oldp = old++; - newp = new++; - s = p = t = 0; - for (y = 4; y; y--) { - e += MAG(newp[0]-oldp[0]); - o += MAG(newp[ns]-oldp[os]); - s += newp[ns]-newp[0]; - p += oldp[os]-oldp[0]; - t += oldp[os]-newp[0]; - oldp += os<<1; - newp += ns<<1; - } - m->s += MAG(s); - m->p += MAG(p); - m->t += MAG(t); - } - m->e = e; - m->o = o; - m->d = e+o; -} - -static void (*block_diffs)(struct metrics *, unsigned char *, unsigned char *, int, int); - -#define MAXUP(a,b) ((a) = ((a)>(b)) ? (a) : (b)) - -static void diff_planes(struct frameinfo *fi, - unsigned char *old, unsigned char *new, int w, int h, int os, int ns) -{ - int x, y; - struct metrics l; - struct metrics *peak=&fi->p, *rel=&fi->r, *mean=&fi->m; - memset(peak, 0, sizeof(struct metrics)); - memset(rel, 0, sizeof(struct metrics)); - memset(mean, 0, sizeof(struct metrics)); - for (y = 0; y < h-7; y += 8) { - for (x = 8; x < w-8-7; x += 8) { - block_diffs(&l, old+x+y*os, new+x+y*ns, os, ns); - mean->d += l.d; - mean->e += l.e; - mean->o += l.o; - mean->s += l.s; - mean->p += l.p; - mean->t += l.t; - MAXUP(peak->d, l.d); - MAXUP(peak->e, l.e); - MAXUP(peak->o, l.o); - MAXUP(peak->s, l.s); - MAXUP(peak->p, l.p); - MAXUP(peak->t, l.t); - MAXUP(rel->e, l.e-l.o); - MAXUP(rel->o, l.o-l.e); - MAXUP(rel->s, l.s-l.t); - MAXUP(rel->p, l.p-l.t); - MAXUP(rel->t, l.t-l.p); - MAXUP(rel->d, l.t-l.s); /* hack */ - } - } - x = (w/8-2)*(h/8); - mean->d /= x; - mean->e /= x; - mean->o /= x; - mean->s /= x; - mean->p /= x; - mean->t /= x; -} - -static void diff_fields(struct frameinfo *fi, mp_image_t *old, mp_image_t *new) -{ - diff_planes(fi, old->planes[0], new->planes[0], - new->w, new->h, old->stride[0], new->stride[0]); -} - -static void stats(struct frameinfo *f) -{ - mp_msg(MSGT_VFILTER, MSGL_V, " pd=%d re=%d ro=%d rp=%d rt=%d rs=%d rd=%d pp=%d pt=%d ps=%d\r", - f->p.d, f->r.e, f->r.o, f->r.p, f->r.t, f->r.s, f->r.d, f->p.p, f->p.t, f->p.s); -} - -static int foo(struct vf_priv_s *p, mp_image_t *new, mp_image_t *cur) -{ - struct frameinfo *f = p->fi; - - f[0] = f[1]; - diff_fields(&f[1], cur, new); - stats(&f[1]); - - // Immediately drop this frame if it's already been used. - if (p->dropnext) { - p->dropnext = 0; - return F_DROP; - } - - // Sometimes a pulldown frame comes all by itself, so both - // its top and bottom field are duplicates from the adjacent - // two frames. We can just drop such a frame, but we - // immediately show the next frame instead to keep the frame - // drops evenly spaced during normal 3:2 pulldown sequences. - if ((3*f[1].r.o < f[1].r.e) && (f[1].r.s < f[1].r.d)) { - p->dropnext = 1; - return F_NEXT; - } - - // If none of these conditions hold, we will consider the frame - // progressive and just show it as-is. - if (!( (3*f[0].r.e < f[0].r.o) || - ((2*f[0].r.d < f[0].r.s) && (f[0].r.s > 1200)) || - ((2*f[1].r.t < f[1].r.p) && (f[1].r.p > 1200)) )) - return F_SHOW; - - // Otherwise, we have to decide whether to merge or drop. - // If the noise metric only increases minimally, we're off - // to a good start... - if (((2*f[1].r.t < 3*f[1].r.p) && (f[1].r.t < 3600)) || - (f[1].r.t < 900) || (f[1].r.d < 900)) { - // ...and if noise decreases or the duplicate even field - // is detected, we go ahead with the merge. - if ((3*f[0].r.e < f[0].r.o) || (2*f[1].r.t < f[1].r.p)) { - p->dropnext = 1; - return F_MERGE; - } - } - return F_DROP; -} - - - -static void copy_image(mp_image_t *dmpi, mp_image_t *mpi, int field) -{ - switch (field) { - case 0: - my_memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h/2, - dmpi->stride[0]*2, mpi->stride[0]*2); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - my_memcpy_pic(dmpi->planes[1], mpi->planes[1], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[1]*2, mpi->stride[1]*2); - my_memcpy_pic(dmpi->planes[2], mpi->planes[2], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[2]*2, mpi->stride[2]*2); - } - break; - case 1: - my_memcpy_pic(dmpi->planes[0]+dmpi->stride[0], - mpi->planes[0]+mpi->stride[0], mpi->w, mpi->h/2, - dmpi->stride[0]*2, mpi->stride[0]*2); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - my_memcpy_pic(dmpi->planes[1]+dmpi->stride[1], - mpi->planes[1]+mpi->stride[1], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[1]*2, mpi->stride[1]*2); - my_memcpy_pic(dmpi->planes[2]+dmpi->stride[2], - mpi->planes[2]+mpi->stride[2], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[2]*2, mpi->stride[2]*2); - } - break; - case 2: - memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h, - dmpi->stride[0], mpi->stride[0]); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - memcpy_pic(dmpi->planes[1], mpi->planes[1], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[1], mpi->stride[1]); - memcpy_pic(dmpi->planes[2], mpi->planes[2], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[2], mpi->stride[2]); - } - break; - } -} - -static int do_put_image(struct vf_instance *vf, mp_image_t *dmpi, double pts) -{ - struct vf_priv_s *p = vf->priv; - int dropflag=0; - - if (!p->dropnext) switch (p->drop) { - case 0: - dropflag = 0; - break; - case 1: - dropflag = (++p->lastdrop >= 5); - break; - case 2: - dropflag = (++p->lastdrop >= 5) && (4*p->inframes <= 5*p->outframes); - break; - } - - if (dropflag) { - //mp_msg(MSGT_VFILTER, MSGL_V, "drop! [%d/%d=%g]\n", - // p->outframes, p->inframes, (float)p->outframes/p->inframes); - mp_msg(MSGT_VFILTER, MSGL_V, "!"); - p->lastdrop = 0; - vf_detc_adjust_pts(&p->ptsbuf, pts, 0, 1); - return 0; - } - - p->outframes++; - return vf_next_put_image(vf, dmpi, vf_detc_adjust_pts(&p->ptsbuf, pts, 0, 0)); -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - int ret=0; - struct vf_priv_s *p = vf->priv; - - p->inframes++; - - if (p->first) { /* hack */ - p->first = 0; - vf_detc_adjust_pts(&p->ptsbuf, pts, 0, 1); - return 1; - } - - if (!p->dmpi) p->dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE | - MP_IMGFLAG_PRESERVE | MP_IMGFLAG_READABLE, - mpi->width, mpi->height); - /* FIXME -- not correct, off by one frame! */ - p->dmpi->qscale = mpi->qscale; - p->dmpi->qstride = mpi->qstride; - p->dmpi->qscale_type = mpi->qscale_type; - - switch (foo(p, mpi, p->dmpi)) { - case F_DROP: - copy_image(p->dmpi, mpi, 2); - ret = 0; - p->lastdrop = 0; - mp_msg(MSGT_VFILTER, MSGL_V, "DROP\n"); - vf_detc_adjust_pts(&p->ptsbuf, pts, 0, 1); - break; - case F_MERGE: - copy_image(p->dmpi, mpi, 0); - ret = do_put_image(vf, p->dmpi, pts); - copy_image(p->dmpi, mpi, 1); - mp_msg(MSGT_VFILTER, MSGL_V, "MERGE\n"); - p->dmpi = NULL; - break; - case F_NEXT: - copy_image(p->dmpi, mpi, 2); - ret = do_put_image(vf, p->dmpi, pts); - mp_msg(MSGT_VFILTER, MSGL_V, "NEXT\n"); - p->dmpi = NULL; - break; - case F_SHOW: - ret = do_put_image(vf, p->dmpi, pts); - copy_image(p->dmpi, mpi, 2); - mp_msg(MSGT_VFILTER, MSGL_V, "OK\n"); - p->dmpi = NULL; - break; - } - return ret; -} - -static int query_format(struct vf_instance *vf, unsigned int fmt) -{ - switch (fmt) { - case IMGFMT_YV12: - case IMGFMT_IYUV: - case IMGFMT_I420: - return vf_next_query_format(vf, fmt); - } - return 0; -} - -static void uninit(struct vf_instance *vf) -{ - free(vf->priv); -} - -static int vf_open(vf_instance_t *vf, char *args) -{ - struct vf_priv_s *p; - vf->put_image = put_image; - vf->query_format = query_format; - vf->uninit = uninit; - vf->default_reqs = VFCAP_ACCEPT_STRIDE; - vf->priv = p = calloc(1, sizeof(struct vf_priv_s)); - p->drop = 0; - p->first = 1; - if (args) sscanf(args, "%d", &p->drop); - block_diffs = block_diffs_C; -#if HAVE_MMX && HAVE_EBX_AVAILABLE - if(gCpuCaps.hasMMX) block_diffs = block_diffs_MMX; -#endif - vf_detc_init_pts_buf(&p->ptsbuf); - return 1; -} - -const vf_info_t vf_info_ivtc = { - "inverse telecine, take 2", - "ivtc", - "Rich Felker", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_kerndeint.c b/libmpcodecs/vf_kerndeint.c deleted file mode 100644 index c6fb389f3a..0000000000 --- a/libmpcodecs/vf_kerndeint.c +++ /dev/null @@ -1,345 +0,0 @@ -/* - * Original AVISynth Filter Copyright (C) 2003 Donald A. Graft - * Adapted to MPlayer by Tobias Diedrich - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <math.h> - -#include "mp_msg.h" -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" -#include "libvo/fastmemcpy.h" - -//===========================================================================// - -struct vf_priv_s { - int frame; - int map; - int order; - int thresh; - int sharp; - int twoway; - int do_deinterlace; -}; - - -/***************************************************************************/ - - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - - -static void uninit(struct vf_instance *vf) -{ - free(vf->priv); -} - -static inline int IsRGB(mp_image_t *mpi) -{ - return mpi->imgfmt == IMGFMT_RGB; -} - -static inline int IsYUY2(mp_image_t *mpi) -{ - return mpi->imgfmt == IMGFMT_YUY2; -} - -#define PLANAR_Y 0 -#define PLANAR_U 1 -#define PLANAR_V 2 - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - int cw= mpi->w >> mpi->chroma_x_shift; - int ch= mpi->h >> mpi->chroma_y_shift; - int W = mpi->w, H = mpi->h; - const unsigned char *prvp, *prvpp, *prvpn, *prvpnn, *prvppp, *prvp4p, *prvp4n; - const unsigned char *srcp_saved; - const unsigned char *srcp, *srcpp, *srcpn, *srcpnn, *srcppp, *srcp3p, *srcp3n, *srcp4p, *srcp4n; - unsigned char *dstp, *dstp_saved; - int src_pitch; - int psrc_pitch; - int dst_pitch; - int x, y, z; - int n = vf->priv->frame++; - int val, hi, lo, w, h; - double valf; - int plane; - int threshold = vf->priv->thresh; - int order = vf->priv->order; - int map = vf->priv->map; - int sharp = vf->priv->sharp; - int twoway = vf->priv->twoway; - mp_image_t *dmpi, *pmpi; - - if(!vf->priv->do_deinterlace) - return vf_next_put_image(vf, mpi, pts); - - dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_IP, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->w,mpi->h); - pmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->w,mpi->h); - if(!dmpi) return 0; - - for (z=0; z<mpi->num_planes; z++) { - if (z == 0) plane = PLANAR_Y; - else if (z == 1) plane = PLANAR_U; - else plane = PLANAR_V; - - h = plane == PLANAR_Y ? H : ch; - w = plane == PLANAR_Y ? W : cw; - - srcp = srcp_saved = mpi->planes[z]; - src_pitch = mpi->stride[z]; - psrc_pitch = pmpi->stride[z]; - dstp = dstp_saved = dmpi->planes[z]; - dst_pitch = dmpi->stride[z]; - srcp = srcp_saved + (1-order) * src_pitch; - dstp = dstp_saved + (1-order) * dst_pitch; - - for (y=0; y<h; y+=2) { - fast_memcpy(dstp, srcp, w); - srcp += 2*src_pitch; - dstp += 2*dst_pitch; - } - - // Copy through the lines that will be missed below. - fast_memcpy(dstp_saved + order*dst_pitch, srcp_saved + (1-order)*src_pitch, w); - fast_memcpy(dstp_saved + (2+order)*dst_pitch, srcp_saved + (3-order)*src_pitch, w); - fast_memcpy(dstp_saved + (h-2+order)*dst_pitch, srcp_saved + (h-1-order)*src_pitch, w); - fast_memcpy(dstp_saved + (h-4+order)*dst_pitch, srcp_saved + (h-3-order)*src_pitch, w); - /* For the other field choose adaptively between using the previous field - or the interpolant from the current field. */ - - prvp = pmpi->planes[z] + 5*psrc_pitch - (1-order)*psrc_pitch; - prvpp = prvp - psrc_pitch; - prvppp = prvp - 2*psrc_pitch; - prvp4p = prvp - 4*psrc_pitch; - prvpn = prvp + psrc_pitch; - prvpnn = prvp + 2*psrc_pitch; - prvp4n = prvp + 4*psrc_pitch; - srcp = srcp_saved + 5*src_pitch - (1-order)*src_pitch; - srcpp = srcp - src_pitch; - srcppp = srcp - 2*src_pitch; - srcp3p = srcp - 3*src_pitch; - srcp4p = srcp - 4*src_pitch; - srcpn = srcp + src_pitch; - srcpnn = srcp + 2*src_pitch; - srcp3n = srcp + 3*src_pitch; - srcp4n = srcp + 4*src_pitch; - dstp = dstp_saved + 5*dst_pitch - (1-order)*dst_pitch; - for (y = 5 - (1-order); y <= h - 5 - (1-order); y+=2) - { - for (x = 0; x < w; x++) - { - if ((threshold == 0) || (n == 0) || - (abs((int)prvp[x] - (int)srcp[x]) > threshold) || - (abs((int)prvpp[x] - (int)srcpp[x]) > threshold) || - (abs((int)prvpn[x] - (int)srcpn[x]) > threshold)) - { - if (map == 1) - { - int g = x & ~3; - if (IsRGB(mpi) == 1) - { - dstp[g++] = 255; - dstp[g++] = 255; - dstp[g++] = 255; - dstp[g] = 255; - x = g; - } - else if (IsYUY2(mpi) == 1) - { - dstp[g++] = 235; - dstp[g++] = 128; - dstp[g++] = 235; - dstp[g] = 128; - x = g; - } - else - { - if (plane == PLANAR_Y) dstp[x] = 235; - else dstp[x] = 128; - } - } - else - { - if (IsRGB(mpi)) - { - hi = 255; - lo = 0; - } - else if (IsYUY2(mpi)) - { - hi = (x & 1) ? 240 : 235; - lo = 16; - } - else - { - hi = (plane == PLANAR_Y) ? 235 : 240; - lo = 16; - } - - if (sharp == 1) - { - if (twoway == 1) - valf = + 0.526*((int)srcpp[x] + (int)srcpn[x]) - + 0.170*((int)srcp[x] + (int)prvp[x]) - - 0.116*((int)srcppp[x] + (int)srcpnn[x] + (int)prvppp[x] + (int)prvpnn[x]) - - 0.026*((int)srcp3p[x] + (int)srcp3n[x]) - + 0.031*((int)srcp4p[x] + (int)srcp4n[x] + (int)prvp4p[x] + (int)prvp4n[x]); - else - valf = + 0.526*((int)srcpp[x] + (int)srcpn[x]) - + 0.170*((int)prvp[x]) - - 0.116*((int)prvppp[x] + (int)prvpnn[x]) - - 0.026*((int)srcp3p[x] + (int)srcp3n[x]) - + 0.031*((int)prvp4p[x] + (int)prvp4p[x]); - if (valf > hi) valf = hi; - else if (valf < lo) valf = lo; - dstp[x] = (int) valf; - } - else - { - if (twoway == 1) - val = (8*((int)srcpp[x] + (int)srcpn[x]) + 2*((int)srcp[x] + (int)prvp[x]) - - (int)(srcppp[x]) - (int)(srcpnn[x]) - - (int)(prvppp[x]) - (int)(prvpnn[x])) >> 4; - else - val = (8*((int)srcpp[x] + (int)srcpn[x]) + 2*((int)prvp[x]) - - (int)(prvppp[x]) - (int)(prvpnn[x])) >> 4; - if (val > hi) val = hi; - else if (val < lo) val = lo; - dstp[x] = (int) val; - } - } - } - else - { - dstp[x] = srcp[x]; - } - } - prvp += 2*psrc_pitch; - prvpp += 2*psrc_pitch; - prvppp += 2*psrc_pitch; - prvpn += 2*psrc_pitch; - prvpnn += 2*psrc_pitch; - prvp4p += 2*psrc_pitch; - prvp4n += 2*psrc_pitch; - srcp += 2*src_pitch; - srcpp += 2*src_pitch; - srcppp += 2*src_pitch; - srcp3p += 2*src_pitch; - srcp4p += 2*src_pitch; - srcpn += 2*src_pitch; - srcpnn += 2*src_pitch; - srcp3n += 2*src_pitch; - srcp4n += 2*src_pitch; - dstp += 2*dst_pitch; - } - - srcp = mpi->planes[z]; - dstp = pmpi->planes[z]; - for (y=0; y<h; y++) { - fast_memcpy(dstp, srcp, w); - srcp += src_pitch; - dstp += psrc_pitch; - } - } - - return vf_next_put_image(vf,dmpi, pts); -} - -//===========================================================================// - -static int query_format(struct vf_instance *vf, unsigned int fmt){ - switch(fmt) - { - case IMGFMT_YV12: - case IMGFMT_RGB: - case IMGFMT_YUY2: - return vf_next_query_format(vf, fmt); - } - return 0; -} - -static int control(struct vf_instance *vf, int request, void* data){ - switch (request) - { - case VFCTRL_GET_DEINTERLACE: - *(int*)data = vf->priv->do_deinterlace; - return CONTROL_OK; - case VFCTRL_SET_DEINTERLACE: - vf->priv->do_deinterlace = *(int*)data; - return CONTROL_OK; - } - return vf_next_control (vf, request, data); -} - -static int vf_open(vf_instance_t *vf, char *args){ - - vf->control=control; - vf->config=config; - vf->put_image=put_image; - vf->query_format=query_format; - vf->uninit=uninit; - vf->priv=malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - - vf->priv->frame = 0; - - vf->priv->map = 0; - vf->priv->order = 0; - vf->priv->thresh = 10; - vf->priv->sharp = 0; - vf->priv->twoway = 0; - vf->priv->do_deinterlace=1; - - if (args) - { - sscanf(args, "%d:%d:%d:%d:%d", - &vf->priv->thresh, &vf->priv->map, - &vf->priv->order, &vf->priv->sharp, - &vf->priv->twoway); - } - if (vf->priv->order > 1) vf->priv->order = 1; - - return 1; -} - -const vf_info_t vf_info_kerndeint = { - "Kernel Deinterlacer", - "kerndeint", - "Donald Graft", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_lavc.c b/libmpcodecs/vf_lavc.c deleted file mode 100644 index b2c1dd756d..0000000000 --- a/libmpcodecs/vf_lavc.c +++ /dev/null @@ -1,178 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" -#include "libavcodec/avcodec.h" - -struct vf_priv_s { - unsigned char* outbuf; - int outbuf_size; - AVCodecContext* context; - AVFrame* pic; - AVCodec* codec; - vo_mpegpes_t pes; -}; - -#define lavc_venc_context (*vf->priv->context) - -//===========================================================================// - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - if(vf_next_query_format(vf,IMGFMT_MPEGPES)<=0) return 0; - - lavc_venc_context.width = width; - lavc_venc_context.height = height; - - if(!lavc_venc_context.time_base.num || !lavc_venc_context.time_base.den){ - // guess FPS: - switch(height){ - case 240: - case 480: - lavc_venc_context.time_base= (AVRational){1001,30000}; - break; - case 576: - case 288: - default: - lavc_venc_context.time_base= (AVRational){1,25}; - break; -// lavc_venc_context.frame_rate=vo_fps*FRAME_RATE_BASE; // same as src - } - } - - free(vf->priv->outbuf); - - vf->priv->outbuf_size=10000+width*height; // must be enough! - vf->priv->outbuf = malloc(vf->priv->outbuf_size); - - if (avcodec_open2(&lavc_venc_context, vf->priv->codec, NULL) != 0) { - mp_tmsg(MSGT_VFILTER,MSGL_ERR,"Could not open codec.\n"); - return 0; - } - - if (lavc_venc_context.codec->encode == NULL) { - mp_msg(MSGT_VFILTER,MSGL_ERR,"avcodec init failed (ctx->codec->encode == NULL)!\n"); - return 0; - } - - return vf_next_config(vf,width,height,d_width,d_height,flags,IMGFMT_MPEGPES); -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t* dmpi; - int out_size; - AVFrame *pic= vf->priv->pic; - - pic->data[0]=mpi->planes[0]; - pic->data[1]=mpi->planes[1]; - pic->data[2]=mpi->planes[2]; - pic->linesize[0]=mpi->stride[0]; - pic->linesize[1]=mpi->stride[1]; - pic->linesize[2]=mpi->stride[2]; - - out_size = avcodec_encode_video(&lavc_venc_context, - vf->priv->outbuf, vf->priv->outbuf_size, pic); - - if(out_size<=0) return 1; - - dmpi=vf_get_image(vf->next,IMGFMT_MPEGPES, - MP_IMGTYPE_EXPORT, 0, - mpi->w, mpi->h); - - vf->priv->pes.data=vf->priv->outbuf; - vf->priv->pes.size=out_size; - vf->priv->pes.id=0x1E0; - vf->priv->pes.timestamp=-1; // dunno - - dmpi->planes[0]=(unsigned char*)&vf->priv->pes; - - return vf_next_put_image(vf,dmpi, pts); -} - -//===========================================================================// - -static int query_format(struct vf_instance *vf, unsigned int fmt){ - switch(fmt){ - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - return vf_next_query_format(vf, IMGFMT_MPEGPES) & (~(VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_ACCEPT_STRIDE)); - } - return 0; -} - -static int vf_open(vf_instance_t *vf, char *args){ - int p_quality=0; - float p_fps=0; - - vf->config=config; - vf->put_image=put_image; - vf->query_format=query_format; - vf->priv=malloc(sizeof(struct vf_priv_s)); - memset(vf->priv,0,sizeof(struct vf_priv_s)); - - vf->priv->codec = (AVCodec *)avcodec_find_encoder_by_name("mpeg1video"); - if (!vf->priv->codec) { - mp_tmsg(MSGT_VFILTER,MSGL_ERR,"Cannot find codec '%s' in libavcodec...\n", "mpeg1video"); - return 0; - } - - vf->priv->context=avcodec_alloc_context3(vf->priv->codec); - vf->priv->pic = avcodec_alloc_frame(); - - // TODO: parse args -> - if(args) sscanf(args, "%d:%f", &p_quality, &p_fps); - - if(p_quality<32){ - // fixed qscale - lavc_venc_context.flags = CODEC_FLAG_QSCALE; - lavc_venc_context.global_quality = - vf->priv->pic->quality = (int)(FF_QP2LAMBDA * ((p_quality<1) ? 1 : p_quality) + 0.5); - } else { - // fixed bitrate (in kbits) - lavc_venc_context.bit_rate = 1000*p_quality; - } - lavc_venc_context.time_base.num = 1000*1001; - lavc_venc_context.time_base.den = (p_fps<1.0) ? 1000*1001*25 : (p_fps * lavc_venc_context.time_base.num); - lavc_venc_context.gop_size = 0; // I-only - lavc_venc_context.pix_fmt= PIX_FMT_YUV420P; - - return 1; -} - -const vf_info_t vf_info_lavc = { - "realtime mpeg1 encoding with libavcodec", - "lavc", - "A'rpi", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_lavcdeint.c b/libmpcodecs/vf_lavcdeint.c deleted file mode 100644 index 3a67c8db59..0000000000 --- a/libmpcodecs/vf_lavcdeint.c +++ /dev/null @@ -1,188 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" -#include "libavcodec/avcodec.h" - - -struct vf_priv_s -{ - int width, height; - int pix_fmt; -}; - -/* Support for avcodec's built-in deinterlacer. - * Based on vf_lavc.c - */ - -//===========================================================================// - - -/* Convert mplayer's IMGFMT_* to avcodec's PIX_FMT_* for the supported - * IMGFMT's, and return -1 if the deinterlacer doesn't support - * that format (-1 because 0 is a valid PIX_FMT). - */ -/* The deinterlacer supports planer 4:2:0, 4:2:2, and 4:4:4 YUV */ -static int -imgfmt_to_pixfmt (int imgfmt) -{ - switch(imgfmt) - { - /* I hope I got all the supported formats */ - - /* 4:2:0 */ - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - return PIX_FMT_YUV420P; - break; - -#if 0 - /* 4:2:2 */ - case IMGFMT_UYVY: - case IMGFMT_UYNV: - case IMGFMT_Y422: - case IMGFMT_YUY2: - case IMGFMT_YUNV: - case IMGFMT_YVYU: - case IMGFMT_Y42T: - case IMGFMT_V422: - case IMGFMT_V655: - return PIX_FMT_YUV422P; - break; -#endif - - /* Are there any _planar_ YUV 4:4:4 formats? */ - - default: - return -1; - } -} - - -static int -config (struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt) -{ - struct vf_priv_s *priv = vf->priv; - - priv->pix_fmt = imgfmt_to_pixfmt(outfmt); - if(priv->pix_fmt == -1) - return 0; - - /* The deinterlacer will fail if this is false */ - if ((width & 3) != 0 || (height & 3) != 0) - return 0; - - /* If we get here, the deinterlacer is guaranteed not to fail */ - - priv->width = width; - priv->height = height; - - return vf_next_config(vf, - width, height, - d_width, d_height, - flags, outfmt); -} - -static int -put_image (struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - struct vf_priv_s *priv = vf->priv; - mp_image_t* dmpi; - AVPicture pic; - AVPicture lavc_picture; - - lavc_picture.data[0] = mpi->planes[0]; - lavc_picture.data[1] = mpi->planes[1]; - lavc_picture.data[2] = mpi->planes[2]; - lavc_picture.linesize[0] = mpi->stride[0]; - lavc_picture.linesize[1] = mpi->stride[1]; - lavc_picture.linesize[2] = mpi->stride[2]; - - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - priv->width, priv->height); - - pic.data[0] = dmpi->planes[0]; - pic.data[1] = dmpi->planes[1]; - pic.data[2] = dmpi->planes[2]; - pic.linesize[0] = dmpi->stride[0]; - pic.linesize[1] = dmpi->stride[1]; - pic.linesize[2] = dmpi->stride[2]; - - if (avpicture_deinterlace(&pic, &lavc_picture, - priv->pix_fmt, priv->width, priv->height) < 0) - { - /* This should not happen -- see config() */ - return 0; - } - - return vf_next_put_image(vf, dmpi, pts); -} - - -static int -query_format (struct vf_instance *vf, unsigned int fmt) -{ - if(imgfmt_to_pixfmt(fmt) == -1) - return 0; - - return vf_next_query_format(vf,fmt); -} - - -static int -vf_open(vf_instance_t *vf, char *args) -{ - /* We don't have any args */ - (void) args; - - vf->config = config; - vf->put_image = put_image; - vf->query_format = query_format; - vf->priv = malloc(sizeof(struct vf_priv_s)); - memset(vf->priv,0,sizeof(struct vf_priv_s)); - - return 1; -} - - -const vf_info_t vf_info_lavcdeint = { - "libavcodec's deinterlacing filter", - "lavcdeint", - "Joe Rabinoff", - "libavcodec's internal deinterlacer, in case you don't like " - "the builtin ones (invoked with -pp or -npp)", - vf_open, - NULL -}; - - -//===========================================================================// diff --git a/libmpcodecs/vf_mcdeint.c b/libmpcodecs/vf_mcdeint.c deleted file mode 100644 index 82635e5dfd..0000000000 --- a/libmpcodecs/vf_mcdeint.c +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Copyright (C) 2006 Michael Niedermayer <michaelni@gmx.at> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - - -/* -Known Issues: -* The motion estimation is somewhat at the mercy of the input, if the input - frames are created purely based on spatial interpolation then for example - a thin black line or another random and not interpolateable pattern - will cause problems - Note: completly ignoring the "unavailable" lines during motion estimation - didnt look any better, so the most obvious solution would be to improve - tfields or penalize problematic motion vectors ... - -* If non iterative ME is used then snow currently ignores the OBMC window - and as a result sometimes creates artifacts - -* only past frames are used, we should ideally use future frames too, something - like filtering the whole movie in forward and then backward direction seems - like a interresting idea but the current filter framework is FAR from - supporting such things - -* combining the motion compensated image with the input image also isnt - as trivial as it seems, simple blindly taking even lines from one and - odd ones from the other doesnt work at all as ME/MC sometimes simple - has nothing in the previous frames which matches the current, the current - algo has been found by trial and error and almost certainly can be - improved ... -*/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <math.h> - -#include "mp_msg.h" -#include "cpudetect.h" - -#include "libavutil/intreadwrite.h" -#include "libavcodec/avcodec.h" -#include "libavcodec/dsputil.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -#define MIN(a,b) ((a) > (b) ? (b) : (a)) -#define MAX(a,b) ((a) < (b) ? (b) : (a)) -#define ABS(a) ((a) > 0 ? (a) : (-(a))) - -//===========================================================================// - -struct vf_priv_s { - int mode; - int qp; - int parity; -#if 0 - int temp_stride[3]; - uint8_t *src[3]; - int16_t *temp[3]; -#endif - int outbuf_size; - uint8_t *outbuf; - AVCodecContext *avctx_enc; - AVFrame *frame; - AVFrame *frame_dec; -}; - -static void filter(struct vf_priv_s *p, uint8_t *dst[3], uint8_t *src[3], int dst_stride[3], int src_stride[3], int width, int height){ - int x, y, i; - int out_size; - - for(i=0; i<3; i++){ - p->frame->data[i]= src[i]; - p->frame->linesize[i]= src_stride[i]; - } - - p->avctx_enc->me_cmp= - p->avctx_enc->me_sub_cmp= FF_CMP_SAD /*| (p->parity ? FF_CMP_ODD : FF_CMP_EVEN)*/; - p->frame->quality= p->qp*FF_QP2LAMBDA; - out_size = avcodec_encode_video(p->avctx_enc, p->outbuf, p->outbuf_size, p->frame); - p->frame_dec = p->avctx_enc->coded_frame; - - for(i=0; i<3; i++){ - int is_chroma= !!i; - int w= width >>is_chroma; - int h= height>>is_chroma; - int fils= p->frame_dec->linesize[i]; - int srcs= src_stride[i]; - - for(y=0; y<h; y++){ - if((y ^ p->parity) & 1){ - for(x=0; x<w; x++){ - if((x-2)+(y-1)*w>=0 && (x+2)+(y+1)*w<w*h){ //FIXME either alloc larger images or optimize this - uint8_t *filp= &p->frame_dec->data[i][x + y*fils]; - uint8_t *srcp= &src[i][x + y*srcs]; - int diff0= filp[-fils] - srcp[-srcs]; - int diff1= filp[+fils] - srcp[+srcs]; - int spatial_score= ABS(srcp[-srcs-1] - srcp[+srcs-1]) - +ABS(srcp[-srcs ] - srcp[+srcs ]) - +ABS(srcp[-srcs+1] - srcp[+srcs+1]) - 1; - int temp= filp[0]; - -#define CHECK(j)\ - { int score= ABS(srcp[-srcs-1+j] - srcp[+srcs-1-j])\ - + ABS(srcp[-srcs +j] - srcp[+srcs -j])\ - + ABS(srcp[-srcs+1+j] - srcp[+srcs+1-j]);\ - if(score < spatial_score){\ - spatial_score= score;\ - diff0= filp[-fils+j] - srcp[-srcs+j];\ - diff1= filp[+fils-j] - srcp[+srcs-j]; - - CHECK(-1) CHECK(-2) }} }} - CHECK( 1) CHECK( 2) }} }} -#if 0 - if((diff0 ^ diff1) > 0){ - int mindiff= ABS(diff0) > ABS(diff1) ? diff1 : diff0; - temp-= mindiff; - } -#elif 1 - if(diff0 + diff1 > 0) - temp-= (diff0 + diff1 - ABS( ABS(diff0) - ABS(diff1) )/2)/2; - else - temp-= (diff0 + diff1 + ABS( ABS(diff0) - ABS(diff1) )/2)/2; -#else - temp-= (diff0 + diff1)/2; -#endif -#if 1 - filp[0]= - dst[i][x + y*dst_stride[i]]= temp > 255U ? ~(temp>>31) : temp; -#else - dst[i][x + y*dst_stride[i]]= filp[0]; - filp[0]= temp > 255U ? ~(temp>>31) : temp; -#endif - }else - dst[i][x + y*dst_stride[i]]= p->frame_dec->data[i][x + y*fils]; - } - } - } - for(y=0; y<h; y++){ - if(!((y ^ p->parity) & 1)){ - for(x=0; x<w; x++){ -#if 1 - p->frame_dec->data[i][x + y*fils]= - dst[i][x + y*dst_stride[i]]= src[i][x + y*srcs]; -#else - dst[i][x + y*dst_stride[i]]= p->frame_dec->data[i][x + y*fils]; - p->frame_dec->data[i][x + y*fils]= src[i][x + y*srcs]; -#endif - } - } - } - } - p->parity ^= 1; - -} - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - int i; - AVCodec *enc= avcodec_find_encoder(CODEC_ID_SNOW); - - for(i=0; i<3; i++){ - AVCodecContext *avctx_enc; -#if 0 - int is_chroma= !!i; - int w= ((width + 31) & (~31))>>is_chroma; - int h= ((height + 31) & (~31))>>is_chroma; - - vf->priv->temp_stride[i]= w; - vf->priv->temp[i]= malloc(vf->priv->temp_stride[i]*h*sizeof(int16_t)); - vf->priv->src [i]= malloc(vf->priv->temp_stride[i]*h*sizeof(uint8_t)); -#endif - avctx_enc= - vf->priv->avctx_enc= avcodec_alloc_context(); - avctx_enc->width = width; - avctx_enc->height = height; - avctx_enc->time_base= (AVRational){1,25}; // meaningless - avctx_enc->gop_size = 300; - avctx_enc->max_b_frames= 0; - avctx_enc->pix_fmt = PIX_FMT_YUV420P; - avctx_enc->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_LOW_DELAY; - avctx_enc->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL; - avctx_enc->global_quality= 1; - avctx_enc->flags2= CODEC_FLAG2_MEMC_ONLY; - avctx_enc->me_cmp= - avctx_enc->me_sub_cmp= FF_CMP_SAD; //SSE; - avctx_enc->mb_cmp= FF_CMP_SSE; - - switch(vf->priv->mode){ - case 3: - avctx_enc->refs= 3; - case 2: - avctx_enc->me_method= ME_ITER; - case 1: - avctx_enc->flags |= CODEC_FLAG_4MV; - avctx_enc->dia_size=2; -// avctx_enc->mb_decision = MB_DECISION_RD; - case 0: - avctx_enc->flags |= CODEC_FLAG_QPEL; - } - - avcodec_open(avctx_enc, enc); - - } - vf->priv->frame= avcodec_alloc_frame(); - - vf->priv->outbuf_size= width*height*10; - vf->priv->outbuf= malloc(vf->priv->outbuf_size); - - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static void get_image(struct vf_instance *vf, mp_image_t *mpi){ - if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change -return; //caused problems, dunno why - // ok, we can do pp in-place (or pp disabled): - vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, - mpi->type, mpi->flags | MP_IMGFLAG_READABLE, mpi->width, mpi->height); - mpi->planes[0]=vf->dmpi->planes[0]; - mpi->stride[0]=vf->dmpi->stride[0]; - mpi->width=vf->dmpi->width; - if(mpi->flags&MP_IMGFLAG_PLANAR){ - mpi->planes[1]=vf->dmpi->planes[1]; - mpi->planes[2]=vf->dmpi->planes[2]; - mpi->stride[1]=vf->dmpi->stride[1]; - mpi->stride[2]=vf->dmpi->stride[2]; - } - mpi->flags|=MP_IMGFLAG_DIRECT; -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - - if(!(mpi->flags&MP_IMGFLAG_DIRECT)){ - // no DR, so get a new image! hope we'll get DR buffer: - dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, - MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE, - mpi->width,mpi->height); - vf_clone_mpi_attributes(dmpi, mpi); - }else{ - dmpi=vf->dmpi; - } - - filter(vf->priv, dmpi->planes, mpi->planes, dmpi->stride, mpi->stride, mpi->w, mpi->h); - - return vf_next_put_image(vf,dmpi, pts); -} - -static void uninit(struct vf_instance *vf){ - if(!vf->priv) return; - -#if 0 - for(i=0; i<3; i++){ - free(vf->priv->temp[i]); - vf->priv->temp[i]= NULL; - free(vf->priv->src[i]); - vf->priv->src[i]= NULL; - } -#endif - if (vf->priv->avctx_enc) { - avcodec_close(vf->priv->avctx_enc); - av_freep(&vf->priv->avctx_enc); - } - - free(vf->priv->outbuf); - free(vf->priv); - vf->priv=NULL; -} - -//===========================================================================// -static int query_format(struct vf_instance *vf, unsigned int fmt){ - switch(fmt){ - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_Y800: - case IMGFMT_Y8: - return vf_next_query_format(vf,fmt); - } - return 0; -} - -static int vf_open(vf_instance_t *vf, char *args){ - - vf->config=config; - vf->put_image=put_image; - vf->get_image=get_image; - vf->query_format=query_format; - vf->uninit=uninit; - vf->priv=malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - - vf->priv->mode=0; - vf->priv->parity= -1; - vf->priv->qp=1; - - if (args) sscanf(args, "%d:%d:%d", &vf->priv->mode, &vf->priv->parity, &vf->priv->qp); - - return 1; -} - -const vf_info_t vf_info_mcdeint = { - "motion compensating deinterlacer", - "mcdeint", - "Michael Niedermayer", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_ow.c b/libmpcodecs/vf_ow.c deleted file mode 100644 index f7fb02db72..0000000000 --- a/libmpcodecs/vf_ow.c +++ /dev/null @@ -1,322 +0,0 @@ -/* - * Copyright (C) 2007 Michael Niedermayer <michaelni@gmx.at> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -/** - * @todo try to change to int - * @todo try lifting based implementation - * @todo optimize optimize optimize - * @todo hard tresholding - * @todo use QP to decide filter strength - * @todo wavelet normalization / least squares optimal signal vs. noise thresholds - */ - -#include <stdio.h> -#include <string.h> -#include <inttypes.h> -#include <math.h> - -#include "mp_msg.h" -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -//===========================================================================// -static const uint8_t __attribute__((aligned(8))) dither[8][8]={ -{ 0, 48, 12, 60, 3, 51, 15, 63, }, -{ 32, 16, 44, 28, 35, 19, 47, 31, }, -{ 8, 56, 4, 52, 11, 59, 7, 55, }, -{ 40, 24, 36, 20, 43, 27, 39, 23, }, -{ 2, 50, 14, 62, 1, 49, 13, 61, }, -{ 34, 18, 46, 30, 33, 17, 45, 29, }, -{ 10, 58, 6, 54, 9, 57, 5, 53, }, -{ 42, 26, 38, 22, 41, 25, 37, 21, }, -}; -//FIXME the above is duplicated in many filters - -struct vf_priv_s { - float strength[2]; - float delta; - int mode; - int depth; - float *plane[16][4]; - int stride; -}; - -#define S 1.41421356237 //sqrt(2) - -static const double coeff[2][5]={ - { - 0.6029490182363579 *S, - 0.2668641184428723 *S, - -0.07822326652898785 *S, - -0.01686411844287495 *S, - 0.02674875741080976 *S - },{ - 1.115087052456994 /S, - -0.5912717631142470 /S, - -0.05754352622849957 /S, - 0.09127176311424948 /S - } -}; - -static const double icoeff[2][5]={ - { - 1.115087052456994 /S, - 0.5912717631142470 /S, - -0.05754352622849957 /S, - -0.09127176311424948 /S - },{ - 0.6029490182363579 *S, - -0.2668641184428723 *S, - -0.07822326652898785 *S, - 0.01686411844287495 *S, - 0.02674875741080976 *S - } -}; -#undef S - -static inline int mirror(int x, int w){ - while((unsigned)x > (unsigned)w){ - x=-x; - if(x<0) x+= 2*w; - } - return x; -} - -static inline void decompose(float *dstL, float *dstH, float *src, int stride, int w){ - int x, i; - for(x=0; x<w; x++){ - double sumL= src[x*stride] * coeff[0][0]; - double sumH= src[x*stride] * coeff[1][0]; - for(i=1; i<=4; i++){ - double s= (src[mirror(x-i, w-1)*stride] + src[mirror(x+i, w-1)*stride]); - - sumL+= coeff[0][i]*s; - sumH+= coeff[1][i]*s; - } - dstL[x*stride]= sumL; - dstH[x*stride]= sumH; - } -} - -static inline void compose(float *dst, float *srcL, float *srcH, int stride, int w){ - int x, i; - for(x=0; x<w; x++){ - double sumL= srcL[x*stride] * icoeff[0][0]; - double sumH= srcH[x*stride] * icoeff[1][0]; - for(i=1; i<=4; i++){ - int x0= mirror(x-i, w-1)*stride; - int x1= mirror(x+i, w-1)*stride; - - sumL+= icoeff[0][i]*(srcL[x0] + srcL[x1]); - sumH+= icoeff[1][i]*(srcH[x0] + srcH[x1]); - } - dst[x*stride]= (sumL + sumH)*0.5; - } -} - -static inline void decompose2D(float *dstL, float *dstH, float *src, int xstride, int ystride, int step, int w, int h){ - int y, x; - for(y=0; y<h; y++) - for(x=0; x<step; x++) - decompose(dstL + ystride*y + xstride*x, dstH + ystride*y + xstride*x, src + ystride*y + xstride*x, step*xstride, (w-x+step-1)/step); -} - -static inline void compose2D(float *dst, float *srcL, float *srcH, int xstride, int ystride, int step, int w, int h){ - int y, x; - for(y=0; y<h; y++) - for(x=0; x<step; x++) - compose(dst + ystride*y + xstride*x, srcL + ystride*y + xstride*x, srcH + ystride*y + xstride*x, step*xstride, (w-x+step-1)/step); -} - -static void decompose2D2(float *dst[4], float *src, float *temp[2], int stride, int step, int w, int h){ - decompose2D(temp[0], temp[1], src , 1, stride, step , w, h); - decompose2D( dst[0], dst[1], temp[0], stride, 1, step , h, w); - decompose2D( dst[2], dst[3], temp[1], stride, 1, step , h, w); -} - -static void compose2D2(float *dst, float *src[4], float *temp[2], int stride, int step, int w, int h){ - compose2D(temp[0], src[0], src[1], stride, 1, step , h, w); - compose2D(temp[1], src[2], src[3], stride, 1, step , h, w); - compose2D(dst , temp[0], temp[1], 1, stride, step , w, h); -} - -static void filter(struct vf_priv_s *p, uint8_t *dst, uint8_t *src, int dst_stride, int src_stride, int width, int height, int is_luma){ - int x,y, i, j; -// double sum=0; - double s= p->strength[!is_luma]; - int depth= p->depth; - - while(1<<depth > width || 1<<depth > height) - depth--; - - for(y=0; y<height; y++) - for(x=0; x<width; x++) - p->plane[0][0][x + y*p->stride]= src[x + y*src_stride]; - - for(i=0; i<depth; i++){ - decompose2D2(p->plane[i+1], p->plane[i][0], p->plane[0]+1,p->stride, 1<<i, width, height); - } - for(i=0; i<depth; i++){ - for(j=1; j<4; j++){ - for(y=0; y<height; y++){ - for(x=0; x<width; x++){ - double v= p->plane[i+1][j][x + y*p->stride]; - if (v> s) v-=s; - else if(v<-s) v+=s; - else v =0; - p->plane[i+1][j][x + y*p->stride]= v; - } - } - } - } - for(i=depth-1; i>=0; i--){ - compose2D2(p->plane[i][0], p->plane[i+1], p->plane[0]+1, p->stride, 1<<i, width, height); - } - - for(y=0; y<height; y++) - for(x=0; x<width; x++){ - i= p->plane[0][0][x + y*p->stride] + dither[x&7][y&7]*(1.0/64) + 1.0/128; //yes the rounding is insane but optimal :) -// double e= i - src[x + y*src_stride]; -// sum += e*e; - if((unsigned)i > 255U) i= ~(i>>31); - dst[x + y*dst_stride]= i; - } - -// printf("%f\n", sum/height/width); -} - -static int config(struct vf_instance *vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt){ - int h= (height+15)&(~15); - int i,j; - - vf->priv->stride= (width+15)&(~15); - for(j=0; j<4; j++){ - for(i=0; i<=vf->priv->depth; i++) - vf->priv->plane[i][j]= malloc(vf->priv->stride*h*sizeof(vf->priv->plane[0][0][0])); - } - - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static void get_image(struct vf_instance *vf, mp_image_t *mpi){ - if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change - // ok, we can do pp in-place (or pp disabled): - vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, - mpi->type, mpi->flags | MP_IMGFLAG_READABLE, mpi->width, mpi->height); - mpi->planes[0]=vf->dmpi->planes[0]; - mpi->stride[0]=vf->dmpi->stride[0]; - mpi->width=vf->dmpi->width; - if(mpi->flags&MP_IMGFLAG_PLANAR){ - mpi->planes[1]=vf->dmpi->planes[1]; - mpi->planes[2]=vf->dmpi->planes[2]; - mpi->stride[1]=vf->dmpi->stride[1]; - mpi->stride[2]=vf->dmpi->stride[2]; - } - mpi->flags|=MP_IMGFLAG_DIRECT; -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - - if(!(mpi->flags&MP_IMGFLAG_DIRECT)){ - // no DR, so get a new image! hope we'll get DR buffer: - dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, - MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE, - mpi->width,mpi->height); - vf_clone_mpi_attributes(dmpi, mpi); - }else{ - dmpi=vf->dmpi; - } - - filter(vf->priv, dmpi->planes[0], mpi->planes[0], dmpi->stride[0], mpi->stride[0], mpi->w, mpi->h, 1); - filter(vf->priv, dmpi->planes[1], mpi->planes[1], dmpi->stride[1], mpi->stride[1], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, 0); - filter(vf->priv, dmpi->planes[2], mpi->planes[2], dmpi->stride[2], mpi->stride[2], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, 0); - - return vf_next_put_image(vf,dmpi, pts); -} - -static void uninit(struct vf_instance *vf){ - int i,j; - if(!vf->priv) return; - - for(j=0; j<4; j++){ - for(i=0; i<16; i++){ - free(vf->priv->plane[i][j]); - vf->priv->plane[i][j]= NULL; - } - } - - free(vf->priv); - vf->priv=NULL; -} - -//===========================================================================// -static int query_format(struct vf_instance *vf, unsigned int fmt){ - switch(fmt){ - case IMGFMT_YVU9: - case IMGFMT_IF09: - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_CLPL: - case IMGFMT_Y800: - case IMGFMT_Y8: - case IMGFMT_444P: - case IMGFMT_422P: - case IMGFMT_411P: - return vf_next_query_format(vf,fmt); - } - return 0; -} - - -static int vf_open(vf_instance_t *vf, char *args){ - vf->config=config; - vf->put_image=put_image; - vf->get_image=get_image; - vf->query_format=query_format; - vf->uninit=uninit; - vf->priv=malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - - vf->priv->depth= 8; - vf->priv->strength[0]= 1.0; - vf->priv->strength[1]= 1.0; - vf->priv->delta= 1.0; - - if (args) sscanf(args, "%d:%f:%f:%d:%f", &vf->priv->depth, - &vf->priv->strength[0], - &vf->priv->strength[1], - &vf->priv->mode, - &vf->priv->delta); - - return 1; -} - -const vf_info_t vf_info_ow = { - "overcomplete wavelet denoiser", - "ow", - "Michael Niedermayer", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_palette.c b/libmpcodecs/vf_palette.c deleted file mode 100644 index 17670f3eb0..0000000000 --- a/libmpcodecs/vf_palette.c +++ /dev/null @@ -1,234 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" -#include "mpbswap.h" - -#include "libswscale/swscale.h" - -//===========================================================================// - -// commented out 16 and 15 bit output support, because the conversion -// routines are incorrrect. they assume the palette to be of the same -// depth as the output, which is incorrect. --Joey - -static const unsigned int bgr_list[]={ - IMGFMT_BGR32, - IMGFMT_BGR24, -// IMGFMT_BGR16, -// IMGFMT_BGR15, - 0 -}; -static const unsigned int rgb_list[]={ - IMGFMT_RGB32, - IMGFMT_RGB24, -// IMGFMT_RGB16, -// IMGFMT_RGB15, - 0 -}; - -/** - * Palette is assumed to contain BGR16, see rgb32to16 to convert the palette. - */ -static void palette8torgb16(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) -{ - long i; - for (i=0; i<num_pixels; i++) - ((uint16_t *)dst)[i] = ((const uint16_t *)palette)[src[i]]; -} - -static void palette8tobgr16(const uint8_t *src, uint8_t *dst, long num_pixels, const uint8_t *palette) -{ - long i; - for (i=0; i<num_pixels; i++) - ((uint16_t *)dst)[i] = bswap_16(((const uint16_t *)palette)[src[i]]); -} - -static unsigned int gray_pal[256]; - -static unsigned int find_best(struct vf_instance *vf, unsigned int fmt){ - unsigned int best=0; - int ret; - const unsigned int* p; - if(fmt==IMGFMT_BGR8) p=bgr_list; - else if(fmt==IMGFMT_RGB8) p=rgb_list; - else return 0; - while(*p){ - ret=vf->next->query_format(vf->next,*p); - mp_msg(MSGT_VFILTER,MSGL_DBG2,"[%s] query(%s) -> %d\n",vf->info->name,vo_format_name(*p),ret&3); - if(ret&VFCAP_CSP_SUPPORTED_BY_HW){ best=*p; break;} // no conversion -> bingo! - if(ret&VFCAP_CSP_SUPPORTED && !best) best=*p; // best with conversion - ++p; - } - return best; -} - -//===========================================================================// - -struct vf_priv_s { - unsigned int fmt; - int pal_msg; -}; - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - if (!vf->priv->fmt) - vf->priv->fmt=find_best(vf,outfmt); - if(!vf->priv->fmt){ - // no matching fmt, so force one... - if(outfmt==IMGFMT_RGB8) vf->priv->fmt=IMGFMT_RGB32; - else if(outfmt==IMGFMT_BGR8) vf->priv->fmt=IMGFMT_BGR32; - else return 0; - } - return vf_next_config(vf,width,height,d_width,d_height,flags,vf->priv->fmt); -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - uint8_t *old_palette = mpi->planes[1]; - - // hope we'll get DR buffer: - dmpi=vf_get_image(vf->next,vf->priv->fmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->w, mpi->h); - - if (!mpi->planes[1]) - { - if(!vf->priv->pal_msg){ - mp_msg(MSGT_VFILTER,MSGL_V,"[%s] no palette given, assuming builtin grayscale one\n",vf->info->name); - vf->priv->pal_msg=1; - } - mpi->planes[1] = (unsigned char*)gray_pal; - } - - if(mpi->w==mpi->stride[0] && dmpi->w*(dmpi->bpp>>3)==dmpi->stride[0]){ - // no stride conversion needed - switch(IMGFMT_RGB_DEPTH(dmpi->imgfmt)){ - case 15: - case 16: - if (IMGFMT_IS_BGR(dmpi->imgfmt)) - palette8tobgr16(mpi->planes[0],dmpi->planes[0],mpi->h*mpi->w,mpi->planes[1]); - else - palette8torgb16(mpi->planes[0],dmpi->planes[0],mpi->h*mpi->w,mpi->planes[1]); - break; - case 24: - if (IMGFMT_IS_BGR(dmpi->imgfmt)) - sws_convertPalette8ToPacked24(mpi->planes[0],dmpi->planes[0],mpi->h*mpi->w,mpi->planes[1]); - else - sws_convertPalette8ToPacked24(mpi->planes[0],dmpi->planes[0],mpi->h*mpi->w,mpi->planes[1]); - break; - case 32: - if (IMGFMT_IS_BGR(dmpi->imgfmt)) - sws_convertPalette8ToPacked32(mpi->planes[0],dmpi->planes[0],mpi->h*mpi->w,mpi->planes[1]); - else - sws_convertPalette8ToPacked32(mpi->planes[0],dmpi->planes[0],mpi->h*mpi->w,mpi->planes[1]); - break; - } - } else { - int y; - for(y=0;y<mpi->h;y++){ - unsigned char* src=mpi->planes[0]+y*mpi->stride[0]; - unsigned char* dst=dmpi->planes[0]+y*dmpi->stride[0]; - switch(IMGFMT_RGB_DEPTH(dmpi->imgfmt)){ - case 15: - case 16: - if (IMGFMT_IS_BGR(dmpi->imgfmt)) - palette8tobgr16(src,dst,mpi->w,mpi->planes[1]); - else - palette8torgb16(src,dst,mpi->w,mpi->planes[1]); - break; - case 24: - if (IMGFMT_IS_BGR(dmpi->imgfmt)) - sws_convertPalette8ToPacked24(src,dst,mpi->w,mpi->planes[1]); - else - sws_convertPalette8ToPacked24(src,dst,mpi->w,mpi->planes[1]); - break; - case 32: - if (IMGFMT_IS_BGR(dmpi->imgfmt)) - sws_convertPalette8ToPacked32(src,dst,mpi->w,mpi->planes[1]); - else - sws_convertPalette8ToPacked32(src,dst,mpi->w,mpi->planes[1]); - break; - } - } - } - mpi->planes[1] = old_palette; - - return vf_next_put_image(vf,dmpi, pts); -} - -//===========================================================================// - -static int query_format(struct vf_instance *vf, unsigned int fmt){ - int best=find_best(vf,fmt); - if(!best) return 0; // no match - return vf->next->query_format(vf->next,best); -} - -static void uninit(vf_instance_t *vf) { - free(vf->priv); -} - -static int vf_open(vf_instance_t *vf, char *args){ - unsigned int i; - vf->config=config; - vf->uninit=uninit; - vf->put_image=put_image; - vf->query_format=query_format; - vf->priv=malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - for(i=0;i<256;i++) gray_pal[i]=0x01010101*i; - if (args) - { - if (!strcasecmp(args,"rgb15")) vf->priv->fmt=IMGFMT_RGB15; else - if (!strcasecmp(args,"rgb16")) vf->priv->fmt=IMGFMT_RGB16; else - if (!strcasecmp(args,"rgb24")) vf->priv->fmt=IMGFMT_RGB24; else - if (!strcasecmp(args,"rgb32")) vf->priv->fmt=IMGFMT_RGB32; else - if (!strcasecmp(args,"bgr15")) vf->priv->fmt=IMGFMT_BGR15; else - if (!strcasecmp(args,"bgr16")) vf->priv->fmt=IMGFMT_BGR16; else - if (!strcasecmp(args,"bgr24")) vf->priv->fmt=IMGFMT_BGR24; else - if (!strcasecmp(args,"bgr32")) vf->priv->fmt=IMGFMT_BGR32; else - { - mp_tmsg(MSGT_VFILTER, MSGL_WARN, "[VF_FORMAT] Unknown format name: '%s'.\n", args); - return 0; - } - } - return 1; -} - -const vf_info_t vf_info_palette = { - "8bpp indexed (using palette) -> BGR 15/16/24/32 conversion", - "palette", - "A'rpi & Alex", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_perspective.c b/libmpcodecs/vf_perspective.c deleted file mode 100644 index df196bb1c9..0000000000 --- a/libmpcodecs/vf_perspective.c +++ /dev/null @@ -1,341 +0,0 @@ -/* - * Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <assert.h> -#include <math.h> - -#include "config.h" -#include "mp_msg.h" - -#include "libavutil/mem.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -#define SUB_PIXEL_BITS 8 -#define SUB_PIXELS (1<<SUB_PIXEL_BITS) -#define COEFF_BITS 11 - -//===========================================================================// - -struct vf_priv_s { - double ref[4][2]; - int32_t coeff[1<<SUB_PIXEL_BITS][4]; - int32_t (*pv)[2]; - int pvStride; - int cubic; -}; - - -/***************************************************************************/ - -static void initPv(struct vf_priv_s *priv, int W, int H){ - double a,b,c,d,e,f,g,h,D; - double (*ref)[2]= priv->ref; - int x,y; - - g= ( (ref[0][0] - ref[1][0] - ref[2][0] + ref[3][0])*(ref[2][1] - ref[3][1]) - - (ref[0][1] - ref[1][1] - ref[2][1] + ref[3][1])*(ref[2][0] - ref[3][0]))*H; - h= ( (ref[0][1] - ref[1][1] - ref[2][1] + ref[3][1])*(ref[1][0] - ref[3][0]) - - (ref[0][0] - ref[1][0] - ref[2][0] + ref[3][0])*(ref[1][1] - ref[3][1]))*W; - D= (ref[1][0] - ref[3][0])*(ref[2][1] - ref[3][1]) - - (ref[2][0] - ref[3][0])*(ref[1][1] - ref[3][1]); - - a= D*(ref[1][0] - ref[0][0])*H + g*ref[1][0]; - b= D*(ref[2][0] - ref[0][0])*W + h*ref[2][0]; - c= D*ref[0][0]*W*H; - d= D*(ref[1][1] - ref[0][1])*H + g*ref[1][1]; - e= D*(ref[2][1] - ref[0][1])*W + h*ref[2][1]; - f= D*ref[0][1]*W*H; - - for(y=0; y<H; y++){ - for(x=0; x<W; x++){ - int u, v; - - u= (int)floor( SUB_PIXELS*(a*x + b*y + c)/(g*x + h*y + D*W*H) + 0.5); - v= (int)floor( SUB_PIXELS*(d*x + e*y + f)/(g*x + h*y + D*W*H) + 0.5); - - priv->pv[x + y*W][0]= u; - priv->pv[x + y*W][1]= v; - } - } -} - -static double getCoeff(double d){ - double A= -0.60; - double coeff; - - d= fabs(d); - - // Equation is from VirtualDub - if(d<1.0) - coeff = (1.0 - (A+3.0)*d*d + (A+2.0)*d*d*d); - else if(d<2.0) - coeff = (-4.0*A + 8.0*A*d - 5.0*A*d*d + A*d*d*d); - else - coeff=0.0; - - return coeff; -} - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - int i, j; - - vf->priv->pvStride= width; - vf->priv->pv= av_malloc(width*height*2*sizeof(int32_t)); - initPv(vf->priv, width, height); - - for(i=0; i<SUB_PIXELS; i++){ - double d= i/(double)SUB_PIXELS; - double temp[4]; - double sum=0; - - for(j=0; j<4; j++) - temp[j]= getCoeff(j - d - 1); - - for(j=0; j<4; j++) - sum+= temp[j]; - - for(j=0; j<4; j++) - vf->priv->coeff[i][j]= (int)floor((1<<COEFF_BITS)*temp[j]/sum + 0.5); - } - - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static void uninit(struct vf_instance *vf){ - if(!vf->priv) return; - - av_free(vf->priv->pv); - vf->priv->pv= NULL; - - free(vf->priv); - vf->priv=NULL; -} - -static inline void resampleCubic(uint8_t *dst, uint8_t *src, int w, int h, int dstStride, int srcStride, struct vf_priv_s *privParam, int xShift, int yShift){ - int x, y; - struct vf_priv_s priv= *privParam; - - for(y=0; y<h; y++){ - for(x=0; x<w; x++){ - int u, v, subU, subV, sum, sx, sy; - - sx= x << xShift; - sy= y << yShift; - u= priv.pv[sx + sy*priv.pvStride][0]>>xShift; - v= priv.pv[sx + sy*priv.pvStride][1]>>yShift; - subU= u & (SUB_PIXELS-1); - subV= v & (SUB_PIXELS-1); - u >>= SUB_PIXEL_BITS; - v >>= SUB_PIXEL_BITS; - - if(u>0 && v>0 && u<w-2 && v<h-2){ - const int index= u + v*srcStride; - const int a= priv.coeff[subU][0]; - const int b= priv.coeff[subU][1]; - const int c= priv.coeff[subU][2]; - const int d= priv.coeff[subU][3]; - - sum= - priv.coeff[subV][0]*( a*src[index - 1 - srcStride] + b*src[index - 0 - srcStride] - + c*src[index + 1 - srcStride] + d*src[index + 2 - srcStride]) - +priv.coeff[subV][1]*( a*src[index - 1 ] + b*src[index - 0 ] - + c*src[index + 1 ] + d*src[index + 2 ]) - +priv.coeff[subV][2]*( a*src[index - 1 + srcStride] + b*src[index - 0 + srcStride] - + c*src[index + 1 + srcStride] + d*src[index + 2 + srcStride]) - +priv.coeff[subV][3]*( a*src[index - 1+2*srcStride] + b*src[index - 0+2*srcStride] - + c*src[index + 1+2*srcStride] + d*src[index + 2+2*srcStride]); - }else{ - int dx, dy; - sum=0; - - for(dy=0; dy<4; dy++){ - int iy= v + dy - 1; - if (iy< 0) iy=0; - else if(iy>=h) iy=h-1; - for(dx=0; dx<4; dx++){ - int ix= u + dx - 1; - if (ix< 0) ix=0; - else if(ix>=w) ix=w-1; - - sum+= priv.coeff[subU][dx]*priv.coeff[subV][dy] - *src[ ix + iy*srcStride]; - } - } - } - sum= (sum + (1<<(COEFF_BITS*2-1)) ) >> (COEFF_BITS*2); - if(sum&~255){ - if(sum<0) sum=0; - else sum=255; - } - dst[ x + y*dstStride]= sum; - } - } -} - -static inline void resampleLinear(uint8_t *dst, uint8_t *src, int w, int h, int dstStride, int srcStride, - struct vf_priv_s *privParam, int xShift, int yShift){ - int x, y; - struct vf_priv_s priv= *privParam; - - for(y=0; y<h; y++){ - for(x=0; x<w; x++){ - int u, v, subU, subV, sum, sx, sy, index, subUI, subVI; - - sx= x << xShift; - sy= y << yShift; - u= priv.pv[sx + sy*priv.pvStride][0]>>xShift; - v= priv.pv[sx + sy*priv.pvStride][1]>>yShift; - subU= u & (SUB_PIXELS-1); - subV= v & (SUB_PIXELS-1); - u >>= SUB_PIXEL_BITS; - v >>= SUB_PIXEL_BITS; - index= u + v*srcStride; - subUI= SUB_PIXELS - subU; - subVI= SUB_PIXELS - subV; - - if((unsigned)u < (unsigned)(w - 1)){ - if((unsigned)v < (unsigned)(h - 1)){ - sum= subVI*(subUI*src[index ] + subU*src[index +1]) - +subV *(subUI*src[index+srcStride] + subU*src[index+srcStride+1]); - sum= (sum + (1<<(SUB_PIXEL_BITS*2-1)) ) >> (SUB_PIXEL_BITS*2); - }else{ - if(v<0) v= 0; - else v= h-1; - index= u + v*srcStride; - sum= subUI*src[index] + subU*src[index+1]; - sum= (sum + (1<<(SUB_PIXEL_BITS-1)) ) >> SUB_PIXEL_BITS; - } - }else{ - if((unsigned)v < (unsigned)(h - 1)){ - if(u<0) u= 0; - else u= w-1; - index= u + v*srcStride; - sum= subVI*src[index] + subV*src[index+srcStride]; - sum= (sum + (1<<(SUB_PIXEL_BITS-1)) ) >> SUB_PIXEL_BITS; - }else{ - if(u<0) u= 0; - else u= w-1; - if(v<0) v= 0; - else v= h-1; - index= u + v*srcStride; - sum= src[index]; - } - } - if(sum&~255){ - if(sum<0) sum=0; - else sum=255; - } - dst[ x + y*dstStride]= sum; - } - } -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - int cw= mpi->w >> mpi->chroma_x_shift; - int ch= mpi->h >> mpi->chroma_y_shift; - - mp_image_t *dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->w,mpi->h); - - assert(mpi->flags&MP_IMGFLAG_PLANAR); - - if(vf->priv->cubic){ - resampleCubic(dmpi->planes[0], mpi->planes[0], mpi->w,mpi->h, dmpi->stride[0], mpi->stride[0], - vf->priv, 0, 0); - resampleCubic(dmpi->planes[1], mpi->planes[1], cw , ch , dmpi->stride[1], mpi->stride[1], - vf->priv, mpi->chroma_x_shift, mpi->chroma_y_shift); - resampleCubic(dmpi->planes[2], mpi->planes[2], cw , ch , dmpi->stride[2], mpi->stride[2], - vf->priv, mpi->chroma_x_shift, mpi->chroma_y_shift); - }else{ - resampleLinear(dmpi->planes[0], mpi->planes[0], mpi->w,mpi->h, dmpi->stride[0], mpi->stride[0], - vf->priv, 0, 0); - resampleLinear(dmpi->planes[1], mpi->planes[1], cw , ch , dmpi->stride[1], mpi->stride[1], - vf->priv, mpi->chroma_x_shift, mpi->chroma_y_shift); - resampleLinear(dmpi->planes[2], mpi->planes[2], cw , ch , dmpi->stride[2], mpi->stride[2], - vf->priv, mpi->chroma_x_shift, mpi->chroma_y_shift); - } - - return vf_next_put_image(vf,dmpi, pts); -} - -//===========================================================================// - -static int query_format(struct vf_instance *vf, unsigned int fmt){ - switch(fmt) - { - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_YVU9: - case IMGFMT_444P: - case IMGFMT_422P: - case IMGFMT_411P: - return vf_next_query_format(vf, fmt); - } - return 0; -} - -static int vf_open(vf_instance_t *vf, char *args){ - int e; - - vf->config=config; - vf->put_image=put_image; -// vf->get_image=get_image; - vf->query_format=query_format; - vf->uninit=uninit; - vf->priv=malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - - if(args==NULL) return 0; - - e=sscanf(args, "%lf:%lf:%lf:%lf:%lf:%lf:%lf:%lf:%d", - &vf->priv->ref[0][0], &vf->priv->ref[0][1], - &vf->priv->ref[1][0], &vf->priv->ref[1][1], - &vf->priv->ref[2][0], &vf->priv->ref[2][1], - &vf->priv->ref[3][0], &vf->priv->ref[3][1], - &vf->priv->cubic - ); - - if(e!=9) - return 0; - - return 1; -} - -const vf_info_t vf_info_perspective = { - "perspective correcture", - "perspective", - "Michael Niedermayer", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_pp7.c b/libmpcodecs/vf_pp7.c deleted file mode 100644 index 0a30022576..0000000000 --- a/libmpcodecs/vf_pp7.c +++ /dev/null @@ -1,489 +0,0 @@ -/* - * Copyright (C) 2005 Michael Niedermayer <michaelni@gmx.at> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <math.h> - -#include "config.h" - -#include "mp_msg.h" -#include "cpudetect.h" - -#include "libavutil/mem.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" -#include "libvo/fastmemcpy.h" - -#define XMIN(a,b) ((a) < (b) ? (a) : (b)) -#define XMAX(a,b) ((a) > (b) ? (a) : (b)) - -typedef short DCTELEM; - -//===========================================================================// -static const uint8_t __attribute__((aligned(8))) dither[8][8]={ -{ 0, 48, 12, 60, 3, 51, 15, 63, }, -{ 32, 16, 44, 28, 35, 19, 47, 31, }, -{ 8, 56, 4, 52, 11, 59, 7, 55, }, -{ 40, 24, 36, 20, 43, 27, 39, 23, }, -{ 2, 50, 14, 62, 1, 49, 13, 61, }, -{ 34, 18, 46, 30, 33, 17, 45, 29, }, -{ 10, 58, 6, 54, 9, 57, 5, 53, }, -{ 42, 26, 38, 22, 41, 25, 37, 21, }, -}; - -struct vf_priv_s { - int qp; - int mode; - int mpeg2; - int temp_stride; - uint8_t *src; -}; -#if 0 -static inline void dct7_c(DCTELEM *dst, int s0, int s1, int s2, int s3, int step){ - int s, d; - int dst2[64]; -//#define S0 (1024/0.37796447300922719759) -#define C0 ((int)(1024*0.37796447300922719759+0.5)) //sqrt(1/7) -#define C1 ((int)(1024*0.53452248382484879308/6+0.5)) //sqrt(2/7)/6 - -#define C2 ((int)(1024*0.45221175985034745004/2+0.5)) -#define C3 ((int)(1024*0.36264567479870879474/2+0.5)) - -//0.1962505182412941918 0.0149276808419397944-0.2111781990832339584 -#define C4 ((int)(1024*0.1962505182412941918+0.5)) -#define C5 ((int)(1024*0.0149276808419397944+0.5)) -//#define C6 ((int)(1024*0.2111781990832339584+0.5)) -#if 0 - s= s0 + s1 + s2; - dst[0*step] = ((s + s3)*C0 + 512) >> 10; - s= (s - 6*s3)*C1 + 512; - d= (s0-s2)*C4 + (s1-s2)*C5; - dst[1*step] = (s + 2*d)>>10; - s -= d; - d= (s1-s0)*C2 + (s1-s2)*C3; - dst[2*step] = (s + d)>>10; - dst[3*step] = (s - d)>>10; -#elif 1 - s = s3+s3; - s3= s-s0; - s0= s+s0; - s = s2+s1; - s2= s2-s1; - dst[0*step]= s0 + s; - dst[2*step]= s0 - s; - dst[1*step]= 2*s3 + s2; - dst[3*step]= s3 - 2*s2; -#else - int i,j,n=7; - for(i=0; i<7; i+=2){ - dst2[i*step/2]= 0; - for(j=0; j<4; j++) - dst2[i*step/2] += src[j*step] * cos(i*M_PI/n*(j+0.5)) * sqrt((i?2.0:1.0)/n); - if(fabs(dst2[i*step/2] - dst[i*step/2]) > 20) - printf("%d %d %d (%d %d %d %d) -> (%d %d %d %d)\n", i,dst2[i*step/2], dst[i*step/2],src[0*step], src[1*step], src[2*step], src[3*step], dst[0*step], dst[1*step],dst[2*step],dst[3*step]); - } -#endif -} -#endif - -static inline void dctA_c(DCTELEM *dst, uint8_t *src, int stride){ - int i; - - for(i=0; i<4; i++){ - int s0= src[0*stride] + src[6*stride]; - int s1= src[1*stride] + src[5*stride]; - int s2= src[2*stride] + src[4*stride]; - int s3= src[3*stride]; - int s= s3+s3; - s3= s-s0; - s0= s+s0; - s = s2+s1; - s2= s2-s1; - dst[0]= s0 + s; - dst[2]= s0 - s; - dst[1]= 2*s3 + s2; - dst[3]= s3 - 2*s2; - src++; - dst+=4; - } -} - -static void dctB_c(DCTELEM *dst, DCTELEM *src){ - int i; - - for(i=0; i<4; i++){ - int s0= src[0*4] + src[6*4]; - int s1= src[1*4] + src[5*4]; - int s2= src[2*4] + src[4*4]; - int s3= src[3*4]; - int s= s3+s3; - s3= s-s0; - s0= s+s0; - s = s2+s1; - s2= s2-s1; - dst[0*4]= s0 + s; - dst[2*4]= s0 - s; - dst[1*4]= 2*s3 + s2; - dst[3*4]= s3 - 2*s2; - src++; - dst++; - } -} - -#if HAVE_MMX -static void dctB_mmx(DCTELEM *dst, DCTELEM *src){ - __asm__ volatile ( - "movq (%0), %%mm0 \n\t" - "movq 1*4*2(%0), %%mm1 \n\t" - "paddw 6*4*2(%0), %%mm0 \n\t" - "paddw 5*4*2(%0), %%mm1 \n\t" - "movq 2*4*2(%0), %%mm2 \n\t" - "movq 3*4*2(%0), %%mm3 \n\t" - "paddw 4*4*2(%0), %%mm2 \n\t" - "paddw %%mm3, %%mm3 \n\t" //s - "movq %%mm3, %%mm4 \n\t" //s - "psubw %%mm0, %%mm3 \n\t" //s-s0 - "paddw %%mm0, %%mm4 \n\t" //s+s0 - "movq %%mm2, %%mm0 \n\t" //s2 - "psubw %%mm1, %%mm2 \n\t" //s2-s1 - "paddw %%mm1, %%mm0 \n\t" //s2+s1 - "movq %%mm4, %%mm1 \n\t" //s0' - "psubw %%mm0, %%mm4 \n\t" //s0'-s' - "paddw %%mm0, %%mm1 \n\t" //s0'+s' - "movq %%mm3, %%mm0 \n\t" //s3' - "psubw %%mm2, %%mm3 \n\t" - "psubw %%mm2, %%mm3 \n\t" - "paddw %%mm0, %%mm2 \n\t" - "paddw %%mm0, %%mm2 \n\t" - "movq %%mm1, (%1) \n\t" - "movq %%mm4, 2*4*2(%1) \n\t" - "movq %%mm2, 1*4*2(%1) \n\t" - "movq %%mm3, 3*4*2(%1) \n\t" - :: "r" (src), "r"(dst) - ); -} -#endif - -static void (*dctB)(DCTELEM *dst, DCTELEM *src)= dctB_c; - -#define N0 4 -#define N1 5 -#define N2 10 -#define SN0 2 -#define SN1 2.2360679775 -#define SN2 3.16227766017 -#define N (1<<16) - -static const int factor[16]={ - N/(N0*N0), N/(N0*N1), N/(N0*N0),N/(N0*N2), - N/(N1*N0), N/(N1*N1), N/(N1*N0),N/(N1*N2), - N/(N0*N0), N/(N0*N1), N/(N0*N0),N/(N0*N2), - N/(N2*N0), N/(N2*N1), N/(N2*N0),N/(N2*N2), -}; - -static const int thres[16]={ - N/(SN0*SN0), N/(SN0*SN2), N/(SN0*SN0),N/(SN0*SN2), - N/(SN2*SN0), N/(SN2*SN2), N/(SN2*SN0),N/(SN2*SN2), - N/(SN0*SN0), N/(SN0*SN2), N/(SN0*SN0),N/(SN0*SN2), - N/(SN2*SN0), N/(SN2*SN2), N/(SN2*SN0),N/(SN2*SN2), -}; - -static int thres2[99][16]; - -static void init_thres2(void){ - int qp, i; - int bias= 0; //FIXME - - for(qp=0; qp<99; qp++){ - for(i=0; i<16; i++){ - thres2[qp][i]= ((i&1)?SN2:SN0) * ((i&4)?SN2:SN0) * XMAX(1,qp) * (1<<2) - 1 - bias; - } - } -} - -static int hardthresh_c(DCTELEM *src, int qp){ - int i; - int a; - - a= src[0] * factor[0]; - for(i=1; i<16; i++){ - unsigned int threshold1= thres2[qp][i]; - unsigned int threshold2= (threshold1<<1); - int level= src[i]; - if(((unsigned)(level+threshold1))>threshold2){ - a += level * factor[i]; - } - } - return (a + (1<<11))>>12; -} - -static int mediumthresh_c(DCTELEM *src, int qp){ - int i; - int a; - - a= src[0] * factor[0]; - for(i=1; i<16; i++){ - unsigned int threshold1= thres2[qp][i]; - unsigned int threshold2= (threshold1<<1); - int level= src[i]; - if(((unsigned)(level+threshold1))>threshold2){ - if(((unsigned)(level+2*threshold1))>2*threshold2){ - a += level * factor[i]; - }else{ - if(level>0) a+= 2*(level - (int)threshold1)*factor[i]; - else a+= 2*(level + (int)threshold1)*factor[i]; - } - } - } - return (a + (1<<11))>>12; -} - -static int softthresh_c(DCTELEM *src, int qp){ - int i; - int a; - - a= src[0] * factor[0]; - for(i=1; i<16; i++){ - unsigned int threshold1= thres2[qp][i]; - unsigned int threshold2= (threshold1<<1); - int level= src[i]; - if(((unsigned)(level+threshold1))>threshold2){ - if(level>0) a+= (level - (int)threshold1)*factor[i]; - else a+= (level + (int)threshold1)*factor[i]; - } - } - return (a + (1<<11))>>12; -} - -static int (*requantize)(DCTELEM *src, int qp)= hardthresh_c; - -static void filter(struct vf_priv_s *p, uint8_t *dst, uint8_t *src, int dst_stride, int src_stride, int width, int height, uint8_t *qp_store, int qp_stride, int is_luma){ - int x, y; - const int stride= is_luma ? p->temp_stride : ((width+16+15)&(~15)); - uint8_t *p_src= p->src + 8*stride; - DCTELEM *block= (DCTELEM *)p->src; - DCTELEM *temp= (DCTELEM *)(p->src + 32); - - if (!src || !dst) return; // HACK avoid crash for Y8 colourspace - for(y=0; y<height; y++){ - int index= 8 + 8*stride + y*stride; - fast_memcpy(p_src + index, src + y*src_stride, width); - for(x=0; x<8; x++){ - p_src[index - x - 1]= p_src[index + x ]; - p_src[index + width + x ]= p_src[index + width - x - 1]; - } - } - for(y=0; y<8; y++){ - fast_memcpy(p_src + ( 7-y)*stride, p_src + ( y+8)*stride, stride); - fast_memcpy(p_src + (height+8+y)*stride, p_src + (height-y+7)*stride, stride); - } - //FIXME (try edge emu) - - for(y=0; y<height; y++){ - for(x=-8; x<0; x+=4){ - const int index= x + y*stride + (8-3)*(1+stride) + 8; //FIXME silly offset - uint8_t *src = p_src + index; - DCTELEM *tp= temp+4*x; - - dctA_c(tp+4*8, src, stride); - } - for(x=0; x<width; ){ - const int qps= 3 + is_luma; - int qp; - int end= XMIN(x+8, width); - - if(p->qp) - qp= p->qp; - else{ - qp= qp_store[ (XMIN(x, width-1)>>qps) + (XMIN(y, height-1)>>qps) * qp_stride]; - qp=norm_qscale(qp, p->mpeg2); - } - for(; x<end; x++){ - const int index= x + y*stride + (8-3)*(1+stride) + 8; //FIXME silly offset - uint8_t *src = p_src + index; - DCTELEM *tp= temp+4*x; - int v; - - if((x&3)==0) - dctA_c(tp+4*8, src, stride); - - dctB(block, tp); - - v= requantize(block, qp); - v= (v + dither[y&7][x&7])>>6; - if((unsigned)v > 255) - v= (-v)>>31; - dst[x + y*dst_stride]= v; - } - } - } -} - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - int h= (height+16+15)&(~15); - - vf->priv->temp_stride= (width+16+15)&(~15); - vf->priv->src = av_malloc(vf->priv->temp_stride*(h+8)*sizeof(uint8_t)); - - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static void get_image(struct vf_instance *vf, mp_image_t *mpi){ - if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change - // ok, we can do pp in-place (or pp disabled): - vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, - mpi->type, mpi->flags | MP_IMGFLAG_READABLE, mpi->width, mpi->height); - mpi->planes[0]=vf->dmpi->planes[0]; - mpi->stride[0]=vf->dmpi->stride[0]; - mpi->width=vf->dmpi->width; - if(mpi->flags&MP_IMGFLAG_PLANAR){ - mpi->planes[1]=vf->dmpi->planes[1]; - mpi->planes[2]=vf->dmpi->planes[2]; - mpi->stride[1]=vf->dmpi->stride[1]; - mpi->stride[2]=vf->dmpi->stride[2]; - } - mpi->flags|=MP_IMGFLAG_DIRECT; -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - - if(mpi->flags&MP_IMGFLAG_DIRECT){ - dmpi=vf->dmpi; - }else{ - // no DR, so get a new image! hope we'll get DR buffer: - dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, - MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE, - mpi->width,mpi->height); - vf_clone_mpi_attributes(dmpi, mpi); - } - - vf->priv->mpeg2= mpi->qscale_type; - if(mpi->qscale || vf->priv->qp){ - filter(vf->priv, dmpi->planes[0], mpi->planes[0], dmpi->stride[0], mpi->stride[0], mpi->w, mpi->h, mpi->qscale, mpi->qstride, 1); - filter(vf->priv, dmpi->planes[1], mpi->planes[1], dmpi->stride[1], mpi->stride[1], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, mpi->qscale, mpi->qstride, 0); - filter(vf->priv, dmpi->planes[2], mpi->planes[2], dmpi->stride[2], mpi->stride[2], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, mpi->qscale, mpi->qstride, 0); - }else{ - memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h, dmpi->stride[0], mpi->stride[0]); - memcpy_pic(dmpi->planes[1], mpi->planes[1], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[1], mpi->stride[1]); - memcpy_pic(dmpi->planes[2], mpi->planes[2], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[2], mpi->stride[2]); - } - -#if HAVE_MMX - if(gCpuCaps.hasMMX) __asm__ volatile ("emms\n\t"); -#endif -#if HAVE_MMX2 - if(gCpuCaps.hasMMX2) __asm__ volatile ("sfence\n\t"); -#endif - - return vf_next_put_image(vf,dmpi, pts); -} - -static void uninit(struct vf_instance *vf){ - if(!vf->priv) return; - - av_free(vf->priv->src); - vf->priv->src= NULL; - - free(vf->priv); - vf->priv=NULL; -} - -//===========================================================================// -static int query_format(struct vf_instance *vf, unsigned int fmt){ - switch(fmt){ - case IMGFMT_YVU9: - case IMGFMT_IF09: - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_CLPL: - case IMGFMT_Y800: - case IMGFMT_Y8: - case IMGFMT_444P: - case IMGFMT_422P: - case IMGFMT_411P: - return vf_next_query_format(vf,fmt); - } - return 0; -} - -static int control(struct vf_instance *vf, int request, void* data){ - return vf_next_control(vf,request,data); -} - -static int vf_open(vf_instance_t *vf, char *args){ - vf->config=config; - vf->put_image=put_image; - vf->get_image=get_image; - vf->query_format=query_format; - vf->uninit=uninit; - vf->control= control; - vf->priv=malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - - if (args) sscanf(args, "%d:%d", &vf->priv->qp, &vf->priv->mode); - - if(vf->priv->qp < 0) - vf->priv->qp = 0; - - init_thres2(); - - switch(vf->priv->mode){ - case 0: requantize= hardthresh_c; break; - case 1: requantize= softthresh_c; break; - default: - case 2: requantize= mediumthresh_c; break; - } - -#if HAVE_MMX - if(gCpuCaps.hasMMX){ - dctB= dctB_mmx; - } -#endif -#if 0 - if(gCpuCaps.hasMMX){ - switch(vf->priv->mode){ - case 0: requantize= hardthresh_mmx; break; - case 1: requantize= softthresh_mmx; break; - } - } -#endif - - return 1; -} - -const vf_info_t vf_info_pp7 = { - "postprocess 7", - "pp7", - "Michael Niedermayer", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_qp.c b/libmpcodecs/vf_qp.c deleted file mode 100644 index 64e62723d8..0000000000 --- a/libmpcodecs/vf_qp.c +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <math.h> -#include <inttypes.h> - -#include <libavutil/eval.h> -#include <libavutil/mem.h> - -#include "mp_msg.h" -#include "cpudetect.h" -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" -#include "libvo/fastmemcpy.h" - - -struct vf_priv_s { - char eq[200]; - int8_t *qp; - int8_t lut[257]; - int qp_stride; -}; - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - int h= (height+15)>>4; - int i; - - vf->priv->qp_stride= (width+15)>>4; - vf->priv->qp= av_malloc(vf->priv->qp_stride*h*sizeof(int8_t)); - - for(i=-129; i<128; i++){ - double const_values[]={ - M_PI, - M_E, - i != -129, - i, - 0 - }; - const char * const const_names[]={ - "PI", - "E", - "known", - "qp", - NULL - }; - double temp_val; - int res; - - res= av_expr_parse_and_eval(&temp_val, vf->priv->eq, const_names, const_values, NULL, NULL, NULL, NULL, NULL, 0, NULL); - - if (res < 0){ - mp_msg(MSGT_VFILTER, MSGL_ERR, "qp: Error evaluating \"%s\" \n", vf->priv->eq); - return 0; - } - vf->priv->lut[i+129]= lrintf(temp_val); - } - - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static void get_image(struct vf_instance *vf, mp_image_t *mpi){ - if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change - // ok, we can do pp in-place (or pp disabled): - vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, - mpi->type, mpi->flags, mpi->w, mpi->h); - mpi->planes[0]=vf->dmpi->planes[0]; - mpi->stride[0]=vf->dmpi->stride[0]; - mpi->width=vf->dmpi->width; - if(mpi->flags&MP_IMGFLAG_PLANAR){ - mpi->planes[1]=vf->dmpi->planes[1]; - mpi->planes[2]=vf->dmpi->planes[2]; - mpi->stride[1]=vf->dmpi->stride[1]; - mpi->stride[2]=vf->dmpi->stride[2]; - } - mpi->flags|=MP_IMGFLAG_DIRECT; -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - int x,y; - - if(!(mpi->flags&MP_IMGFLAG_DIRECT)){ - // no DR, so get a new image! hope we'll get DR buffer: - vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE, - mpi->w,mpi->h); - } - - dmpi= vf->dmpi; - - if(!(mpi->flags&MP_IMGFLAG_DIRECT)){ - memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h, dmpi->stride[0], mpi->stride[0]); - if(mpi->flags&MP_IMGFLAG_PLANAR){ - memcpy_pic(dmpi->planes[1], mpi->planes[1], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[1], mpi->stride[1]); - memcpy_pic(dmpi->planes[2], mpi->planes[2], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[2], mpi->stride[2]); - } - } - vf_clone_mpi_attributes(dmpi, mpi); - - dmpi->qscale = vf->priv->qp; - dmpi->qstride= vf->priv->qp_stride; - if(mpi->qscale){ - for(y=0; y<((dmpi->h+15)>>4); y++){ - for(x=0; x<vf->priv->qp_stride; x++){ - dmpi->qscale[x + dmpi->qstride*y]= - vf->priv->lut[ 129 + ((int8_t)mpi->qscale[x + mpi->qstride*y]) ]; - } - } - }else{ - int qp= vf->priv->lut[0]; - for(y=0; y<((dmpi->h+15)>>4); y++){ - for(x=0; x<vf->priv->qp_stride; x++){ - dmpi->qscale[x + dmpi->qstride*y]= qp; - } - } - } - - return vf_next_put_image(vf,dmpi, pts); -} - -static void uninit(struct vf_instance *vf){ - if(!vf->priv) return; - - av_free(vf->priv->qp); - vf->priv->qp= NULL; - - av_free(vf->priv); - vf->priv=NULL; -} - -//===========================================================================// -static int vf_open(vf_instance_t *vf, char *args){ - vf->config=config; - vf->put_image=put_image; - vf->get_image=get_image; - vf->uninit=uninit; - vf->priv=av_malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - -// avcodec_init(); - - if (args) strncpy(vf->priv->eq, args, 199); - - return 1; -} - -const vf_info_t vf_info_qp = { - "QP changer", - "qp", - "Michael Niedermayer", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_remove_logo.c b/libmpcodecs/vf_remove_logo.c deleted file mode 100644 index 1270f5e6c9..0000000000 --- a/libmpcodecs/vf_remove_logo.c +++ /dev/null @@ -1,908 +0,0 @@ -/* - * This filter loads a .pgm mask file showing where a logo is and uses - * a blur transform to remove the logo. - * - * Copyright (C) 2005 Robert Edele <yartrebo@earthlink.net> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -/** - * \file vf_remove_logo.c - * - * \brief Advanced blur-based logo removing filter. - - * Hello and welcome. This code implements a filter to remove annoying TV - * logos and other annoying images placed onto a video stream. It works by filling - * in the pixels that comprise the logo with neighboring pixels. The transform is - * very loosely based on a gaussian blur, but it is different enough to merit its - * own paragraph later on. It is a major improvement on the old delogo filter as - * it both uses a better blurring algorithm and uses a bitmap to use an arbitrary - * and generally much tighter fitting shape than a rectangle. - * - * The filter requires 1 argument and has no optional arguments. It requires - * a filter bitmap, which must be in PGM or PPM format. A sample invocation would - * be -vf remove_logo=/home/username/logo_bitmaps/xyz.pgm. Pixels with a value of - * zero are not part of the logo, and non-zero pixels are part of the logo. If you - * use white (255) for the logo and black (0) for the rest, you will be safe. For - * making the filter bitmap, I recommend taking a screen capture of a black frame - * with the logo visible, and then using The GIMP's threshold filter followed by - * the erode filter once or twice. If needed, little splotches can be fixed - * manually. Remember that if logo pixels are not covered, the filter quality will - * be much reduced. Marking too many pixels as part of the logo doesn't hurt as - * much, but it will increase the amount of blurring needed to cover over the - * image and will destroy more information than necessary. Additionally, this blur - * algorithm is O(n) = n^4, where n is the width and height of a hypothetical - * square logo, so extra pixels will slow things down on a large lo - * - * The logo removal algorithm has two key points. The first is that it - * distinguishes between pixels in the logo and those not in the logo by using the - * passed-in bitmap. Pixels not in the logo are copied over directly without being - * modified and they also serve as source pixels for the logo fill-in. Pixels - * inside the logo have the mask applied. - * - * At init-time the bitmap is reprocessed internally, and the distance to the - * nearest edge of the logo (Manhattan distance), along with a little extra to - * remove rough edges, is stored in each pixel. This is done using an in-place - * erosion algorithm, and incrementing each pixel that survives any given erosion. - * Once every pixel is eroded, the maximum value is recorded, and a set of masks - * from size 0 to this size are generaged. The masks are circular binary masks, - * where each pixel within a radius N (where N is the size of the mask) is a 1, - * and all other pixels are a 0. Although a gaussian mask would be more - * mathematically accurate, a binary mask works better in practice because we - * generally do not use the central pixels in the mask (because they are in the - * logo region), and thus a gaussian mask will cause too little blur and thus a - * very unstable image. - * - * The mask is applied in a special way. Namely, only pixels in the mask that - * line up to pixels outside the logo are used. The dynamic mask size means that - * the mask is just big enough so that the edges touch pixels outside the logo, so - * the blurring is kept to a minimum and at least the first boundary condition is - * met (that the image function itself is continuous), even if the second boundary - * condition (that the derivative of the image function is continuous) is not met. - * A masking algorithm that does preserve the second boundary coundition - * (perhaps something based on a highly-modified bi-cubic algorithm) should offer - * even better results on paper, but the noise in a typical TV signal should make - * anything based on derivatives hopelessly noisy. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <ctype.h> -#include <inttypes.h> - -#include "osdep/io.h" - -#include "config.h" -#include "mp_msg.h" -#include "libvo/fastmemcpy.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -//===========================================================================// - -/** \brief Returns the larger of the two arguments. **/ -#define max(x,y) ((x)>(y)?(x):(y)) -/** \brief Returns the smaller of the two arguments. **/ -#define min(x,y) ((x)>(y)?(y):(x)) - -/** - * \brief Test if a pixel is part of the logo. - */ -#define test_filter(image, x, y) ((unsigned char) (image->pixel[((y) * image->width) + (x)])) - -/** - * \brief Chooses a slightly larger mask size to improve performance. - * - * This function maps the absolute minimum mask size needed to the mask size we'll - * actually use. f(x) = x (the smallest that will work) will produce the sharpest - * results, but will be quite jittery. f(x) = 1.25x (what I'm using) is a good - * tradeoff in my opinion. This will calculate only at init-time, so you can put a - * long expression here without effecting performance. - */ -#define apply_mask_fudge_factor(x) (((x) >> 2) + x) - -/** - * \brief Simple implementation of the PGM image format. - * - * This struct holds a bare-bones image loaded from a PGM or PPM file. Once - * loaded and pre-processed, each pixel in this struct will contain how far from - * the edge of the logo each pixel is, using the manhattan distance (|dx| + |dy|). - * - * pixels in char * pixel can be addressed using (y * width) + height. - */ -typedef struct -{ - unsigned int width; - unsigned int height; - - unsigned char * pixel; - -} pgm_structure; - -/** - * \brief Stores persistant variables. - * - * Variables stored here are kept from frame to frame, and separate instances of - * the filter will get their own separate copies. - */ -struct vf_priv_s -{ - unsigned int fmt; /* Not exactly sure of the use for this. It came with the example filter I used as a basis for this, and it looks like a lot of stuff will break if I remove it. */ - int max_mask_size; /* The largest possible mask size that will be needed with the given filter and corresponding half_size_filter. The half_size_filter can have a larger requirment in some rare (but not degenerate) cases. */ - int * * * mask; /* Stores our collection of masks. The first * is for an array of masks, the second for the y axis, and the third for the x axis. */ - pgm_structure * filter; /* Stores the full-size filter image. This is used to tell what pixels are in the logo or not in the luma plane. */ - pgm_structure * half_size_filter; /* Stores a 50% width and 50% height filter image. This is used to tell what pixels are in the logo or not in the chroma planes. */ - /* These 8 variables store the bounding rectangles that the logo resides in. */ - int bounding_rectangle_posx1; - int bounding_rectangle_posy1; - int bounding_rectangle_posx2; - int bounding_rectangle_posy2; - int bounding_rectangle_half_size_posx1; - int bounding_rectangle_half_size_posy1; - int bounding_rectangle_half_size_posx2; - int bounding_rectangle_half_size_posy2; -} vf_priv_s; - -/** - * \brief Mallocs memory and checks to make sure it succeeded. - * - * \param size How many bytes to allocate. - * - * \return A pointer to the freshly allocated memory block, or NULL on failutre. - * - * Mallocs memory, and checks to make sure it was successfully allocated. Because - * of how MPlayer works, it cannot safely halt execution, but at least the user - * will get an error message before the segfault happens. - */ -static void * safe_malloc(int size) -{ - void * answer = malloc(size); - if (answer == NULL) - mp_msg(MSGT_VFILTER, MSGL_ERR, "Unable to allocate memory in vf_remove_logo.c\n"); - - return answer; -} - -/** - * \brief Calculates the smallest rectangle that will encompass the logo region. - * - * \param filter This image contains the logo around which the rectangle will - * will be fitted. - * - * The bounding rectangle is calculated by testing successive lines (from the four - * sides of the rectangle) until no more can be removed without removing logo - * pixels. The results are returned by reference to posx1, posy1, posx2, and - * posy2. - */ -static void calculate_bounding_rectangle(int * posx1, int * posy1, int * posx2, int * posy2, pgm_structure * filter) -{ - int x; /* Temporary variables to run */ - int y; /* through each row or column. */ - int start_x; - int start_y; - int end_x = filter->width - 1; - int end_y = filter->height - 1; - int did_we_find_a_logo_pixel = 0; - - /* Let's find the top bound first. */ - for (start_x = 0; start_x < filter->width && !did_we_find_a_logo_pixel; start_x++) - { - for (y = 0; y < filter->height; y++) - { - did_we_find_a_logo_pixel |= test_filter(filter, start_x, y); - } - } - start_x--; - - /* Now the bottom bound. */ - did_we_find_a_logo_pixel = 0; - for (end_x = filter->width - 1; end_x > start_x && !did_we_find_a_logo_pixel; end_x--) - { - for (y = 0; y < filter->height; y++) - { - did_we_find_a_logo_pixel |= test_filter(filter, end_x, y); - } - } - end_x++; - - /* Left bound. */ - did_we_find_a_logo_pixel = 0; - for (start_y = 0; start_y < filter->height && !did_we_find_a_logo_pixel; start_y++) - { - for (x = 0; x < filter->width; x++) - { - did_we_find_a_logo_pixel |= test_filter(filter, x, start_y); - } - } - start_y--; - - /* Right bound. */ - did_we_find_a_logo_pixel = 0; - for (end_y = filter->height - 1; end_y > start_y && !did_we_find_a_logo_pixel; end_y--) - { - for (x = 0; x < filter->width; x++) - { - did_we_find_a_logo_pixel |= test_filter(filter, x, end_y); - } - } - end_y++; - - *posx1 = start_x; - *posy1 = start_y; - *posx2 = end_x; - *posy2 = end_y; - - return; -} - -/** - * \brief Free mask memory. - * - * \param vf Data structure which stores our persistant data, and is to be freed. - * - * We call this function when our filter is done. It will free the memory - * allocated to the masks and leave the variables in a safe state. - */ -static void destroy_masks(vf_instance_t * vf) -{ - int a, b; - - /* Load values from the vf->priv struct for faster dereferencing. */ - int * * * mask = vf->priv->mask; - int max_mask_size = vf->priv->max_mask_size; - - if (mask == NULL) - return; /* Nothing allocated, so return before we segfault. */ - - /* Free all allocated memory. */ - for (a = 0; a <= max_mask_size; a++) /* Loop through each mask. */ - { - for (b = -a; b <= a; b++) /* Loop through each scanline in a mask. */ - { - free(mask[a][b + a]); /* Free a scanline. */ - } - free(mask[a]); /* Free a mask. */ - } - free(mask); /* Free the array of pointers pointing to the masks. */ - - /* Set the pointer to NULL, so that any duplicate calls to this function will not cause a crash. */ - vf->priv->mask = NULL; - - return; -} - -/** - * \brief Set up our array of masks. - * - * \param vf Where our filter stores persistance data, like these masks. - * - * This creates an array of progressively larger masks and calculates their - * values. The values will not change during program execution once this function - * is done. - */ -static void initialize_masks(vf_instance_t * vf) -{ - int a, b, c; - - /* Load values from the vf->priv struct for faster dereferencing. */ - int * * * mask = vf->priv->mask; - int max_mask_size = vf->priv->max_mask_size; /* This tells us how many masks we'll need to generate. */ - - /* Create a circular mask for each size up to max_mask_size. When the filter is applied, the mask size is - determined on a pixel by pixel basis, with pixels nearer the edge of the logo getting smaller mask sizes. */ - mask = (int * * *) safe_malloc(sizeof(int * *) * (max_mask_size + 1)); - for (a = 0; a <= max_mask_size; a++) - { - mask[a] = (int * *) safe_malloc(sizeof(int *) * ((a * 2) + 1)); - for (b = -a; b <= a; b++) - { - mask[a][b + a] = (int *) safe_malloc(sizeof(int) * ((a * 2) + 1)); - for (c = -a; c <= a; c++) - { - if ((b * b) + (c * c) <= (a * a)) /* Circular 0/1 mask. */ - mask[a][b + a][c + a] = 1; - else - mask[a][b + a][c + a] = 0; - } - } - } - - /* Store values back to vf->priv so they aren't lost after the function returns. */ - vf->priv->mask = mask; - - return; -} - -/** - * \brief Pre-processes an image to give distance information. - * - * \param vf Data structure that holds persistant information. All it is used for - in this function is to store the calculated max_mask_size variable. - * \param mask This image will be converted from a greyscale image into a - * distance image. - * - * This function takes a greyscale image (pgm_structure * mask) and converts it - * in place into a distance image. A distance image is zero for pixels ourside of - * the logo and is the manhattan distance (|dx| + |dy|) for pixels inside of the - * logo. This will overestimate the distance, but that is safe, and is far easier - * to implement than a proper pythagorean distance since I'm using a modified - * erosion algorithm to compute the distances. - */ -static void convert_mask_to_strength_mask(vf_instance_t * vf, pgm_structure * mask) -{ - int x, y; /* Used by our for loops to go through every single pixel in the picture one at a time. */ - int has_anything_changed = 1; /* Used by the main while() loop to know if anything changed on the last erosion. */ - int current_pass = 0; /* How many times we've gone through the loop. Used in the in-place erosion algorithm - and to get us max_mask_size later on. */ - int max_mask_size; /* This will record how large a mask the pixel that is the furthest from the edge of the logo - (and thus the neediest) is. */ - char * current_pixel = mask->pixel; /* This stores the actual pixel data. */ - - /* First pass, set all non-zero values to 1. After this loop finishes, the data should be considered numeric - data for the filter, not color data. */ - for (x = 0; x < mask->height * mask->width; x++, current_pixel++) - if(*current_pixel) *current_pixel = 1; - - /* Second pass and future passes. For each pass, if a pixel is itself the same value as the current pass, - and its four neighbors are too, then it is incremented. If no pixels are incremented by the end of the pass, - then we go again. Edge pixels are counted as always excluded (this should be true anyway for any sane mask, - but if it isn't this will ensure that we eventually exit). */ - while (has_anything_changed) - { - current_pass++; - current_pixel = mask->pixel; - - has_anything_changed = 0; /* If this doesn't get set by the end of this pass, then we're done. */ - - for (y = 1; y < mask->height - 1; y++) - { - for (x = 1; x < mask->width - 1; x++) - { - /* Apply the in-place erosion transform. It is based on the following two premises: 1 - Any pixel that fails 1 erosion - will fail all future erosions. 2 - Only pixels having survived all erosions up to the present will be >= to - current_pass. It doesn't matter if it survived the current pass, failed it, or hasn't been tested yet. */ - if (*current_pixel >= current_pass && /* By using >= instead of ==, we allow the algorithm to work in place. */ - *(current_pixel + 1) >= current_pass && - *(current_pixel - 1) >= current_pass && - *(current_pixel + mask->width) >= current_pass && - *(current_pixel - mask->width) >= current_pass) - { - (*current_pixel)++; /* Increment the value since it still has not been eroded, as evidenced by the if statement - that just evaluated to true. */ - has_anything_changed = 1; - } - current_pixel++; - } - } - } - - /* Apply the fudge factor, which will increase the size of the mask a little to reduce jitter at the cost of more blur. */ - for (y = 1; y < mask->height - 1; y++) - { - for (x = 1; x < mask->width - 1; x++) - { - mask->pixel[(y * mask->width) + x] = apply_mask_fudge_factor(mask->pixel[(y * mask->width) + x]); - } - } - - max_mask_size = current_pass + 1; /* As a side-effect, we now know the maximum mask size, which we'll use to generate our masks. */ - max_mask_size = apply_mask_fudge_factor(max_mask_size); /* Apply the fudge factor to this number too, since we must - ensure that enough masks are generated. */ - vf->priv->max_mask_size = max_mask_size; /* Commit the newly calculated max_mask_size to the vf->priv struct. */ - - return; -} - -/** - * \brief Our blurring function. - * - * \param vf Stores persistant data. In this function we are interested in the - * array of masks. - * \param value_out The properly blurred and delogoed pixel is outputted here. - * \param logo_mask Tells us which pixels are in the logo and which aren't. - * \param image The image that is having its logo removed. - * \param x x-coordinate of the pixel to blur. - * \param y y-coordinate of the pixel to blur. - * \param plane 0 = luma, 1 = blue chroma, 2 = red chroma (YUV). - * - * This function is the core of the filter. It takes a pixel that is inside the - * logo and blurs it. It does so by finding the average of all the pixels within - * the mask and outside of the logo. - */ -static void get_blur(const vf_instance_t * const vf, unsigned int * const value_out, const pgm_structure * const logo_mask, - const mp_image_t * const image, const int x, const int y, const int plane) -{ - int mask_size; /* Mask size tells how large a circle to use. The radius is about (slightly larger than) mask size. */ - /* Get values from vf->priv for faster dereferencing. */ - int * * * mask = vf->priv->mask; - - int start_posx, start_posy, end_posx, end_posy; - int i, j; - unsigned int accumulator = 0, divisor = 0; - const unsigned char * mask_read_position; /* What pixel we are reading out of the circular blur mask. */ - const unsigned char * logo_mask_read_position; /* What pixel we are reading out of the filter image. */ - - /* Prepare our bounding rectangle and clip it if need be. */ - mask_size = test_filter(logo_mask, x, y); - start_posx = max(0, x - mask_size); - start_posy = max(0, y - mask_size); - end_posx = min(image->width - 1, x + mask_size); - end_posy = min(image->height - 1, y + mask_size); - - mask_read_position = image->planes[plane] + (image->stride[plane] * start_posy) + start_posx; - logo_mask_read_position = logo_mask->pixel + (start_posy * logo_mask->width) + start_posx; - - for (j = start_posy; j <= end_posy; j++) - { - for (i = start_posx; i <= end_posx; i++) - { - if (!(*logo_mask_read_position) && mask[mask_size][i - start_posx][j - start_posy]) - { /* Check to see if this pixel is in the logo or not. Only use the pixel if it is not. */ - accumulator += *mask_read_position; - divisor++; - } - - mask_read_position++; - logo_mask_read_position++; - } - - mask_read_position += (image->stride[plane] - ((end_posx + 1) - start_posx)); - logo_mask_read_position += (logo_mask->width - ((end_posx + 1) - start_posx)); - } - - if (divisor == 0) /* This means that not a single pixel is outside of the logo, so we have no data. */ - { /* We should put some eye catching value here, to indicate the flaw to the user. */ - *value_out = 255; - } - else /* Else we need to normalise the data using the divisor. */ - { - *value_out = (accumulator + (divisor / 2)) / divisor; /* Divide, taking into account average rounding error. */ - } - - return; -} - -/** - * \brief Free a pgm_structure. Undoes load_pgm(...). - */ -static void destroy_pgm(pgm_structure * to_be_destroyed) -{ - if (to_be_destroyed == NULL) - return; /* Don't do anything if a NULL pointer was passed it. */ - - /* Internally allocated memory. */ - if (to_be_destroyed->pixel != NULL) - { - free(to_be_destroyed->pixel); - to_be_destroyed->pixel = NULL; - } - - /* Free the actual struct instance. This is done here and not by the calling function. */ - free(to_be_destroyed); -} - -/** \brief Helper function for load_pgm(...) to skip whitespace. */ -static void load_pgm_skip(FILE *f) { - int c, comment = 0; - do { - c = fgetc(f); - if (c == '#') - comment = 1; - if (c == '\n') - comment = 0; - } while (c != EOF && (isspace(c) || comment)); - ungetc(c, f); -} - -#define REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE(message) {mp_msg(MSGT_VFILTER, MSGL_ERR, message); return NULL;} - -/** - * \brief Loads a raw pgm or ppm file into a newly created pgm_structure object. - * - * \param file_name The name of the file to be loaded. So long as the file is a - * valid pgm or ppm file, it will load correctly, even if the - * extension is missing or invalid. - * - * \return A pointer to the newly created pgm_structure object. Don't forget to - * call destroy_pgm(...) when you're done with this. If an error occurs, - * NULL is returned. - * - * Can load either raw pgm (P5) or raw ppm (P6) image files as a binary image. - * While a pgm file will be loaded normally (greyscale), the only thing that is - * guaranteed with ppm is that all zero (R = 0, G = 0, B = 0) pixels will remain - * zero, and non-zero pixels will remain non-zero. - */ -static pgm_structure * load_pgm(const char * file_name) -{ - int maximum_greyscale_value; - FILE * input; - int pnm_number; - pgm_structure * new_pgm = (pgm_structure *) safe_malloc (sizeof(pgm_structure)); - char * write_position; - char * end_position; - int image_size; /* width * height */ - - if((input = fopen(file_name, "rb")) == NULL) REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE("[vf]remove-logo: Unable to open file. File not found or insufficient permissions.\n"); - - /* Parse the PGM header. */ - if (fgetc(input) != 'P') REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE("[vf]remove-logo: File is not a valid PGM or PPM file.\n"); - pnm_number = fgetc(input) - '0'; - if (pnm_number != 5 && pnm_number != 6) REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE("[vf]remove-logo: Invalid PNM file. Only raw PGM (Portable Gray Map) and raw PPM (Portable Pixel Map) subtypes are allowed.\n"); - load_pgm_skip(input); - if (fscanf(input, "%i", &(new_pgm->width)) != 1) REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE("[vf]remove-logo: Invalid PGM/PPM header.\n"); - load_pgm_skip(input); - if (fscanf(input, "%i", &(new_pgm->height)) != 1) REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE("[vf]remove-logo: Invalid PGM/PPM header.\n"); - load_pgm_skip(input); - if (fscanf(input, "%i", &maximum_greyscale_value) != 1) REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE("[vf]remove-logo: Invalid PGM/PPM header.\n"); - if (maximum_greyscale_value >= 256) REMOVE_LOGO_LOAD_PGM_ERROR_MESSAGE("[vf]remove_logo: Only 1 byte per pixel (pgm) or 1 byte per color value (ppm) are supported.\n"); - load_pgm_skip(input); - - new_pgm->pixel = (unsigned char *) safe_malloc (sizeof(unsigned char) * new_pgm->width * new_pgm->height); - - /* Load the pixels. */ - /* Note: I am aware that fgetc(input) isn't the fastest way of doing things, but it is quite compact and the code only runs once when the filter is initialized.*/ - image_size = new_pgm->width * new_pgm->height; - end_position = new_pgm->pixel + image_size; - for (write_position = new_pgm->pixel; write_position < end_position; write_position++) - { - *write_position = fgetc(input); - if (pnm_number == 6) /* This tests to see if the file is a PPM file. */ - { /* If it is, then consider the pixel set if any of the three color channels are set. Since we just care about == 0 or != 0, a bitwise or will do the trick. */ - *write_position |= fgetc(input); - *write_position |= fgetc(input); - } - } - - return new_pgm; -} - -/** - * \brief Generates a scaled down image with half width, height, and intensity. - * - * \param vf Our struct for persistant data. In this case, it is used to update - * mask_max_size with the larger of the old or new value. - * \param input_image The image from which the new half-sized one will be based. - * - * \return The newly allocated and shrunken image. - * - * This function not only scales down an image, but halves the value in each pixel - * too. The purpose of this is to produce a chroma filter image out of a luma - * filter image. The pixel values store the distance to the edge of the logo and - * halving the dimensions halves the distance. This function rounds up, because - * a downwards rounding error could cause the filter to fail, but an upwards - * rounding error will only cause a minor amount of excess blur in the chroma - * planes. - */ -static pgm_structure * generate_half_size_image(vf_instance_t * vf, pgm_structure * input_image) -{ - int x, y; - pgm_structure * new_pgm = (pgm_structure *) safe_malloc (sizeof(pgm_structure)); - int has_anything_changed = 1; - int current_pass; - int max_mask_size; - char * current_pixel; - - new_pgm->width = input_image->width / 2; - new_pgm->height = input_image->height / 2; - new_pgm->pixel = (unsigned char *) safe_malloc (sizeof(unsigned char) * new_pgm->width * new_pgm->height); - - /* Copy over the image data, using the average of 4 pixels for to calculate each downsampled pixel. */ - for (y = 0; y < new_pgm->height; y++) - for (x = 0; x < new_pgm->width; x++) - { - /* Set the pixel if there exists a non-zero value in the source pixels, else clear it. */ - new_pgm->pixel[(y * new_pgm->width) + x] = input_image->pixel[((y << 1) * input_image->width) + (x << 1)] || - input_image->pixel[((y << 1) * input_image->width) + (x << 1) + 1] || - input_image->pixel[(((y << 1) + 1) * input_image->width) + (x << 1)] || - input_image->pixel[(((y << 1) + 1) * input_image->width) + (x << 1) + 1]; - new_pgm->pixel[(y * new_pgm->width) + x] = min(1, new_pgm->pixel[(y * new_pgm->width) + x]); - } - - /* Now we need to recalculate the numbers for the smaller size. Just using the old_value / 2 can cause subtle - and fairly rare, but very nasty, bugs. */ - - current_pixel = new_pgm->pixel; - /* First pass, set all non-zero values to 1. */ - for (x = 0; x < new_pgm->height * new_pgm->width; x++, current_pixel++) - if(*current_pixel) *current_pixel = 1; - - /* Second pass and future passes. For each pass, if a pixel is itself the same value as the current pass, - and its four neighbors are too, then it is incremented. If no pixels are incremented by the end of the pass, - then we go again. Edge pixels are counted as always excluded (this should be true anyway for any sane mask, - but if it isn't this will ensure that we eventually exit). */ - current_pass = 0; - while (has_anything_changed) - { - current_pass++; - - has_anything_changed = 0; /* If this doesn't get set by the end of this pass, then we're done. */ - - for (y = 1; y < new_pgm->height - 1; y++) - { - for (x = 1; x < new_pgm->width - 1; x++) - { - if (new_pgm->pixel[(y * new_pgm->width) + x] >= current_pass && /* By using >= instead of ==, we allow the algorithm to work in place. */ - new_pgm->pixel[(y * new_pgm->width) + (x + 1)] >= current_pass && - new_pgm->pixel[(y * new_pgm->width) + (x - 1)] >= current_pass && - new_pgm->pixel[((y + 1) * new_pgm->width) + x] >= current_pass && - new_pgm->pixel[((y - 1) * new_pgm->width) + x] >= current_pass) - { - new_pgm->pixel[(y * new_pgm->width) + x]++; /* Increment the value since it still has not been eroded, - as evidenced by the if statement that just evaluated to true. */ - has_anything_changed = 1; - } - } - } - } - - for (y = 1; y < new_pgm->height - 1; y++) - { - for (x = 1; x < new_pgm->width - 1; x++) - { - new_pgm->pixel[(y * new_pgm->width) + x] = apply_mask_fudge_factor(new_pgm->pixel[(y * new_pgm->width) + x]); - } - } - - max_mask_size = current_pass + 1; /* As a side-effect, we now know the maximum mask size, which we'll use to generate our masks. */ - max_mask_size = apply_mask_fudge_factor(max_mask_size); - /* Commit the newly calculated max_mask_size to the vf->priv struct. */ - vf->priv->max_mask_size = max(max_mask_size, vf->priv->max_mask_size); - - return new_pgm; -} - -/** - * \brief Checks if YV12 is supported by the next filter. - */ -static unsigned int find_best(struct vf_instance *vf){ - int is_format_okay = vf->next->query_format(vf->next, IMGFMT_YV12); - if ((is_format_okay & VFCAP_CSP_SUPPORTED_BY_HW) || (is_format_okay & VFCAP_CSP_SUPPORTED)) - return IMGFMT_YV12; - else - return 0; -} - -//===========================================================================// - -/** - * \brief Configure the filter and call the next filter's config function. - */ -static int config(struct vf_instance *vf, int width, int height, int d_width, int d_height, unsigned int flags, unsigned int outfmt) -{ - if(!(vf->priv->fmt=find_best(vf))) - return 0; - else - return vf_next_config(vf,width,height,d_width,d_height,flags,vf->priv->fmt); -} - -/** - * \brief Removes the logo from a plane (either luma or chroma). - * - * \param vf Not needed by this function, but needed by the blur function. - * \param source The image to have it's logo removed. - * \param destination Where the output image will be stored. - * \param source_stride How far apart (in memory) two consecutive lines are. - * \param destination Same as source_stride, but for the destination image. - * \param width Width of the image. This is the same for source and destination. - * \param height Height of the image. This is the same for source and destination. - * \param is_image_direct If the image is direct, then source and destination are - * the same and we can save a lot of time by not copying pixels that - * haven't changed. - * \param filter The image that stores the distance to the edge of the logo for - * each pixel. - * \param logo_start_x Smallest x-coordinate that contains at least 1 logo pixel. - * \param logo_start_y Smallest y-coordinate that contains at least 1 logo pixel. - * \param logo_end_x Largest x-coordinate that contains at least 1 logo pixel. - * \param logo_end_y Largest y-coordinate that contains at least 1 logo pixel. - * - * This function processes an entire plane. Pixels outside of the logo are copied - * to the output without change, and pixels inside the logo have the de-blurring - * function applied. - */ -static void convert_yv12(const vf_instance_t * const vf, const char * const source, const int source_stride, - const mp_image_t * const source_image, const int width, const int height, - char * const destination, const int destination_stride, int is_image_direct, pgm_structure * filter, - const int plane, const int logo_start_x, const int logo_start_y, const int logo_end_x, const int logo_end_y) -{ - int y; - int x; - - /* These pointers point to where we are getting our pixel data (inside mpi) and where we are storing it (inside dmpi). */ - const unsigned char * source_line; - unsigned char * destination_line; - - if (!is_image_direct) - memcpy_pic(destination, source, width, height, destination_stride, source_stride); - - for (y = logo_start_y; y <= logo_end_y; y++) - { - source_line = (const unsigned char *) source + (source_stride * y); - destination_line = (unsigned char *) destination + (destination_stride * y); - - for (x = logo_start_x; x <= logo_end_x; x++) - { - unsigned int output; - - if (filter->pixel[(y * filter->width) + x]) /* Only process if we are in the logo. */ - { - get_blur(vf, &output, filter, source_image, x, y, plane); - destination_line[x] = output; - } - else /* Else just copy the data. */ - if (!is_image_direct) - destination_line[x] = source_line[x]; - } - } -} - -/** - * \brief Process a frame. - * - * \param mpi The image sent to use by the previous filter. - * \param dmpi Where we will store the processed output image. - * \param vf This is how the filter gets access to it's persistant data. - * - * \return The return code of the next filter, or 0 on failure/error. - * - * This function processes an entire frame. The frame is sent by the previous - * filter, has the logo removed by the filter, and is then sent to the next - * filter. - */ -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - - dmpi=vf_get_image(vf->next,vf->priv->fmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->w, mpi->h); - - /* Check to make sure that the filter image and the video stream are the same size. */ - if (vf->priv->filter->width != mpi->w || vf->priv->filter->height != mpi->h) - { - mp_msg(MSGT_VFILTER,MSGL_ERR, "Filter image and video stream are not of the same size. (Filter: %d x %d, Stream: %d x %d)\n", - vf->priv->filter->width, vf->priv->filter->height, mpi->w, mpi->h); - return 0; - } - - switch(dmpi->imgfmt){ - case IMGFMT_YV12: - convert_yv12(vf, mpi->planes[0], mpi->stride[0], mpi, mpi->w, mpi->h, - dmpi->planes[0], dmpi->stride[0], - mpi->flags & MP_IMGFLAG_DIRECT, vf->priv->filter, 0, - vf->priv->bounding_rectangle_posx1, vf->priv->bounding_rectangle_posy1, - vf->priv->bounding_rectangle_posx2, vf->priv->bounding_rectangle_posy2); - convert_yv12(vf, mpi->planes[1], mpi->stride[1], mpi, mpi->w / 2, mpi->h / 2, - dmpi->planes[1], dmpi->stride[1], - mpi->flags & MP_IMGFLAG_DIRECT, vf->priv->half_size_filter, 1, - vf->priv->bounding_rectangle_half_size_posx1, vf->priv->bounding_rectangle_half_size_posy1, - vf->priv->bounding_rectangle_half_size_posx2, vf->priv->bounding_rectangle_half_size_posy2); - convert_yv12(vf, mpi->planes[2], mpi->stride[2], mpi, mpi->w / 2, mpi->h / 2, - dmpi->planes[2], dmpi->stride[2], - mpi->flags & MP_IMGFLAG_DIRECT, vf->priv->half_size_filter, 2, - vf->priv->bounding_rectangle_half_size_posx1, vf->priv->bounding_rectangle_half_size_posy1, - vf->priv->bounding_rectangle_half_size_posx2, vf->priv->bounding_rectangle_half_size_posy2); - break; - - default: - mp_msg(MSGT_VFILTER,MSGL_ERR,"Unhandled format: 0x%X\n",dmpi->imgfmt); - return 0; - } - - return vf_next_put_image(vf,dmpi, pts); -} - -//===========================================================================// - -/** - * \brief Checks to see if the next filter accepts YV12 images. - */ -static int query_format(struct vf_instance *vf, unsigned int fmt) -{ - if (fmt == IMGFMT_YV12) - return vf->next->query_format(vf->next, IMGFMT_YV12); - else - return 0; -} - -/** - * \brief Frees memory that our filter allocated. - * - * This is called at exit-time. - */ -static void uninit(vf_instance_t *vf) -{ - /* Destroy our masks and images. */ - destroy_pgm(vf->priv->filter); - destroy_pgm(vf->priv->half_size_filter); - destroy_masks(vf); - - /* Destroy our private structure that had been used to store those masks and images. */ - free(vf->priv); - - return; -} - -/** - * \brief Initializes our filter. - * - * \param args The arguments passed in from the command line go here. This - * filter expects only a single argument telling it where the PGM - * or PPM file that describes the logo region is. - * - * This sets up our instance variables and parses the arguments to the filter. - */ -static int vf_open(vf_instance_t *vf, char *args) -{ - vf->priv = safe_malloc(sizeof(vf_priv_s)); - vf->uninit = uninit; - - /* Load our filter image. */ - if (args) - vf->priv->filter = load_pgm(args); - else - { - mp_msg(MSGT_VFILTER, MSGL_ERR, "[vf]remove_logo usage: remove_logo=/path/to/filter_image_file.pgm\n"); - free(vf->priv); - return 0; - } - - if (vf->priv->filter == NULL) - { - /* Error message was displayed by load_pgm(). */ - free(vf->priv); - return 0; - } - - /* Create the scaled down filter image for the chroma planes. */ - convert_mask_to_strength_mask(vf, vf->priv->filter); - vf->priv->half_size_filter = generate_half_size_image(vf, vf->priv->filter); - - /* Now that we know how many masks we need (the info is in vf), we can generate the masks. */ - initialize_masks(vf); - - /* Calculate our bounding rectangles, which determine in what region the logo resides for faster processing. */ - calculate_bounding_rectangle(&vf->priv->bounding_rectangle_posx1, &vf->priv->bounding_rectangle_posy1, - &vf->priv->bounding_rectangle_posx2, &vf->priv->bounding_rectangle_posy2, - vf->priv->filter); - calculate_bounding_rectangle(&vf->priv->bounding_rectangle_half_size_posx1, - &vf->priv->bounding_rectangle_half_size_posy1, - &vf->priv->bounding_rectangle_half_size_posx2, - &vf->priv->bounding_rectangle_half_size_posy2, - vf->priv->half_size_filter); - - vf->config=config; - vf->put_image=put_image; - vf->query_format=query_format; - return 1; -} - -/** - * \brief Meta data about our filter. - */ -const vf_info_t vf_info_remove_logo = { - "Removes a tv logo based on a mask image.", - "remove-logo", - "Robert Edele", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_rgbtest.c b/libmpcodecs/vf_rgbtest.c deleted file mode 100644 index 9179934175..0000000000 --- a/libmpcodecs/vf_rgbtest.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -//===========================================================================// - -struct vf_priv_s { - unsigned int fmt; - int w, h; -}; - -static unsigned int getfmt(unsigned int outfmt){ - switch(outfmt){ - case IMGFMT_RGB12: - case IMGFMT_RGB15: - case IMGFMT_RGB16: - case IMGFMT_RGB24: - case IMGFMT_RGBA: - case IMGFMT_ARGB: - case IMGFMT_BGR12: - case IMGFMT_BGR15: - case IMGFMT_BGR16: - case IMGFMT_BGR24: - case IMGFMT_BGRA: - case IMGFMT_ABGR: - return outfmt; - } - return 0; -} - -static void put_pixel(uint8_t *buf, int x, int y, int stride, int r, int g, int b, int fmt){ - switch(fmt){ - case IMGFMT_BGR12: ((uint16_t*)(buf + y*stride))[x]= - ((r >> 4) << 8) | ((g >> 4) << 4) | (b >> 4); - break; - case IMGFMT_RGB12: ((uint16_t*)(buf + y*stride))[x]= - ((b >> 4) << 8) | ((g >> 4) << 4) | (r >> 4); - break; - case IMGFMT_BGR15: ((uint16_t*)(buf + y*stride))[x]= ((r>>3)<<10) | ((g>>3)<<5) | (b>>3); - break; - case IMGFMT_RGB15: ((uint16_t*)(buf + y*stride))[x]= ((b>>3)<<10) | ((g>>3)<<5) | (r>>3); - break; - case IMGFMT_BGR16: ((uint16_t*)(buf + y*stride))[x]= ((r>>3)<<11) | ((g>>2)<<5) | (b>>3); - break; - case IMGFMT_RGB16: ((uint16_t*)(buf + y*stride))[x]= ((b>>3)<<11) | ((g>>2)<<5) | (r>>3); - break; - case IMGFMT_RGB24: - buf[3*x + y*stride + 0]= r; - buf[3*x + y*stride + 1]= g; - buf[3*x + y*stride + 2]= b; - break; - case IMGFMT_BGR24: - buf[3*x + y*stride + 0]= b; - buf[3*x + y*stride + 1]= g; - buf[3*x + y*stride + 2]= r; - break; - case IMGFMT_RGBA: - buf[4*x + y*stride + 0]= r; - buf[4*x + y*stride + 1]= g; - buf[4*x + y*stride + 2]= b; - break; - case IMGFMT_BGRA: - buf[4*x + y*stride + 0]= b; - buf[4*x + y*stride + 1]= g; - buf[4*x + y*stride + 2]= r; - break; - case IMGFMT_ARGB: - buf[4*x + y*stride + 1]= r; - buf[4*x + y*stride + 2]= g; - buf[4*x + y*stride + 3]= b; - break; - case IMGFMT_ABGR: - buf[4*x + y*stride + 1]= b; - buf[4*x + y*stride + 2]= g; - buf[4*x + y*stride + 3]= r; - break; - } -} - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - if (vf->priv->w > 0) { d_width = width = vf->priv->w; } - if (vf->priv->h > 0) { d_height = height = vf->priv->h; } - vf->priv->fmt=getfmt(outfmt); - mp_msg(MSGT_VFILTER,MSGL_V,"rgb test format:%s\n", vo_format_name(outfmt)); - return vf_next_config(vf,width,height,d_width,d_height,flags,vf->priv->fmt); -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - int x, y; - int w = vf->priv->w > 0 ? vf->priv->w : mpi->w; - int h = vf->priv->h > 0 ? vf->priv->h : mpi->h; - - // hope we'll get DR buffer: - dmpi=vf_get_image(vf->next,vf->priv->fmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - w, h); - - for(y=0; y<h; y++){ - for(x=0; x<w; x++){ - int c= 256*x/w; - int r=0,g=0,b=0; - - if(3*y<h) r=c; - else if(3*y<2*h) g=c; - else b=c; - - put_pixel(dmpi->planes[0], x, y, dmpi->stride[0], r, g, b, vf->priv->fmt); - } - } - - return vf_next_put_image(vf,dmpi, pts); -} - -//===========================================================================// - -static int query_format(struct vf_instance *vf, unsigned int outfmt){ - unsigned int fmt=getfmt(outfmt); - if(!fmt) return 0; - return vf_next_query_format(vf,fmt) & (~VFCAP_CSP_SUPPORTED_BY_HW); -} - -static int vf_open(vf_instance_t *vf, char *args){ - vf->config=config; - vf->put_image=put_image; - vf->query_format=query_format; - vf->priv=malloc(sizeof(struct vf_priv_s)); - vf->priv->w = vf->priv->h = 0; - if (args) - sscanf(args, "%d:%d", &vf->priv->w, &vf->priv->h); - return 1; -} - -const vf_info_t vf_info_rgbtest = { - "rgbtest", - "rgbtest", - "Michael Niedermayer", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_sab.c b/libmpcodecs/vf_sab.c deleted file mode 100644 index 649c3ccc43..0000000000 --- a/libmpcodecs/vf_sab.c +++ /dev/null @@ -1,292 +0,0 @@ -/* - * Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <assert.h> - -#include <libavutil/mem.h> -#include <libavutil/common.h> -#include <libswscale/swscale.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" -#include "vf_scale.h" - - -//===========================================================================// - -typedef struct FilterParam{ - float radius; - float preFilterRadius; - float strength; - float quality; - struct SwsContext *preFilterContext; - uint8_t *preFilterBuf; - int preFilterStride; - int distWidth; - int distStride; - int *distCoeff; - int colorDiffCoeff[512]; -}FilterParam; - -struct vf_priv_s { - FilterParam luma; - FilterParam chroma; -}; - - -/***************************************************************************/ - -static int allocStuff(FilterParam *f, int width, int height){ - int stride= (width+7)&~7; - SwsVector *vec; - SwsFilter swsF; - int i,x,y; - f->preFilterBuf= av_malloc(stride*height); - f->preFilterStride= stride; - - vec = sws_getGaussianVec(f->preFilterRadius, f->quality); - swsF.lumH= swsF.lumV= vec; - swsF.chrH= swsF.chrV= NULL; - f->preFilterContext= sws_getContext( - width, height, PIX_FMT_GRAY8, width, height, PIX_FMT_GRAY8, SWS_POINT, &swsF, NULL, NULL); - - sws_freeVec(vec); - vec = sws_getGaussianVec(f->strength, 5.0); - for(i=0; i<512; i++){ - double d; - int index= i-256 + vec->length/2; - - if(index<0 || index>=vec->length) d= 0.0; - else d= vec->coeff[index]; - - f->colorDiffCoeff[i]= (int)(d/vec->coeff[vec->length/2]*(1<<12) + 0.5); - } - sws_freeVec(vec); - vec = sws_getGaussianVec(f->radius, f->quality); - f->distWidth= vec->length; - f->distStride= (vec->length+7)&~7; - f->distCoeff= av_malloc(f->distWidth*f->distStride*sizeof(int32_t)); - - for(y=0; y<vec->length; y++){ - for(x=0; x<vec->length; x++){ - double d= vec->coeff[x] * vec->coeff[y]; - - f->distCoeff[x + y*f->distStride]= (int)(d*(1<<10) + 0.5); -// if(y==vec->length/2) -// printf("%6d ", f->distCoeff[x + y*f->distStride]); - } - } - sws_freeVec(vec); - - return 0; -} - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - - int sw, sh; -//__asm__ volatile("emms\n\t"); - allocStuff(&vf->priv->luma, width, height); - - mp_get_chroma_shift(outfmt, &sw, &sh, NULL); - allocStuff(&vf->priv->chroma, width>>sw, height>>sh); - - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static void freeBuffers(FilterParam *f){ - if(f->preFilterContext) sws_freeContext(f->preFilterContext); - f->preFilterContext=NULL; - - av_free(f->preFilterBuf); - f->preFilterBuf=NULL; - - av_free(f->distCoeff); - f->distCoeff=NULL; -} - -static void uninit(struct vf_instance *vf){ - if(!vf->priv) return; - - freeBuffers(&vf->priv->luma); - freeBuffers(&vf->priv->chroma); - - free(vf->priv); - vf->priv=NULL; -} - -static inline void blur(uint8_t *dst, uint8_t *src, int w, int h, int dstStride, int srcStride, FilterParam *fp){ - int x, y; - FilterParam f= *fp; - const int radius= f.distWidth/2; - const uint8_t* const srcArray[MP_MAX_PLANES] = {src}; - uint8_t *dstArray[MP_MAX_PLANES]= {f.preFilterBuf}; - int srcStrideArray[MP_MAX_PLANES]= {srcStride}; - int dstStrideArray[MP_MAX_PLANES]= {f.preFilterStride}; - -// f.preFilterContext->swScale(f.preFilterContext, srcArray, srcStrideArray, 0, h, dstArray, dstStrideArray); - sws_scale(f.preFilterContext, srcArray, srcStrideArray, 0, h, dstArray, dstStrideArray); - - for(y=0; y<h; y++){ - for(x=0; x<w; x++){ - int sum=0; - int div=0; - int dy; - const int preVal= f.preFilterBuf[x + y*f.preFilterStride]; -#if 0 - const int srcVal= src[x + y*srcStride]; -if((x/32)&1){ - dst[x + y*dstStride]= srcVal; - if(y%32==0) dst[x + y*dstStride]= 0; - continue; -} -#endif - if(x >= radius && x < w - radius){ - for(dy=0; dy<radius*2+1; dy++){ - int dx; - int iy= y+dy - radius; - if (iy<0) iy= -iy; - else if(iy>=h) iy= h+h-iy-1; - - for(dx=0; dx<radius*2+1; dx++){ - const int ix= x+dx - radius; - int factor; - - factor= f.colorDiffCoeff[256+preVal - f.preFilterBuf[ix + iy*f.preFilterStride] ] - *f.distCoeff[dx + dy*f.distStride]; - sum+= src[ix + iy*srcStride] *factor; - div+= factor; - } - } - }else{ - for(dy=0; dy<radius*2+1; dy++){ - int dx; - int iy= y+dy - radius; - if (iy<0) iy= -iy; - else if(iy>=h) iy= h+h-iy-1; - - for(dx=0; dx<radius*2+1; dx++){ - int ix= x+dx - radius; - int factor; - if (ix<0) ix= -ix; - else if(ix>=w) ix= w+w-ix-1; - - factor= f.colorDiffCoeff[256+preVal - f.preFilterBuf[ix + iy*f.preFilterStride] ] - *f.distCoeff[dx + dy*f.distStride]; - sum+= src[ix + iy*srcStride] *factor; - div+= factor; - } - } - } - dst[x + y*dstStride]= (sum + div/2)/div; - } - } -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - int cw= mpi->w >> mpi->chroma_x_shift; - int ch= mpi->h >> mpi->chroma_y_shift; - - mp_image_t *dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->w,mpi->h); - - assert(mpi->flags&MP_IMGFLAG_PLANAR); - - blur(dmpi->planes[0], mpi->planes[0], mpi->w,mpi->h, dmpi->stride[0], mpi->stride[0], &vf->priv->luma); - blur(dmpi->planes[1], mpi->planes[1], cw , ch , dmpi->stride[1], mpi->stride[1], &vf->priv->chroma); - blur(dmpi->planes[2], mpi->planes[2], cw , ch , dmpi->stride[2], mpi->stride[2], &vf->priv->chroma); - - return vf_next_put_image(vf,dmpi, pts); -} - -//===========================================================================// - -static int query_format(struct vf_instance *vf, unsigned int fmt){ - switch(fmt) - { - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_YVU9: - case IMGFMT_444P: - case IMGFMT_422P: - case IMGFMT_411P: - return vf_next_query_format(vf, fmt); - } - return 0; -} - -static int vf_open(vf_instance_t *vf, char *args){ - int e; - - vf->config=config; - vf->put_image=put_image; -// vf->get_image=get_image; - vf->query_format=query_format; - vf->uninit=uninit; - vf->priv=malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - - if(args==NULL) return 0; - - e=sscanf(args, "%f:%f:%f:%f:%f:%f", - &vf->priv->luma.radius, - &vf->priv->luma.preFilterRadius, - &vf->priv->luma.strength, - &vf->priv->chroma.radius, - &vf->priv->chroma.preFilterRadius, - &vf->priv->chroma.strength - ); - - vf->priv->luma.quality = vf->priv->chroma.quality= 3.0; - - if(e==3){ - vf->priv->chroma.radius= vf->priv->luma.radius; - vf->priv->chroma.preFilterRadius = vf->priv->luma.preFilterRadius; - vf->priv->chroma.strength= vf->priv->luma.strength; - }else if(e!=6) - return 0; - -// if(vf->priv->luma.radius < 0) return 0; -// if(vf->priv->chroma.radius < 0) return 0; - - return 1; -} - -const vf_info_t vf_info_sab = { - "shape adaptive blur", - "sab", - "Michael Niedermayer", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_smartblur.c b/libmpcodecs/vf_smartblur.c deleted file mode 100644 index da6f3547bf..0000000000 --- a/libmpcodecs/vf_smartblur.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <assert.h> -#include <stdbool.h> - -#include "mp_msg.h" -#include "libavutil/avutil.h" -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" -#include "libswscale/swscale.h" -#include "vf_scale.h" - -//===========================================================================// - -typedef struct FilterParam{ - float radius; - float strength; - int threshold; - float quality; - struct SwsContext *filterContext; -}FilterParam; - -struct vf_priv_s { - FilterParam luma; - FilterParam chroma; -}; - - -/***************************************************************************/ - -static int allocStuff(FilterParam *f, int width, int height){ - SwsVector *vec; - SwsFilter swsF; - - vec = sws_getGaussianVec(f->radius, f->quality); - sws_scaleVec(vec, f->strength); - vec->coeff[vec->length/2]+= 1.0 - f->strength; - swsF.lumH= swsF.lumV= vec; - swsF.chrH= swsF.chrV= NULL; - f->filterContext= sws_getContext( - width, height, PIX_FMT_GRAY8, width, height, PIX_FMT_GRAY8, SWS_BICUBIC, &swsF, NULL, NULL); - - sws_freeVec(vec); - - return 0; -} - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - - int sw, sh; - - allocStuff(&vf->priv->luma, width, height); - - mp_get_chroma_shift(outfmt, &sw, &sh, NULL); - allocStuff(&vf->priv->chroma, width>>sw, height>>sh); - - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static void freeBuffers(FilterParam *f){ - if(f->filterContext) sws_freeContext(f->filterContext); - f->filterContext=NULL; -} - -static void uninit(struct vf_instance *vf){ - if(!vf->priv) return; - - freeBuffers(&vf->priv->luma); - freeBuffers(&vf->priv->chroma); - - free(vf->priv); - vf->priv=NULL; -} - -static inline void blur(uint8_t *dst, uint8_t *src, int w, int h, int dstStride, int srcStride, FilterParam *fp){ - int x, y; - FilterParam f= *fp; - const uint8_t* const srcArray[MP_MAX_PLANES] = {src}; - uint8_t *dstArray[MP_MAX_PLANES]= {dst}; - int srcStrideArray[MP_MAX_PLANES]= {srcStride}; - int dstStrideArray[MP_MAX_PLANES]= {dstStride}; - - sws_scale(f.filterContext, srcArray, srcStrideArray, 0, h, dstArray, dstStrideArray); - - if(f.threshold > 0){ - for(y=0; y<h; y++){ - for(x=0; x<w; x++){ - const int orig= src[x + y*srcStride]; - const int filtered= dst[x + y*dstStride]; - const int diff= orig - filtered; - - if(diff > 0){ - if(diff > 2*f.threshold){ - dst[x + y*dstStride]= orig; - }else if(diff > f.threshold){ - dst[x + y*dstStride]= filtered + diff - f.threshold; - } - }else{ - if(-diff > 2*f.threshold){ - dst[x + y*dstStride]= orig; - }else if(-diff > f.threshold){ - dst[x + y*dstStride]= filtered + diff + f.threshold; - } - } - } - } - }else if(f.threshold < 0){ - for(y=0; y<h; y++){ - for(x=0; x<w; x++){ - const int orig= src[x + y*srcStride]; - const int filtered= dst[x + y*dstStride]; - const int diff= orig - filtered; - - if(diff > 0){ - if(diff > -2*f.threshold){ - }else if(diff > -f.threshold){ - dst[x + y*dstStride]= orig - diff - f.threshold; - }else - dst[x + y*dstStride]= orig; - }else{ - if(diff < 2*f.threshold){ - }else if(diff < f.threshold){ - dst[x + y*dstStride]= orig - diff + f.threshold; - }else - dst[x + y*dstStride]= orig; - } - } - } - } -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - int cw= mpi->w >> mpi->chroma_x_shift; - int ch= mpi->h >> mpi->chroma_y_shift; - bool threshold = vf->priv->luma.threshold || vf->priv->chroma.threshold; - - mp_image_t *dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE| - (threshold ? MP_IMGFLAG_READABLE : 0), - mpi->w,mpi->h); - - assert(mpi->flags&MP_IMGFLAG_PLANAR); - - blur(dmpi->planes[0], mpi->planes[0], mpi->w,mpi->h, dmpi->stride[0], mpi->stride[0], &vf->priv->luma); - blur(dmpi->planes[1], mpi->planes[1], cw , ch , dmpi->stride[1], mpi->stride[1], &vf->priv->chroma); - blur(dmpi->planes[2], mpi->planes[2], cw , ch , dmpi->stride[2], mpi->stride[2], &vf->priv->chroma); - - return vf_next_put_image(vf,dmpi, pts); -} - -//===========================================================================// - -static int query_format(struct vf_instance *vf, unsigned int fmt){ - switch(fmt) - { - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_YVU9: - case IMGFMT_444P: - case IMGFMT_422P: - case IMGFMT_411P: - return vf_next_query_format(vf, fmt); - } - return 0; -} - -static int vf_open(vf_instance_t *vf, char *args){ - int e; - - vf->config=config; - vf->put_image=put_image; -// vf->get_image=get_image; - vf->query_format=query_format; - vf->uninit=uninit; - vf->priv=malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - - if(args==NULL) return 0; - - e=sscanf(args, "%f:%f:%d:%f:%f:%d", - &vf->priv->luma.radius, - &vf->priv->luma.strength, - &vf->priv->luma.threshold, - &vf->priv->chroma.radius, - &vf->priv->chroma.strength, - &vf->priv->chroma.threshold - ); - - vf->priv->luma.quality = vf->priv->chroma.quality= 3.0; - - if(e==3){ - vf->priv->chroma.radius= vf->priv->luma.radius; - vf->priv->chroma.strength= vf->priv->luma.strength; - vf->priv->chroma.threshold = vf->priv->luma.threshold; - }else if(e!=6) - return 0; - - return 1; -} - -const vf_info_t vf_info_smartblur = { - "smart blur", - "smartblur", - "Michael Niedermayer", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_softskip.c b/libmpcodecs/vf_softskip.c deleted file mode 100644 index fe572cb0b0..0000000000 --- a/libmpcodecs/vf_softskip.c +++ /dev/null @@ -1,102 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -struct vf_priv_s { - int skipflag; -}; - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - mp_image_t *dmpi; - - if (vf->priv->skipflag) - return vf->priv->skipflag = 0; - - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_EXPORT, 0, mpi->width, mpi->height); - vf_clone_mpi_attributes(dmpi, mpi); - - dmpi->planes[0] = mpi->planes[0]; - dmpi->stride[0] = mpi->stride[0]; - if (dmpi->flags&MP_IMGFLAG_PLANAR) { - dmpi->planes[1] = mpi->planes[1]; - dmpi->stride[1] = mpi->stride[1]; - dmpi->planes[2] = mpi->planes[2]; - dmpi->stride[2] = mpi->stride[2]; - } - - return vf_next_put_image(vf, dmpi, pts); -} - -static int control(struct vf_instance *vf, int request, void* data) -{ - switch (request) { - case VFCTRL_SKIP_NEXT_FRAME: - vf->priv->skipflag = 1; - return CONTROL_TRUE; - } - return vf_next_control(vf, request, data); -} - -#if 0 -static int query_format(struct vf_instance *vf, unsigned int fmt) -{ - /* FIXME - figure out which other formats work */ - switch (fmt) { - case IMGFMT_YV12: - case IMGFMT_IYUV: - case IMGFMT_I420: - return vf_next_query_format(vf, fmt); - } - return 0; -} -#endif - -static void uninit(struct vf_instance *vf) -{ - free(vf->priv); -} - -static int vf_open(vf_instance_t *vf, char *args) -{ - vf->put_image = put_image; - vf->control = control; - vf->uninit = uninit; - vf->priv = calloc(1, sizeof(struct vf_priv_s)); - return 1; -} - -const vf_info_t vf_info_softskip = { - "soft (post-filter) frame skipping for encoding", - "softskip", - "Rich Felker", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_spp.c b/libmpcodecs/vf_spp.c deleted file mode 100644 index e0c1e64449..0000000000 --- a/libmpcodecs/vf_spp.c +++ /dev/null @@ -1,612 +0,0 @@ -/* - * Copyright (C) 2003 Michael Niedermayer <michaelni@gmx.at> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -/* - * This implementation is based on an algorithm described in - * "Aria Nosratinia Embedded Post-Processing for - * Enhancement of Compressed Images (1999)" - * (http://citeseer.nj.nec.com/nosratinia99embedded.html) - */ - - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <math.h> - -#include "config.h" - -#include "mp_msg.h" -#include "cpudetect.h" - -#include "libavutil/intreadwrite.h" -#include "libavcodec/avcodec.h" -#include "libavcodec/dsputil.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" -#include "libvo/fastmemcpy.h" - -#define XMIN(a,b) ((a) < (b) ? (a) : (b)) - -//===========================================================================// -static const uint8_t __attribute__((aligned(8))) dither[8][8]={ -{ 0, 48, 12, 60, 3, 51, 15, 63, }, -{ 32, 16, 44, 28, 35, 19, 47, 31, }, -{ 8, 56, 4, 52, 11, 59, 7, 55, }, -{ 40, 24, 36, 20, 43, 27, 39, 23, }, -{ 2, 50, 14, 62, 1, 49, 13, 61, }, -{ 34, 18, 46, 30, 33, 17, 45, 29, }, -{ 10, 58, 6, 54, 9, 57, 5, 53, }, -{ 42, 26, 38, 22, 41, 25, 37, 21, }, -}; - -static const uint8_t offset[127][2]= { -{0,0}, -{0,0}, {4,4}, -{0,0}, {2,2}, {6,4}, {4,6}, -{0,0}, {5,1}, {2,2}, {7,3}, {4,4}, {1,5}, {6,6}, {3,7}, - -{0,0}, {4,0}, {1,1}, {5,1}, {3,2}, {7,2}, {2,3}, {6,3}, -{0,4}, {4,4}, {1,5}, {5,5}, {3,6}, {7,6}, {2,7}, {6,7}, - -{0,0}, {0,2}, {0,4}, {0,6}, {1,1}, {1,3}, {1,5}, {1,7}, -{2,0}, {2,2}, {2,4}, {2,6}, {3,1}, {3,3}, {3,5}, {3,7}, -{4,0}, {4,2}, {4,4}, {4,6}, {5,1}, {5,3}, {5,5}, {5,7}, -{6,0}, {6,2}, {6,4}, {6,6}, {7,1}, {7,3}, {7,5}, {7,7}, - -{0,0}, {4,4}, {0,4}, {4,0}, {2,2}, {6,6}, {2,6}, {6,2}, -{0,2}, {4,6}, {0,6}, {4,2}, {2,0}, {6,4}, {2,4}, {6,0}, -{1,1}, {5,5}, {1,5}, {5,1}, {3,3}, {7,7}, {3,7}, {7,3}, -{1,3}, {5,7}, {1,7}, {5,3}, {3,1}, {7,5}, {3,5}, {7,1}, -{0,1}, {4,5}, {0,5}, {4,1}, {2,3}, {6,7}, {2,7}, {6,3}, -{0,3}, {4,7}, {0,7}, {4,3}, {2,1}, {6,5}, {2,5}, {6,1}, -{1,0}, {5,4}, {1,4}, {5,0}, {3,2}, {7,6}, {3,6}, {7,2}, -{1,2}, {5,6}, {1,6}, {5,2}, {3,0}, {7,4}, {3,4}, {7,0}, -}; - -struct vf_priv_s { - int log2_count; - int qp; - int mode; - int mpeg2; - int temp_stride; - uint8_t *src; - int16_t *temp; - AVCodecContext *avctx; - DSPContext dsp; - char *non_b_qp; -}; - -#define SHIFT 22 - -static void hardthresh_c(DCTELEM dst[64], DCTELEM src[64], int qp, uint8_t *permutation){ - int i; - int bias= 0; //FIXME - unsigned int threshold1, threshold2; - - threshold1= qp*((1<<4) - bias) - 1; - threshold2= (threshold1<<1); - - memset(dst, 0, 64*sizeof(DCTELEM)); - dst[0]= (src[0] + 4)>>3; - - for(i=1; i<64; i++){ - int level= src[i]; - if(((unsigned)(level+threshold1))>threshold2){ - const int j= permutation[i]; - dst[j]= (level + 4)>>3; - } - } -} - -static void softthresh_c(DCTELEM dst[64], DCTELEM src[64], int qp, uint8_t *permutation){ - int i; - int bias= 0; //FIXME - unsigned int threshold1, threshold2; - - threshold1= qp*((1<<4) - bias) - 1; - threshold2= (threshold1<<1); - - memset(dst, 0, 64*sizeof(DCTELEM)); - dst[0]= (src[0] + 4)>>3; - - for(i=1; i<64; i++){ - int level= src[i]; - if(((unsigned)(level+threshold1))>threshold2){ - const int j= permutation[i]; - if(level>0) - dst[j]= (level - threshold1 + 4)>>3; - else - dst[j]= (level + threshold1 + 4)>>3; - } - } -} - -#if HAVE_MMX -static void hardthresh_mmx(DCTELEM dst[64], DCTELEM src[64], int qp, uint8_t *permutation){ - int bias= 0; //FIXME - unsigned int threshold1; - - threshold1= qp*((1<<4) - bias) - 1; - - __asm__ volatile( -#define REQUANT_CORE(dst0, dst1, dst2, dst3, src0, src1, src2, src3) \ - "movq " #src0 ", %%mm0 \n\t"\ - "movq " #src1 ", %%mm1 \n\t"\ - "movq " #src2 ", %%mm2 \n\t"\ - "movq " #src3 ", %%mm3 \n\t"\ - "psubw %%mm4, %%mm0 \n\t"\ - "psubw %%mm4, %%mm1 \n\t"\ - "psubw %%mm4, %%mm2 \n\t"\ - "psubw %%mm4, %%mm3 \n\t"\ - "paddusw %%mm5, %%mm0 \n\t"\ - "paddusw %%mm5, %%mm1 \n\t"\ - "paddusw %%mm5, %%mm2 \n\t"\ - "paddusw %%mm5, %%mm3 \n\t"\ - "paddw %%mm6, %%mm0 \n\t"\ - "paddw %%mm6, %%mm1 \n\t"\ - "paddw %%mm6, %%mm2 \n\t"\ - "paddw %%mm6, %%mm3 \n\t"\ - "psubusw %%mm6, %%mm0 \n\t"\ - "psubusw %%mm6, %%mm1 \n\t"\ - "psubusw %%mm6, %%mm2 \n\t"\ - "psubusw %%mm6, %%mm3 \n\t"\ - "psraw $3, %%mm0 \n\t"\ - "psraw $3, %%mm1 \n\t"\ - "psraw $3, %%mm2 \n\t"\ - "psraw $3, %%mm3 \n\t"\ -\ - "movq %%mm0, %%mm7 \n\t"\ - "punpcklwd %%mm2, %%mm0 \n\t" /*A*/\ - "punpckhwd %%mm2, %%mm7 \n\t" /*C*/\ - "movq %%mm1, %%mm2 \n\t"\ - "punpcklwd %%mm3, %%mm1 \n\t" /*B*/\ - "punpckhwd %%mm3, %%mm2 \n\t" /*D*/\ - "movq %%mm0, %%mm3 \n\t"\ - "punpcklwd %%mm1, %%mm0 \n\t" /*A*/\ - "punpckhwd %%mm7, %%mm3 \n\t" /*C*/\ - "punpcklwd %%mm2, %%mm7 \n\t" /*B*/\ - "punpckhwd %%mm2, %%mm1 \n\t" /*D*/\ -\ - "movq %%mm0, " #dst0 " \n\t"\ - "movq %%mm7, " #dst1 " \n\t"\ - "movq %%mm3, " #dst2 " \n\t"\ - "movq %%mm1, " #dst3 " \n\t" - - "movd %2, %%mm4 \n\t" - "movd %3, %%mm5 \n\t" - "movd %4, %%mm6 \n\t" - "packssdw %%mm4, %%mm4 \n\t" - "packssdw %%mm5, %%mm5 \n\t" - "packssdw %%mm6, %%mm6 \n\t" - "packssdw %%mm4, %%mm4 \n\t" - "packssdw %%mm5, %%mm5 \n\t" - "packssdw %%mm6, %%mm6 \n\t" - REQUANT_CORE( (%1), 8(%1), 16(%1), 24(%1), (%0), 8(%0), 64(%0), 72(%0)) - REQUANT_CORE(32(%1), 40(%1), 48(%1), 56(%1),16(%0),24(%0), 48(%0), 56(%0)) - REQUANT_CORE(64(%1), 72(%1), 80(%1), 88(%1),32(%0),40(%0), 96(%0),104(%0)) - REQUANT_CORE(96(%1),104(%1),112(%1),120(%1),80(%0),88(%0),112(%0),120(%0)) - : : "r" (src), "r" (dst), "g" (threshold1+1), "g" (threshold1+5), "g" (threshold1-4) //FIXME maybe more accurate then needed? - ); - dst[0]= (src[0] + 4)>>3; -} - -static void softthresh_mmx(DCTELEM dst[64], DCTELEM src[64], int qp, uint8_t *permutation){ - int bias= 0; //FIXME - unsigned int threshold1; - - threshold1= qp*((1<<4) - bias) - 1; - - __asm__ volatile( -#undef REQUANT_CORE -#define REQUANT_CORE(dst0, dst1, dst2, dst3, src0, src1, src2, src3) \ - "movq " #src0 ", %%mm0 \n\t"\ - "movq " #src1 ", %%mm1 \n\t"\ - "pxor %%mm6, %%mm6 \n\t"\ - "pxor %%mm7, %%mm7 \n\t"\ - "pcmpgtw %%mm0, %%mm6 \n\t"\ - "pcmpgtw %%mm1, %%mm7 \n\t"\ - "pxor %%mm6, %%mm0 \n\t"\ - "pxor %%mm7, %%mm1 \n\t"\ - "psubusw %%mm4, %%mm0 \n\t"\ - "psubusw %%mm4, %%mm1 \n\t"\ - "pxor %%mm6, %%mm0 \n\t"\ - "pxor %%mm7, %%mm1 \n\t"\ - "movq " #src2 ", %%mm2 \n\t"\ - "movq " #src3 ", %%mm3 \n\t"\ - "pxor %%mm6, %%mm6 \n\t"\ - "pxor %%mm7, %%mm7 \n\t"\ - "pcmpgtw %%mm2, %%mm6 \n\t"\ - "pcmpgtw %%mm3, %%mm7 \n\t"\ - "pxor %%mm6, %%mm2 \n\t"\ - "pxor %%mm7, %%mm3 \n\t"\ - "psubusw %%mm4, %%mm2 \n\t"\ - "psubusw %%mm4, %%mm3 \n\t"\ - "pxor %%mm6, %%mm2 \n\t"\ - "pxor %%mm7, %%mm3 \n\t"\ -\ - "paddsw %%mm5, %%mm0 \n\t"\ - "paddsw %%mm5, %%mm1 \n\t"\ - "paddsw %%mm5, %%mm2 \n\t"\ - "paddsw %%mm5, %%mm3 \n\t"\ - "psraw $3, %%mm0 \n\t"\ - "psraw $3, %%mm1 \n\t"\ - "psraw $3, %%mm2 \n\t"\ - "psraw $3, %%mm3 \n\t"\ -\ - "movq %%mm0, %%mm7 \n\t"\ - "punpcklwd %%mm2, %%mm0 \n\t" /*A*/\ - "punpckhwd %%mm2, %%mm7 \n\t" /*C*/\ - "movq %%mm1, %%mm2 \n\t"\ - "punpcklwd %%mm3, %%mm1 \n\t" /*B*/\ - "punpckhwd %%mm3, %%mm2 \n\t" /*D*/\ - "movq %%mm0, %%mm3 \n\t"\ - "punpcklwd %%mm1, %%mm0 \n\t" /*A*/\ - "punpckhwd %%mm7, %%mm3 \n\t" /*C*/\ - "punpcklwd %%mm2, %%mm7 \n\t" /*B*/\ - "punpckhwd %%mm2, %%mm1 \n\t" /*D*/\ -\ - "movq %%mm0, " #dst0 " \n\t"\ - "movq %%mm7, " #dst1 " \n\t"\ - "movq %%mm3, " #dst2 " \n\t"\ - "movq %%mm1, " #dst3 " \n\t" - - "movd %2, %%mm4 \n\t" - "movd %3, %%mm5 \n\t" - "packssdw %%mm4, %%mm4 \n\t" - "packssdw %%mm5, %%mm5 \n\t" - "packssdw %%mm4, %%mm4 \n\t" - "packssdw %%mm5, %%mm5 \n\t" - REQUANT_CORE( (%1), 8(%1), 16(%1), 24(%1), (%0), 8(%0), 64(%0), 72(%0)) - REQUANT_CORE(32(%1), 40(%1), 48(%1), 56(%1),16(%0),24(%0), 48(%0), 56(%0)) - REQUANT_CORE(64(%1), 72(%1), 80(%1), 88(%1),32(%0),40(%0), 96(%0),104(%0)) - REQUANT_CORE(96(%1),104(%1),112(%1),120(%1),80(%0),88(%0),112(%0),120(%0)) - : : "r" (src), "r" (dst), "g" (threshold1), "rm" (4) //FIXME maybe more accurate then needed? - ); - - dst[0]= (src[0] + 4)>>3; -} -#endif - -static inline void add_block(int16_t *dst, int stride, DCTELEM block[64]){ - int y; - - for(y=0; y<8; y++){ - *(uint32_t*)&dst[0 + y*stride]+= *(uint32_t*)&block[0 + y*8]; - *(uint32_t*)&dst[2 + y*stride]+= *(uint32_t*)&block[2 + y*8]; - *(uint32_t*)&dst[4 + y*stride]+= *(uint32_t*)&block[4 + y*8]; - *(uint32_t*)&dst[6 + y*stride]+= *(uint32_t*)&block[6 + y*8]; - } -} - -static void store_slice_c(uint8_t *dst, int16_t *src, int dst_stride, int src_stride, int width, int height, int log2_scale){ - int y, x; - -#define STORE(pos) \ - temp= ((src[x + y*src_stride + pos]<<log2_scale) + d[pos])>>6;\ - if(temp & 0x100) temp= ~(temp>>31);\ - dst[x + y*dst_stride + pos]= temp; - - for(y=0; y<height; y++){ - const uint8_t *d= dither[y]; - for(x=0; x<width; x+=8){ - int temp; - STORE(0); - STORE(1); - STORE(2); - STORE(3); - STORE(4); - STORE(5); - STORE(6); - STORE(7); - } - } -} - -#if HAVE_MMX -static void store_slice_mmx(uint8_t *dst, int16_t *src, int dst_stride, int src_stride, int width, int height, int log2_scale){ - int y; - - for(y=0; y<height; y++){ - uint8_t *dst1= dst; - int16_t *src1= src; - __asm__ volatile( - "movq (%3), %%mm3 \n\t" - "movq (%3), %%mm4 \n\t" - "movd %4, %%mm2 \n\t" - "pxor %%mm0, %%mm0 \n\t" - "punpcklbw %%mm0, %%mm3 \n\t" - "punpckhbw %%mm0, %%mm4 \n\t" - "psraw %%mm2, %%mm3 \n\t" - "psraw %%mm2, %%mm4 \n\t" - "movd %5, %%mm2 \n\t" - "1: \n\t" - "movq (%0), %%mm0 \n\t" - "movq 8(%0), %%mm1 \n\t" - "paddw %%mm3, %%mm0 \n\t" - "paddw %%mm4, %%mm1 \n\t" - "psraw %%mm2, %%mm0 \n\t" - "psraw %%mm2, %%mm1 \n\t" - "packuswb %%mm1, %%mm0 \n\t" - "movq %%mm0, (%1) \n\t" - "add $16, %0 \n\t" - "add $8, %1 \n\t" - "cmp %2, %1 \n\t" - " jb 1b \n\t" - : "+r" (src1), "+r"(dst1) - : "r"(dst + width), "r"(dither[y]), "g"(log2_scale), "g"(6-log2_scale) - ); - src += src_stride; - dst += dst_stride; - } -// if(width != mmxw) -// store_slice_c(dst + mmxw, src + mmxw, dst_stride, src_stride, width - mmxw, log2_scale); -} -#endif - -static void (*store_slice)(uint8_t *dst, int16_t *src, int dst_stride, int src_stride, int width, int height, int log2_scale)= store_slice_c; - -static void (*requantize)(DCTELEM dst[64], DCTELEM src[64], int qp, uint8_t *permutation)= hardthresh_c; - -static void filter(struct vf_priv_s *p, uint8_t *dst, uint8_t *src, int dst_stride, int src_stride, int width, int height, uint8_t *qp_store, int qp_stride, int is_luma){ - int x, y, i; - const int count= 1<<p->log2_count; - const int stride= is_luma ? p->temp_stride : ((width+16+15)&(~15)); - uint64_t __attribute__((aligned(16))) block_align[32]; - DCTELEM *block = (DCTELEM *)block_align; - DCTELEM *block2= (DCTELEM *)(block_align+16); - - if (!src || !dst) return; // HACK avoid crash for Y8 colourspace - for(y=0; y<height; y++){ - int index= 8 + 8*stride + y*stride; - fast_memcpy(p->src + index, src + y*src_stride, width); - for(x=0; x<8; x++){ - p->src[index - x - 1]= p->src[index + x ]; - p->src[index + width + x ]= p->src[index + width - x - 1]; - } - } - for(y=0; y<8; y++){ - fast_memcpy(p->src + ( 7-y)*stride, p->src + ( y+8)*stride, stride); - fast_memcpy(p->src + (height+8+y)*stride, p->src + (height-y+7)*stride, stride); - } - //FIXME (try edge emu) - - for(y=0; y<height+8; y+=8){ - memset(p->temp + (8+y)*stride, 0, 8*stride*sizeof(int16_t)); - for(x=0; x<width+8; x+=8){ - const int qps= 3 + is_luma; - int qp; - - if(p->qp) - qp= p->qp; - else{ - qp= qp_store[ (XMIN(x, width-1)>>qps) + (XMIN(y, height-1)>>qps) * qp_stride]; - qp = FFMAX(1, norm_qscale(qp, p->mpeg2)); - } - for(i=0; i<count; i++){ - const int x1= x + offset[i+count-1][0]; - const int y1= y + offset[i+count-1][1]; - const int index= x1 + y1*stride; - p->dsp.get_pixels(block, p->src + index, stride); - p->dsp.fdct(block); - requantize(block2, block, qp, p->dsp.idct_permutation); - p->dsp.idct(block2); - add_block(p->temp + index, stride, block2); - } - } - if(y) - store_slice(dst + (y-8)*dst_stride, p->temp + 8 + y*stride, dst_stride, stride, width, XMIN(8, height+8-y), 6-p->log2_count); - } -#if 0 - for(y=0; y<height; y++){ - for(x=0; x<width; x++){ - if((((x>>6) ^ (y>>6)) & 1) == 0) - dst[x + y*dst_stride]= p->src[8 + 8*stride + x + y*stride]; - if((x&63) == 0 || (y&63)==0) - dst[x + y*dst_stride] += 128; - } - } -#endif - //FIXME reorder for better caching -} - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - int h= (height+16+15)&(~15); - - vf->priv->temp_stride= (width+16+15)&(~15); - vf->priv->temp= malloc(vf->priv->temp_stride*h*sizeof(int16_t)); - vf->priv->src = malloc(vf->priv->temp_stride*h*sizeof(uint8_t)); - - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static void get_image(struct vf_instance *vf, mp_image_t *mpi){ - if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change - // ok, we can do pp in-place (or pp disabled): - vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, - mpi->type, mpi->flags | MP_IMGFLAG_READABLE, mpi->width, mpi->height); - mpi->planes[0]=vf->dmpi->planes[0]; - mpi->stride[0]=vf->dmpi->stride[0]; - mpi->width=vf->dmpi->width; - if(mpi->flags&MP_IMGFLAG_PLANAR){ - mpi->planes[1]=vf->dmpi->planes[1]; - mpi->planes[2]=vf->dmpi->planes[2]; - mpi->stride[1]=vf->dmpi->stride[1]; - mpi->stride[2]=vf->dmpi->stride[2]; - } - mpi->flags|=MP_IMGFLAG_DIRECT; -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - - if(!(mpi->flags&MP_IMGFLAG_DIRECT)){ - // no DR, so get a new image! hope we'll get DR buffer: - dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, - MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE, - mpi->width,mpi->height); - vf_clone_mpi_attributes(dmpi, mpi); - }else{ - dmpi=vf->dmpi; - } - - vf->priv->mpeg2= mpi->qscale_type; - if(mpi->pict_type != 3 && mpi->qscale && !vf->priv->qp){ - int w = mpi->qstride; - int h = (mpi->h + 15) >> 4; - if (!w) { - w = (mpi->w + 15) >> 4; - h = 1; - } - if(!vf->priv->non_b_qp) - vf->priv->non_b_qp= malloc(w*h); - fast_memcpy(vf->priv->non_b_qp, mpi->qscale, w*h); - } - if(vf->priv->log2_count || !(mpi->flags&MP_IMGFLAG_DIRECT)){ - char *qp_tab= vf->priv->non_b_qp; - if((vf->priv->mode&4) || !qp_tab) - qp_tab= mpi->qscale; - - if(qp_tab || vf->priv->qp){ - filter(vf->priv, dmpi->planes[0], mpi->planes[0], dmpi->stride[0], mpi->stride[0], mpi->w, mpi->h, qp_tab, mpi->qstride, 1); - filter(vf->priv, dmpi->planes[1], mpi->planes[1], dmpi->stride[1], mpi->stride[1], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, qp_tab, mpi->qstride, 0); - filter(vf->priv, dmpi->planes[2], mpi->planes[2], dmpi->stride[2], mpi->stride[2], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, qp_tab, mpi->qstride, 0); - }else{ - memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h, dmpi->stride[0], mpi->stride[0]); - memcpy_pic(dmpi->planes[1], mpi->planes[1], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[1], mpi->stride[1]); - memcpy_pic(dmpi->planes[2], mpi->planes[2], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[2], mpi->stride[2]); - } - } - -#if HAVE_MMX - if(gCpuCaps.hasMMX) __asm__ volatile ("emms\n\t"); -#endif -#if HAVE_MMX2 - if(gCpuCaps.hasMMX2) __asm__ volatile ("sfence\n\t"); -#endif - - return vf_next_put_image(vf,dmpi, pts); -} - -static void uninit(struct vf_instance *vf){ - if(!vf->priv) return; - - free(vf->priv->temp); - vf->priv->temp= NULL; - free(vf->priv->src); - vf->priv->src= NULL; - free(vf->priv->avctx); - vf->priv->avctx= NULL; - free(vf->priv->non_b_qp); - vf->priv->non_b_qp= NULL; - - free(vf->priv); - vf->priv=NULL; -} - -//===========================================================================// -static int query_format(struct vf_instance *vf, unsigned int fmt){ - switch(fmt){ - case IMGFMT_YVU9: - case IMGFMT_IF09: - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_CLPL: - case IMGFMT_Y800: - case IMGFMT_Y8: - case IMGFMT_444P: - case IMGFMT_422P: - case IMGFMT_411P: - return vf_next_query_format(vf,fmt); - } - return 0; -} - -static int control(struct vf_instance *vf, int request, void* data){ - switch(request){ - case VFCTRL_QUERY_MAX_PP_LEVEL: - return 6; - case VFCTRL_SET_PP_LEVEL: - vf->priv->log2_count= *((unsigned int*)data); - return CONTROL_TRUE; - } - return vf_next_control(vf,request,data); -} - -static int vf_open(vf_instance_t *vf, char *args){ - - int log2c=-1; - - vf->config=config; - vf->put_image=put_image; - vf->get_image=get_image; - vf->query_format=query_format; - vf->uninit=uninit; - vf->control= control; - vf->priv=malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - - vf->priv->avctx= avcodec_alloc_context(); - ff_dsputil_init(&vf->priv->dsp, vf->priv->avctx); - - vf->priv->log2_count= 3; - - if (args) sscanf(args, "%d:%d:%d", &log2c, &vf->priv->qp, &vf->priv->mode); - - if( log2c >=0 && log2c <=6 ) - vf->priv->log2_count = log2c; - - if(vf->priv->qp < 0) - vf->priv->qp = 0; - - switch(vf->priv->mode&3){ - default: - case 0: requantize= hardthresh_c; break; - case 1: requantize= softthresh_c; break; - } - -#if HAVE_MMX - if(gCpuCaps.hasMMX){ - store_slice= store_slice_mmx; - switch(vf->priv->mode&3){ - case 0: requantize= hardthresh_mmx; break; - case 1: requantize= softthresh_mmx; break; - } - } -#endif - - return 1; -} - -const vf_info_t vf_info_spp = { - "simple postprocess", - "spp", - "Michael Niedermayer", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_telecine.c b/libmpcodecs/vf_telecine.c deleted file mode 100644 index 4ae96f2434..0000000000 --- a/libmpcodecs/vf_telecine.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -#include "libvo/fastmemcpy.h" - -struct vf_priv_s { - int frame; - double pts; - double lastpts; - mp_image_t *buffered_mpi; -}; - -static int continue_buffered_image_fullframe(struct vf_instance *vf) -{ - mp_image_t *mpi = vf->priv->buffered_mpi; - mp_image_t *dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE | - MP_IMGFLAG_PRESERVE, mpi->width, mpi->height); - - memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h, - dmpi->stride[0], mpi->stride[0]); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - memcpy_pic(dmpi->planes[1], mpi->planes[1], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[1], mpi->stride[1]); - memcpy_pic(dmpi->planes[2], mpi->planes[2], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[2], mpi->stride[2]); - } - return vf_next_put_image(vf, dmpi, vf->priv->pts); -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - mp_image_t *dmpi; - int ret; - - vf->priv->frame = (vf->priv->frame+1)%4; - - if (pts != MP_NOPTS_VALUE) { - if (vf->priv->lastpts == MP_NOPTS_VALUE) { - vf->priv->pts = pts; - vf->priv->lastpts = pts; - } else { - // we only increase by 80% of input pts at each frame; in the case - // in which we render two frames, we jump back - // this turns 23.98fps perfectly into 29.97fps - vf->priv->pts += 0.8 * (pts - vf->priv->lastpts); - vf->priv->lastpts = pts; - } - } - - ret = 0; - // 0/0 1/1 2/2 2/3 3/0 - switch (vf->priv->frame) { - case 0: - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE | - MP_IMGFLAG_PRESERVE, mpi->width, mpi->height); - my_memcpy_pic(dmpi->planes[0]+dmpi->stride[0], - mpi->planes[0]+mpi->stride[0], mpi->w, mpi->h/2, - dmpi->stride[0]*2, mpi->stride[0]*2); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - my_memcpy_pic(dmpi->planes[1]+dmpi->stride[1], - mpi->planes[1]+mpi->stride[1], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[1]*2, mpi->stride[1]*2); - my_memcpy_pic(dmpi->planes[2]+dmpi->stride[2], - mpi->planes[2]+mpi->stride[2], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[2]*2, mpi->stride[2]*2); - } - ret = vf_next_put_image(vf, dmpi, vf->priv->pts); - vf->priv->pts = pts; - vf->priv->buffered_mpi = mpi; - vf_queue_frame(vf, continue_buffered_image_fullframe); - return ret; - case 1: - case 2: - vf->priv->buffered_mpi = mpi; - return continue_buffered_image_fullframe(vf); - case 3: - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE | - MP_IMGFLAG_PRESERVE, mpi->width, mpi->height); - my_memcpy_pic(dmpi->planes[0]+dmpi->stride[0], - mpi->planes[0]+mpi->stride[0], mpi->w, mpi->h/2, - dmpi->stride[0]*2, mpi->stride[0]*2); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - my_memcpy_pic(dmpi->planes[1]+dmpi->stride[1], - mpi->planes[1]+mpi->stride[1], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[1]*2, mpi->stride[1]*2); - my_memcpy_pic(dmpi->planes[2]+dmpi->stride[2], - mpi->planes[2]+mpi->stride[2], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[2]*2, mpi->stride[2]*2); - } - ret = vf_next_put_image(vf, dmpi, vf->priv->pts); - my_memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h/2, - dmpi->stride[0]*2, mpi->stride[0]*2); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - my_memcpy_pic(dmpi->planes[1], mpi->planes[1], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[1]*2, mpi->stride[1]*2); - my_memcpy_pic(dmpi->planes[2], mpi->planes[2], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[2]*2, mpi->stride[2]*2); - } - return ret; - } - return 0; -} - -#if 0 -static int query_format(struct vf_instance *vf, unsigned int fmt) -{ - /* FIXME - figure out which other formats work */ - switch (fmt) { - case IMGFMT_YV12: - case IMGFMT_IYUV: - case IMGFMT_I420: - return vf_next_query_format(vf, fmt); - } - return 0; -} - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt) -{ - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} -#endif - -static void uninit(struct vf_instance *vf) -{ - free(vf->priv); -} - -static int vf_open(vf_instance_t *vf, char *args) -{ - //vf->config = config; - vf->put_image = put_image; - //vf->query_format = query_format; - vf->uninit = uninit; - vf->default_reqs = VFCAP_ACCEPT_STRIDE; - vf->priv = calloc(1, sizeof(struct vf_priv_s)); - vf->priv->frame = 1; - if (args) sscanf(args, "%d", &vf->priv->frame); - vf->priv->frame--; - vf->priv->pts = MP_NOPTS_VALUE; - vf->priv->lastpts = MP_NOPTS_VALUE; - return 1; -} - -const vf_info_t vf_info_telecine = { - "telecine filter", - "telecine", - "Rich Felker", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_test.c b/libmpcodecs/vf_test.c deleted file mode 100644 index aeb2763200..0000000000 --- a/libmpcodecs/vf_test.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - * Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -//===========================================================================// - -#include <inttypes.h> -#include <math.h> - -#define MAX(a,b) ((a) > (b) ? (a) : (b)) -#define MIN(a,b) ((a) < (b) ? (a) : (b)) -#define ABS(a,b) ((a) > 0 ? (a) : -(a)) - -#define WIDTH 512 -#define HEIGHT 512 - -struct vf_priv_s { - int frame_num; -}; - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - - if(vf_next_query_format(vf,IMGFMT_YV12)<=0){ - mp_tmsg(MSGT_VFILTER, MSGL_WARN, "%s not supported by next filter/vo :(\n", "YV12"); - return 0; - } - - //hmm whats the meaning of these ... ;) - d_width= width= WIDTH; - d_height= height= HEIGHT; - - return vf_next_config(vf,width,height,d_width,d_height,flags,IMGFMT_YV12); -} - -static double c[64]; - -static void initIdct(void) -{ - int i; - - for (i=0; i<8; i++) - { - double s= i==0 ? sqrt(0.125) : 0.5; - int j; - - for(j=0; j<8; j++) - c[i*8+j]= s*cos((3.141592654/8.0)*i*(j+0.5)); - } -} - - -static void idct(uint8_t *dst, int dstStride, int src[64]) -{ - int i, j, k; - double tmp[64]; - - for(i=0; i<8; i++) - { - for(j=0; j<8; j++) - { - double sum= 0.0; - - for(k=0; k<8; k++) - sum+= c[k*8+j]*src[8*i+k]; - - tmp[8*i+j]= sum; - } - } - - for(j=0; j<8; j++) - { - for(i=0; i<8; i++) - { - int v; - double sum= 0.0; - - for(k=0; k<8; k++) - sum+= c[k*8+i]*tmp[8*k+j]; - - v= (int)floor(sum+0.5); - if(v<0) v=0; - else if(v>255) v=255; - - dst[dstStride*i + j] = v; - } - } -} - -static void drawDc(uint8_t *dst, int stride, int color, int w, int h) -{ - int y; - for(y=0; y<h; y++) - { - int x; - for(x=0; x<w; x++) - { - dst[x + y*stride]= color; - } - } -} - -static void drawBasis(uint8_t *dst, int stride, int amp, int freq, int dc) -{ - int src[64]; - - memset(src, 0, 64*sizeof(int)); - src[0]= dc; - if(amp) src[freq]= amp; - idct(dst, stride, src); -} - -static void drawCbp(uint8_t *dst[3], int stride[3], int cbp, int amp, int dc) -{ - if(cbp&1) drawBasis(dst[0] , stride[0], amp, 1, dc); - if(cbp&2) drawBasis(dst[0]+8 , stride[0], amp, 1, dc); - if(cbp&4) drawBasis(dst[0]+ 8*stride[0], stride[0], amp, 1, dc); - if(cbp&8) drawBasis(dst[0]+8+8*stride[0], stride[0], amp, 1, dc); - if(cbp&16)drawBasis(dst[1] , stride[1], amp, 1, dc); - if(cbp&32)drawBasis(dst[2] , stride[2], amp, 1, dc); -} - -static void dc1Test(uint8_t *dst, int stride, int w, int h, int off) -{ - const int step= MAX(256/(w*h/256), 1); - int y; - int color=off; - for(y=0; y<h; y+=16) - { - int x; - for(x=0; x<w; x+=16) - { - drawDc(dst + x + y*stride, stride, color, 8, 8); - color+=step; - } - } -} - -static void freq1Test(uint8_t *dst, int stride, int off) -{ - int y; - int freq=0; - for(y=0; y<8*16; y+=16) - { - int x; - for(x=0; x<8*16; x+=16) - { - drawBasis(dst + x + y*stride, stride, 4*(96+off), freq, 128*8); - freq++; - } - } -} - -static void amp1Test(uint8_t *dst, int stride, int off) -{ - int y; - int amp=off; - for(y=0; y<16*16; y+=16) - { - int x; - for(x=0; x<16*16; x+=16) - { - drawBasis(dst + x + y*stride, stride, 4*(amp), 1, 128*8); - amp++; - } - } -} - -static void cbp1Test(uint8_t *dst[3], int stride[3], int off) -{ - int y; - int cbp=0; - for(y=0; y<16*8; y+=16) - { - int x; - for(x=0; x<16*8; x+=16) - { - uint8_t *dst1[3]; - dst1[0]= dst[0] + x*2 + y*2*stride[0]; - dst1[1]= dst[1] + x + y*stride[1]; - dst1[2]= dst[2] + x + y*stride[2]; - - drawCbp(dst1, stride, cbp, (64+off)*4, 128*8); - cbp++; - } - } -} - -static void mv1Test(uint8_t *dst, int stride, int off) -{ - int y; - for(y=0; y<16*16; y++) - { - int x; - if(y&16) continue; - for(x=0; x<16*16; x++) - { - dst[x + y*stride]= x + off*8/(y/32+1); - } - } -} - -static void ring1Test(uint8_t *dst, int stride, int off) -{ - int y; - int color=0; - for(y=off; y<16*16; y+=16) - { - int x; - for(x=off; x<16*16; x+=16) - { - drawDc(dst + x + y*stride, stride, ((x+y)&16) ? color : -color, 16, 16); -// dst[x + y*stride]= 255 + (off&1); - color++; - } - } -} - -static void ring2Test(uint8_t *dst, int stride, int off) -{ - int y; - for(y=0; y<16*16; y++) - { - int x; - for(x=0; x<16*16; x++) - { - double d= sqrt((x-8*16)*(x-8*16) + (y-8*16)*(y-8*16)); - double r= d/20 - (int)(d/20); - if(r<off/30.0) - { - dst[x + y*stride]= 255; - dst[x + y*stride+256]= 0; - } - else{ - dst[x + y*stride]= x; - dst[x + y*stride+256]= x; - } - } - } -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - int frame= vf->priv->frame_num; - - // hope we'll get DR buffer: - dmpi=vf_get_image(vf->next,IMGFMT_YV12, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - WIDTH, HEIGHT); - - // clean - memset(dmpi->planes[0], 0, dmpi->stride[0]*dmpi->h); - memset(dmpi->planes[1], 128, dmpi->stride[1]*dmpi->h>>dmpi->chroma_y_shift); - memset(dmpi->planes[2], 128, dmpi->stride[2]*dmpi->h>>dmpi->chroma_y_shift); - - if(frame%30) - { - switch(frame/30) - { - case 0: dc1Test(dmpi->planes[0], dmpi->stride[0], 256, 256, frame%30); break; - case 1: dc1Test(dmpi->planes[1], dmpi->stride[1], 256, 256, frame%30); break; - case 2: freq1Test(dmpi->planes[0], dmpi->stride[0], frame%30); break; - case 3: freq1Test(dmpi->planes[1], dmpi->stride[1], frame%30); break; - case 4: amp1Test(dmpi->planes[0], dmpi->stride[0], frame%30); break; - case 5: amp1Test(dmpi->planes[1], dmpi->stride[1], frame%30); break; - case 6: cbp1Test(dmpi->planes , dmpi->stride , frame%30); break; - case 7: mv1Test(dmpi->planes[0], dmpi->stride[0], frame%30); break; - case 8: ring1Test(dmpi->planes[0], dmpi->stride[0], frame%30); break; - case 9: ring2Test(dmpi->planes[0], dmpi->stride[0], frame%30); break; - } - } - - frame++; - vf->priv->frame_num= frame; - return vf_next_put_image(vf,dmpi, pts); -} - -//===========================================================================// - -static int query_format(struct vf_instance *vf, unsigned int fmt){ - return vf_next_query_format(vf,IMGFMT_YV12) & (~VFCAP_CSP_SUPPORTED_BY_HW); -} - -static int vf_open(vf_instance_t *vf, char *args){ - vf->config=config; - vf->put_image=put_image; - vf->query_format=query_format; - vf->priv=malloc(sizeof(struct vf_priv_s)); - vf->priv->frame_num= args ? atoi(args) : 0; - initIdct(); - return 1; -} - -const vf_info_t vf_info_test = { - "test pattern generator", - "test", - "Michael Niedermayer", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_tfields.c b/libmpcodecs/vf_tfields.c deleted file mode 100644 index b4fa7a46bf..0000000000 --- a/libmpcodecs/vf_tfields.c +++ /dev/null @@ -1,476 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "config.h" -#include "options.h" -#include "mp_msg.h" -#include "cpudetect.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -#include "libvo/fastmemcpy.h" - -struct vf_priv_s { - int mode; - int parity; - int buffered_i; - mp_image_t *buffered_mpi; - double buffered_pts; -}; - -static void deint(unsigned char *dest, int ds, unsigned char *src, int ss, int w, int h, int field) -{ - int x, y; - src += ss; - dest += ds; - h--; - if (field) { - fast_memcpy(dest - ds, src - ss, w); - src += ss; - dest += ds; - h--; - } - for (y=h/2; y > 0; y--) { - dest[0] = src[0]; - for (x=1; x<w-1; x++) { - if (((src[x-ss] < src[x]) && (src[x+ss] < src[x])) || - ((src[x-ss] > src[x]) && (src[x+ss] > src[x]))) { - //dest[x] = (src[x+ss] + src[x-ss])>>1; - dest[x] = ((src[x+ss]<<1) + (src[x-ss]<<1) - + src[x+ss+1] + src[x-ss+1] - + src[x+ss-1] + src[x-ss-1])>>3; - } - else dest[x] = src[x]; - } - dest[w-1] = src[w-1]; - dest += ds<<1; - src += ss<<1; - } - if (h & 1) - fast_memcpy(dest, src, w); -} - -#if HAVE_MMX2 -static void qpel_li_MMX2(unsigned char *d, unsigned char *s, int w, int h, int ds, int ss, int up) -{ - int i, j, ssd=ss; - long crap1, crap2; - if (up) { - ssd = -ss; - fast_memcpy(d, s, w); - d += ds; - s += ss; - } - for (i=h-1; i; i--) { - __asm__ volatile( - "pxor %%mm7, %%mm7 \n\t" - "2: \n\t" - "movq (%%"REG_S"), %%mm0 \n\t" - "movq (%%"REG_S",%%"REG_a"), %%mm1 \n\t" - "pavgb %%mm0, %%mm1 \n\t" - "add $8, %%"REG_S" \n\t" - "pavgb %%mm0, %%mm1 \n\t" - "movq %%mm1, (%%"REG_D") \n\t" - "add $8, %%"REG_D" \n\t" - "decl %%ecx \n\t" - "jnz 2b \n\t" - : "=S"(crap1), "=D"(crap2) - : "c"(w>>3), "S"(s), "D"(d), "a"((long)ssd) - ); - for (j=w-(w&7); j<w; j++) - d[j] = (s[j+ssd] + 3*s[j])>>2; - d += ds; - s += ss; - } - if (!up) fast_memcpy(d, s, w); - __asm__ volatile("emms \n\t" : : : "memory"); -} -#endif - -#if HAVE_MMX -static void qpel_li_MMX(unsigned char *d, unsigned char *s, int w, int h, int ds, int ss, int up) -{ - int i, j, ssd=ss; - int crap1, crap2; - if (up) { - ssd = -ss; - fast_memcpy(d, s, w); - d += ds; - s += ss; - } - for (i=h-1; i; i--) { - __asm__ volatile( - "pxor %%mm7, %%mm7 \n\t" - "3: \n\t" - "movq (%%"REG_S"), %%mm0 \n\t" - "movq (%%"REG_S"), %%mm1 \n\t" - "movq (%%"REG_S",%%"REG_a"), %%mm2 \n\t" - "movq (%%"REG_S",%%"REG_a"), %%mm3 \n\t" - "add $8, %%"REG_S" \n\t" - "punpcklbw %%mm7, %%mm0 \n\t" - "punpckhbw %%mm7, %%mm1 \n\t" - "punpcklbw %%mm7, %%mm2 \n\t" - "punpckhbw %%mm7, %%mm3 \n\t" - "paddw %%mm0, %%mm2 \n\t" - "paddw %%mm1, %%mm3 \n\t" - "paddw %%mm0, %%mm2 \n\t" - "paddw %%mm1, %%mm3 \n\t" - "paddw %%mm0, %%mm2 \n\t" - "paddw %%mm1, %%mm3 \n\t" - "psrlw $2, %%mm2 \n\t" - "psrlw $2, %%mm3 \n\t" - "packsswb %%mm3, %%mm2 \n\t" - "movq %%mm2, (%%"REG_D") \n\t" - "add $8, %%"REG_D" \n\t" - "decl %%ecx \n\t" - "jnz 3b \n\t" - : "=S"(crap1), "=D"(crap2) - : "c"(w>>3), "S"(s), "D"(d), "a"((long)ssd) - ); - for (j=w-(w&7); j<w; j++) - d[j] = (s[j+ssd] + 3*s[j])>>2; - d += ds; - s += ss; - } - if (!up) fast_memcpy(d, s, w); - __asm__ volatile("emms \n\t" : : : "memory"); -} - -#if HAVE_EBX_AVAILABLE -static void qpel_4tap_MMX(unsigned char *d, unsigned char *s, int w, int h, int ds, int ss, int up) -{ - int i, j, ssd=ss; - static const short filter[] = { - 29, 29, 29, 29, 110, 110, 110, 110, - 9, 9, 9, 9, 3, 3, 3, 3, - 64, 64, 64, 64 }; - int crap1, crap2; - if (up) { - ssd = -ss; - fast_memcpy(d, s, w); - d += ds; s += ss; - } - for (j=0; j<w; j++) - d[j] = (s[j+ssd] + 3*s[j])>>2; - d += ds; s += ss; - for (i=h-3; i; i--) { - __asm__ volatile( - "pxor %%mm0, %%mm0 \n\t" - "movq (%%"REG_d"), %%mm4 \n\t" - "movq 8(%%"REG_d"), %%mm5 \n\t" - "movq 16(%%"REG_d"), %%mm6 \n\t" - "movq 24(%%"REG_d"), %%mm7 \n\t" - "4: \n\t" - - "movq (%%"REG_S",%%"REG_a"), %%mm1 \n\t" - "movq (%%"REG_S"), %%mm2 \n\t" - "movq (%%"REG_S",%%"REG_b"), %%mm3 \n\t" - "punpcklbw %%mm0, %%mm1 \n\t" - "punpcklbw %%mm0, %%mm2 \n\t" - "pmullw %%mm4, %%mm1 \n\t" - "punpcklbw %%mm0, %%mm3 \n\t" - "pmullw %%mm5, %%mm2 \n\t" - "paddusw %%mm2, %%mm1 \n\t" - "pmullw %%mm6, %%mm3 \n\t" - "movq (%%"REG_S",%%"REG_a",2), %%mm2 \n\t" - "psubusw %%mm3, %%mm1 \n\t" - "punpcklbw %%mm0, %%mm2 \n\t" - "pmullw %%mm7, %%mm2 \n\t" - "psubusw %%mm2, %%mm1 \n\t" - "psrlw $7, %%mm1 \n\t" - - "movq (%%"REG_S",%%"REG_a"), %%mm2 \n\t" - "movq (%%"REG_S"), %%mm3 \n\t" - "punpckhbw %%mm0, %%mm2 \n\t" - "punpckhbw %%mm0, %%mm3 \n\t" - "pmullw %%mm4, %%mm2 \n\t" - "pmullw %%mm5, %%mm3 \n\t" - "paddusw %%mm3, %%mm2 \n\t" - "movq (%%"REG_S",%%"REG_b"), %%mm3 \n\t" - "punpckhbw %%mm0, %%mm3 \n\t" - "pmullw %%mm6, %%mm3 \n\t" - "psubusw %%mm3, %%mm2 \n\t" - "movq (%%"REG_S",%%"REG_a",2), %%mm3 \n\t" - "punpckhbw %%mm0, %%mm3 \n\t" - "add $8, %%"REG_S" \n\t" - "pmullw %%mm7, %%mm3 \n\t" - "psubusw %%mm3, %%mm2 \n\t" - "psrlw $7, %%mm2 \n\t" - - "packuswb %%mm2, %%mm1 \n\t" - "movq %%mm1, (%%"REG_D") \n\t" - "add $8, %%"REG_D" \n\t" - "decl %%ecx \n\t" - "jnz 4b \n\t" - : "=S"(crap1), "=D"(crap2) - : "c"(w>>3), "S"(s), "D"(d), "a"((long)ssd), "b"((long)-ssd), "d"(filter) - ); - for (j=w-(w&7); j<w; j++) - d[j] = (-9*s[j-ssd] + 111*s[j] + 29*s[j+ssd] - 3*s[j+ssd+ssd])>>7; - d += ds; - s += ss; - } - for (j=0; j<w; j++) - d[j] = (s[j+ssd] + 3*s[j])>>2; - d += ds; s += ss; - if (!up) fast_memcpy(d, s, w); - __asm__ volatile("emms \n\t" : : : "memory"); -} -#endif /* HAVE_EBX_AVAILABLE */ -#endif - -static inline int clamp(int a) -{ - // If a<512, this is equivalent to: - // return (a<0) ? 0 : ( (a>255) ? 255 : a); - return (~(a>>31)) & (a | ((a<<23)>>31)); -} - -static void qpel_li_C(unsigned char *d, unsigned char *s, int w, int h, int ds, int ss, int up) -{ - int i, j, ssd=ss; - if (up) { - ssd = -ss; - fast_memcpy(d, s, w); - d += ds; - s += ss; - } - for (i=h-1; i; i--) { - for (j=0; j<w; j++) - d[j] = (s[j+ssd] + 3*s[j])>>2; - d += ds; - s += ss; - } - if (!up) fast_memcpy(d, s, w); -} - -static void qpel_4tap_C(unsigned char *d, unsigned char *s, int w, int h, int ds, int ss, int up) -{ - int i, j, ssd=ss; - if (up) { - ssd = -ss; - fast_memcpy(d, s, w); - d += ds; s += ss; - } - for (j=0; j<w; j++) - d[j] = (s[j+ssd] + 3*s[j] + 2)>>2; - d += ds; s += ss; - for (i=h-3; i; i--) { - for (j=0; j<w; j++) - d[j] = clamp((-9*s[j-ssd] + 111*s[j] + 29*s[j+ssd] - 3*s[j+ssd+ssd] + 64)>>7); - d += ds; s += ss; - } - for (j=0; j<w; j++) - d[j] = (s[j+ssd] + 3*s[j] + 2)>>2; - d += ds; s += ss; - if (!up) fast_memcpy(d, s, w); -} - -static void (*qpel_li)(unsigned char *d, unsigned char *s, int w, int h, int ds, int ss, int up); -static void (*qpel_4tap)(unsigned char *d, unsigned char *s, int w, int h, int ds, int ss, int up); - -static int continue_buffered_image(struct vf_instance *vf); - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - vf->priv->buffered_mpi = mpi; - vf->priv->buffered_pts = pts; - vf->priv->buffered_i = 0; - return continue_buffered_image(vf); -} - -static int continue_buffered_image(struct vf_instance *vf) -{ - int i=vf->priv->buffered_i; - double pts = vf->priv->buffered_pts; - mp_image_t *mpi = vf->priv->buffered_mpi; - int ret=0; - mp_image_t *dmpi; - void (*qpel)(unsigned char *, unsigned char *, int, int, int, int, int) = NULL; - int bpp=1; - int tff; - - if (i == 0) - vf_queue_frame(vf, continue_buffered_image); - pts += i * .02; // XXX not right - - if (!(mpi->flags & MP_IMGFLAG_PLANAR)) bpp = mpi->bpp/8; - if (vf->priv->parity < 0) { - if (mpi->fields & MP_IMGFIELD_ORDERED) - tff = mpi->fields & MP_IMGFIELD_TOP_FIRST; - else - tff = 1; - } - else tff = (vf->priv->parity&1)^1; - - switch (vf->priv->mode) { - case 0: - for (; i<2; i++) { - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_EXPORT, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->width, mpi->height/2); - dmpi->planes[0] = mpi->planes[0] + (i^!tff)*mpi->stride[0]; - dmpi->stride[0] = 2*mpi->stride[0]; - if (mpi->flags & MP_IMGFLAG_PLANAR) { - dmpi->planes[1] = mpi->planes[1] + (i^!tff)*mpi->stride[1]; - dmpi->planes[2] = mpi->planes[2] + (i^!tff)*mpi->stride[2]; - dmpi->stride[1] = 2*mpi->stride[1]; - dmpi->stride[2] = 2*mpi->stride[2]; - } - ret |= vf_next_put_image(vf, dmpi, pts); - break; - } - break; - case 1: - for (; i<2; i++) { - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->width, mpi->height); - my_memcpy_pic(dmpi->planes[0] + (i^!tff)*dmpi->stride[0], - mpi->planes[0] + (i^!tff)*mpi->stride[0], - mpi->w*bpp, mpi->h/2, dmpi->stride[0]*2, mpi->stride[0]*2); - deint(dmpi->planes[0], dmpi->stride[0], mpi->planes[0], mpi->stride[0], mpi->w, mpi->h, (i^!tff)); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - my_memcpy_pic(dmpi->planes[1] + (i^!tff)*dmpi->stride[1], - mpi->planes[1] + (i^!tff)*mpi->stride[1], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[1]*2, mpi->stride[1]*2); - my_memcpy_pic(dmpi->planes[2] + (i^!tff)*dmpi->stride[2], - mpi->planes[2] + (i^!tff)*mpi->stride[2], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[2]*2, mpi->stride[2]*2); - deint(dmpi->planes[1], dmpi->stride[1], mpi->planes[1], mpi->stride[1], - mpi->chroma_width, mpi->chroma_height, (i^!tff)); - deint(dmpi->planes[2], dmpi->stride[2], mpi->planes[2], mpi->stride[2], - mpi->chroma_width, mpi->chroma_height, (i^!tff)); - } - ret |= vf_next_put_image(vf, dmpi, pts); - break; - } - break; - case 2: - qpel = qpel_li; - case 3: - // TODO: add 3tap filter - if (!qpel) - qpel = qpel_4tap; - case 4: - if (!qpel) - qpel = qpel_4tap; - - for (; i<2; i++) { - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->width, mpi->height/2); - qpel(dmpi->planes[0], mpi->planes[0] + (i^!tff)*mpi->stride[0], - mpi->w*bpp, mpi->h/2, dmpi->stride[0], mpi->stride[0]*2, (i^!tff)); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - qpel(dmpi->planes[1], - mpi->planes[1] + (i^!tff)*mpi->stride[1], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[1], mpi->stride[1]*2, (i^!tff)); - qpel(dmpi->planes[2], - mpi->planes[2] + (i^!tff)*mpi->stride[2], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[2], mpi->stride[2]*2, (i^!tff)); - } - ret |= vf_next_put_image(vf, dmpi, pts); - break; - } - break; - } - vf->priv->buffered_i = 1; - return ret; -} - -static int query_format(struct vf_instance *vf, unsigned int fmt) -{ - /* FIXME - figure out which formats exactly work */ - switch (fmt) { - default: - if (vf->priv->mode == 1) - return 0; - case IMGFMT_YV12: - case IMGFMT_IYUV: - case IMGFMT_I420: - return vf_next_query_format(vf, fmt); - } - return 0; -} - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt) -{ - switch (vf->priv->mode) { - case 0: - case 2: - case 3: - case 4: - return vf_next_config(vf,width,height/2,d_width,d_height,flags,outfmt); - case 1: - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); - } - return 0; -} - -static void uninit(struct vf_instance *vf) -{ - free(vf->priv); -} - -static int vf_open(vf_instance_t *vf, char *args) -{ - struct vf_priv_s *p; - vf->config = config; - vf->put_image = put_image; - vf->query_format = query_format; - vf->uninit = uninit; - vf->default_reqs = VFCAP_ACCEPT_STRIDE; - vf->priv = p = calloc(1, sizeof(struct vf_priv_s)); - vf->priv->mode = 4; - vf->priv->parity = -1; - if (args) sscanf(args, "%d:%d", &vf->priv->mode, &vf->priv->parity); - qpel_li = qpel_li_C; - qpel_4tap = qpel_4tap_C; -#if HAVE_MMX - if(gCpuCaps.hasMMX) qpel_li = qpel_li_MMX; -#if HAVE_EBX_AVAILABLE - if(gCpuCaps.hasMMX) qpel_4tap = qpel_4tap_MMX; -#endif -#endif -#if HAVE_MMX2 - if(gCpuCaps.hasMMX2) qpel_li = qpel_li_MMX2; -#endif - return 1; -} - -const vf_info_t vf_info_tfields = { - "temporal field separation", - "tfields", - "Rich Felker", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_tile.c b/libmpcodecs/vf_tile.c deleted file mode 100644 index 0b5dac1559..0000000000 --- a/libmpcodecs/vf_tile.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - * filter to tile a serie of image in a single, bigger, image - * - * The parameters are: - * - * xtile: number of tile on the x axis (5) - * ytile: number of tile on the y axis (5) - * xytile: when write the image, it can be different then xtile * ytile - * (for example you can write 8 * 7 tile, writing the file every - * 50 frame, to have one image every 2 seconds @ 25 fps ). - * start: pixel at the start (x/y), default 2 - * delta: pixel between 2 tile, (x/y), default 4 - * - * For example a valid command line is: - * ... -vf tile=10:5:-1:4:8 ... - * that make images of 10 * 5 tiles, with 4 pixel at the beginning and - * 8 pixel between tiles. - * - * The default command is: - * ... -vf tile=5:5:25:2:4 - * - * If you omit a parameter or put a value less then 0, the default is used. - * ... -vf tile=10:5::-1:10 - * - * You can also stop when you're ok - * ... -vf tile=10:5 - * (and this is probably the option you will use more often ...) - * - * Probably is good to put the scale filter before the tile :-) - * - * copyright (c) 2003 Daniele Forghieri ( guru@digitalfantasy.it ) - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -// strtoi memcpy_pic - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "config.h" -#include "mp_msg.h" -#include "cpudetect.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -#include "libvo/fastmemcpy.h" - -/* private data */ -struct vf_priv_s { - /* configuration data */ - /* Number on hor/ver tiles */ - int xtile; - int ytile; - /* When write the whole frame (default = xtile * ytile) */ - int xytile; - /* pixel at start / end (default = 4) */ - int start; - /* pixel between image (default = 2) */ - int delta; -// /* Background color, in destination format */ -// int bkgSet; - - /* Work data */ - int frame_cur; - double start_pts; -}; - - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - - struct vf_priv_s *priv; - int xw; - int yh; - - /* Calculate new destination size */ - priv = vf->priv; - xw = priv->start * 2 + - priv->xtile * width + - (priv->xtile - 1) * priv->delta; - yh = priv->start * 2 + - priv->ytile * height + - (priv->ytile - 1) * priv->delta; - - mp_msg(MSGT_VFILTER,MSGL_V,"vf_tile:config size set to %d * %d\n", xw, yh); - - return vf_next_config(vf, xw, yh, xw, yh, flags, outfmt); -} - -/* Filter handler */ -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - mp_image_t *dmpi; - struct vf_priv_s *priv; - int t; - int xw; - int yh; - int xi; - int yi; - int by; - int dw; - - /* Calculate new size */ - priv = vf->priv; - xw = priv->start * 2 + - priv->xtile * mpi->w + - (priv->xtile - 1) * priv->delta; - yh = priv->start * 2 + - priv->ytile * mpi->h+ - (priv->ytile - 1) * priv->delta; - - /* Get the big image! */ - dmpi=vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE, - xw, yh); - - /* bytes x pixel & bytes x line */ - if (mpi->flags & MP_IMGFLAG_PLANAR) { - by = 1; - dw = mpi->w; - } - else { - by = (mpi->bpp + 7) / 8; - dw = mpi->w * by; - } - /* Index position */ - t = priv->frame_cur % priv->xytile; -// if ((t == 0) && (bkg != 0)) { -// /* First frame, delete the background */ -// -// } - if (t == 0) - priv->start_pts = pts; - - /* Position of image */ - xi = priv->start + (mpi->w + priv->delta) * (t % priv->xtile); - yi = priv->start + (mpi->h + priv->delta) * (t / priv->xtile); - - /* Copy first (or only) plane */ - memcpy_pic( dmpi->planes[0] + xi * by + yi * dmpi->stride[0], - mpi->planes[0], - dw, - mpi->h, - dmpi->stride[0], - mpi->stride[0]); - - if (mpi->flags & MP_IMGFLAG_PLANAR) { - /* Copy the other 2 planes */ - memcpy_pic( dmpi->planes[1] + (xi >> mpi->chroma_x_shift) + (yi >> mpi->chroma_y_shift) * dmpi->stride[1], - mpi->planes[1], - mpi->chroma_width, - mpi->chroma_height, - dmpi->stride[1], - mpi->stride[1]); - memcpy_pic( dmpi->planes[2] + (xi >> mpi->chroma_x_shift) + (yi >> mpi->chroma_y_shift) * dmpi->stride[2], - mpi->planes[2], - mpi->chroma_width, - mpi->chroma_height, - dmpi->stride[2], - mpi->stride[2]); - } - - /* Increment current frame */ - ++priv->frame_cur; - - if (t == priv->xytile - 1) { - /* Display the composition */ - dmpi->width = xw; - dmpi->height = yh; - return vf_next_put_image(vf, dmpi, priv->start_pts); - } - else { - /* Skip the frame */ - return 0; - } -} - -static void uninit(struct vf_instance *vf) -{ - /* free local data */ - free(vf->priv); -} - -/* rgb/bgr 12->32 supported & some Yxxx */ -static int query_format(struct vf_instance *vf, unsigned int fmt) -{ - switch (fmt) { - /* rgb 12...32 bit */ - case IMGFMT_RGB12: - case IMGFMT_RGB15: - case IMGFMT_RGB16: - case IMGFMT_RGB24: - case IMGFMT_RGB32: - /* bgr 12...32 bit */ - case IMGFMT_BGR12: - case IMGFMT_BGR15: - case IMGFMT_BGR16: - case IMGFMT_BGR24: - case IMGFMT_BGR32: - /* Various Yxxx Formats */ - case IMGFMT_444P: - case IMGFMT_422P: - case IMGFMT_411P: - case IMGFMT_YUY2: - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_YVU9: - case IMGFMT_IF09: - case IMGFMT_IYUV: - return vf_next_query_format(vf, fmt); - } - return 0; -} - -/* Get an integer from the string pointed by s, adjusting s. - * If the value is less then 0 def_val is used. - * Return 0 for ok - * - * Look below ( in vf_open(...) ) for a use ... - */ -static int parse_int(char **s, int *rt, int def_val) -{ - - int t = 0; - - if (**s) { - /* Get value (dec, hex or octal) */ - t = strtol( *s, s, 0 ); - - /* Use default */ - if (t < 0) { - t = def_val; - } - - if (**s == ':') { - /* Point to next character (problably a digit) */ - ++(*s); - } - else if (**s != '\0') { - /* Error, we got some wrong char */ - return 1; - } - } - else { - t = def_val; - } - - *rt = t; - return 0; - -} - -/* Main entry funct for the filter */ -static int vf_open(vf_instance_t *vf, char *args) -{ - struct vf_priv_s *p; - int er; - - vf->put_image = put_image; - vf->query_format = query_format; - vf->config = config; - vf->uninit = uninit; - vf->default_reqs = VFCAP_ACCEPT_STRIDE; - /* Private data */ - vf->priv = p = calloc(1, sizeof(struct vf_priv_s)); - if (p == NULL) { - return 0; - } - - if (args == NULL) { - /* Use the default */ - args = ""; - } - /* Parse all the arguments */ - er = parse_int( &args, &p->xtile, 5 ); - er |= parse_int( &args, &p->ytile, 5 ); - er |= parse_int( &args, &p->xytile, 0 ); - er |= parse_int( &args, &p->start, 2 ); - er |= parse_int( &args, &p->delta, 4 ); -// er |= parse_int( &args, &p->bkgSet, 0 ); - - if (er) { - mp_tmsg(MSGT_VFILTER, MSGL_ERR, "[VF_FRAMESTEP] Error parsing argument.\n"); - return 0; - } - /* Load some default */ - if ((p->xytile <= 0) || (p->xytile > p->xtile * p->ytile)) { - p->xytile = p->xtile * p->ytile; - } - - /* Say what happen: use mp_msg(...)? */ - if ( mp_msg_test(MSGT_VFILTER,MSGL_V) ) { - printf("vf_tile: tiling %d * %d, output every %d frames\n", - p->xtile, - p->ytile, - p->xytile); - printf("vf_tile: start pixel %d, delta pixel %d\n", - p->start, - p->delta); -// printf("vf_tile: background 0x%x\n", -// p->bkgSet); - } - return 1; -} - -const vf_info_t vf_info_tile = { - "Make a single image tiling x/y images", - "tile", - "Daniele Forghieri", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_tinterlace.c b/libmpcodecs/vf_tinterlace.c deleted file mode 100644 index 2583d431e9..0000000000 --- a/libmpcodecs/vf_tinterlace.c +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (C) 2003 Michael Zucchi <notzed@ximian.com> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -#include "libvo/fastmemcpy.h" - -struct vf_priv_s { - int mode; - int frame; - mp_image_t *dmpi; -}; - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) -{ - int ret = 0; - mp_image_t *dmpi; - - switch (vf->priv->mode) { - case 0: - dmpi = vf->priv->dmpi; - if (dmpi == NULL) { - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE | - MP_IMGFLAG_PRESERVE, - mpi->width, mpi->height*2); - - vf->priv->dmpi = dmpi; - - memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h, - dmpi->stride[0]*2, mpi->stride[0]); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - memcpy_pic(dmpi->planes[1], mpi->planes[1], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[1]*2, mpi->stride[1]); - memcpy_pic(dmpi->planes[2], mpi->planes[2], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[2]*2, mpi->stride[2]); - } - } else { - vf->priv->dmpi = NULL; - - memcpy_pic(dmpi->planes[0]+dmpi->stride[0], mpi->planes[0], mpi->w, mpi->h, - dmpi->stride[0]*2, mpi->stride[0]); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - memcpy_pic(dmpi->planes[1]+dmpi->stride[1], mpi->planes[1], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[1]*2, mpi->stride[1]); - memcpy_pic(dmpi->planes[2]+dmpi->stride[2], mpi->planes[2], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[2]*2, mpi->stride[2]); - } - ret = vf_next_put_image(vf, dmpi, pts); - } - break; - case 1: - if (vf->priv->frame & 1) - ret = vf_next_put_image(vf, mpi, pts); - break; - case 2: - if ((vf->priv->frame & 1) == 0) - ret = vf_next_put_image(vf, mpi, pts); - break; - case 3: - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->width, mpi->height*2); - /* fixme, just clear alternate lines */ - vf_mpi_clear(dmpi, 0, 0, dmpi->w, dmpi->h); - if ((vf->priv->frame & 1) == 0) { - memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h, - dmpi->stride[0]*2, mpi->stride[0]); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - memcpy_pic(dmpi->planes[1], mpi->planes[1], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[1]*2, mpi->stride[1]); - memcpy_pic(dmpi->planes[2], mpi->planes[2], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[2]*2, mpi->stride[2]); - } - } else { - memcpy_pic(dmpi->planes[0]+dmpi->stride[0], mpi->planes[0], mpi->w, mpi->h, - dmpi->stride[0]*2, mpi->stride[0]); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - memcpy_pic(dmpi->planes[1]+dmpi->stride[1], mpi->planes[1], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[1]*2, mpi->stride[1]); - memcpy_pic(dmpi->planes[2]+dmpi->stride[2], mpi->planes[2], - mpi->chroma_width, mpi->chroma_height, - dmpi->stride[2]*2, mpi->stride[2]); - } - } - ret = vf_next_put_image(vf, dmpi, pts); - break; - case 4: - // Interleave even lines (only) from Frame 'i' with odd - // lines (only) from Frame 'i+1', halving the Frame - // rate and preserving image height. - - dmpi = vf->priv->dmpi; - - // @@ Need help: Should I set dmpi->fields to indicate - // that the (new) frame will be interlaced!? E.g. ... - // dmpi->fields |= MP_IMGFIELD_INTERLACED; - // dmpi->fields |= MP_IMGFIELD_TOP_FIRST; - // etc. - - if (dmpi == NULL) { - dmpi = vf_get_image(vf->next, mpi->imgfmt, - MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE | - MP_IMGFLAG_PRESERVE, - mpi->width, mpi->height); - - vf->priv->dmpi = dmpi; - - my_memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h/2, - dmpi->stride[0]*2, mpi->stride[0]*2); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - my_memcpy_pic(dmpi->planes[1], mpi->planes[1], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[1]*2, mpi->stride[1]*2); - my_memcpy_pic(dmpi->planes[2], mpi->planes[2], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[2]*2, mpi->stride[2]*2); - } - } else { - vf->priv->dmpi = NULL; - - my_memcpy_pic(dmpi->planes[0]+dmpi->stride[0], - mpi->planes[0]+mpi->stride[0], - mpi->w, mpi->h/2, - dmpi->stride[0]*2, mpi->stride[0]*2); - if (mpi->flags & MP_IMGFLAG_PLANAR) { - my_memcpy_pic(dmpi->planes[1]+dmpi->stride[1], - mpi->planes[1]+mpi->stride[1], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[1]*2, mpi->stride[1]*2); - my_memcpy_pic(dmpi->planes[2]+dmpi->stride[2], - mpi->planes[2]+mpi->stride[2], - mpi->chroma_width, mpi->chroma_height/2, - dmpi->stride[2]*2, mpi->stride[2]*2); - } - ret = vf_next_put_image(vf, dmpi, pts); - } - break; - } - - vf->priv->frame++; - - return ret; -} - -static int query_format(struct vf_instance *vf, unsigned int fmt) -{ - /* FIXME - figure out which other formats work */ - switch (fmt) { - case IMGFMT_YV12: - case IMGFMT_IYUV: - case IMGFMT_I420: - return vf_next_query_format(vf, fmt); - } - return 0; -} - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt) -{ - switch (vf->priv->mode) { - case 0: - case 3: - return vf_next_config(vf,width,height*2,d_width,d_height*2,flags,outfmt); - case 1: /* odd frames */ - case 2: /* even frames */ - case 4: /* alternate frame (height-preserving) interlacing */ - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); - } - return 0; -} - -static void uninit(struct vf_instance *vf) -{ - free(vf->priv); -} - -static int vf_open(vf_instance_t *vf, char *args) -{ - struct vf_priv_s *p; - vf->config = config; - vf->put_image = put_image; - vf->query_format = query_format; - vf->uninit = uninit; - vf->default_reqs = VFCAP_ACCEPT_STRIDE; - vf->priv = p = calloc(1, sizeof(struct vf_priv_s)); - vf->priv->mode = 0; - if (args) - sscanf(args, "%d", &vf->priv->mode); - vf->priv->frame = 0; - return 1; -} - -const vf_info_t vf_info_tinterlace = { - "temporal field interlacing", - "tinterlace", - "Michael Zucchi", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_uspp.c b/libmpcodecs/vf_uspp.c deleted file mode 100644 index 8f6dfd25ee..0000000000 --- a/libmpcodecs/vf_uspp.c +++ /dev/null @@ -1,384 +0,0 @@ -/* - * Copyright (C) 2005 Michael Niedermayer <michaelni@gmx.at> - * - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> -#include <math.h> -#include <assert.h> - -#include <libavcodec/avcodec.h> -#include <libavutil/mem.h> - -#include "config.h" - -#include "mp_msg.h" -#include "cpudetect.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" -#include "libvo/fastmemcpy.h" - -#define XMIN(a,b) ((a) < (b) ? (a) : (b)) - -#define BLOCK 16 - -//===========================================================================// -static const uint8_t __attribute__((aligned(8))) dither[8][8]={ -{ 0*4, 48*4, 12*4, 60*4, 3*4, 51*4, 15*4, 63*4, }, -{ 32*4, 16*4, 44*4, 28*4, 35*4, 19*4, 47*4, 31*4, }, -{ 8*4, 56*4, 4*4, 52*4, 11*4, 59*4, 7*4, 55*4, }, -{ 40*4, 24*4, 36*4, 20*4, 43*4, 27*4, 39*4, 23*4, }, -{ 2*4, 50*4, 14*4, 62*4, 1*4, 49*4, 13*4, 61*4, }, -{ 34*4, 18*4, 46*4, 30*4, 33*4, 17*4, 45*4, 29*4, }, -{ 10*4, 58*4, 6*4, 54*4, 9*4, 57*4, 5*4, 53*4, }, -{ 42*4, 26*4, 38*4, 22*4, 41*4, 25*4, 37*4, 21*4, }, -}; - -static const uint8_t offset[511][2]= { -{ 0, 0}, -{ 0, 0}, { 8, 8}, -{ 0, 0}, { 4, 4}, {12, 8}, { 8,12}, -{ 0, 0}, {10, 2}, { 4, 4}, {14, 6}, { 8, 8}, { 2,10}, {12,12}, { 6,14}, - -{ 0, 0}, {10, 2}, { 4, 4}, {14, 6}, { 8, 8}, { 2,10}, {12,12}, { 6,14}, -{ 5, 1}, {15, 3}, { 9, 5}, { 3, 7}, {13, 9}, { 7,11}, { 1,13}, {11,15}, - -{ 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9}, -{ 2, 2}, {10, 2}, { 2,10}, {10,10}, { 7, 3}, {15, 3}, { 7,11}, {15,11}, -{ 4, 4}, {12, 4}, { 4,12}, {12,12}, { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, -{ 6, 6}, {14, 6}, { 6,14}, {14,14}, { 3, 7}, {11, 7}, { 3,15}, {11,15}, - -{ 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 4, 0}, {12, 0}, { 4, 8}, {12, 8}, -{ 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9}, -{ 3, 2}, {11, 2}, { 3,10}, {11,10}, { 7, 2}, {15, 2}, { 7,10}, {15,10}, -{ 2, 3}, {10, 3}, { 2,11}, {10,11}, { 6, 3}, {14, 3}, { 6,11}, {14,11}, -{ 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 4, 4}, {12, 4}, { 4,12}, {12,12}, -{ 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 5, 5}, {13, 5}, { 5,13}, {13,13}, -{ 3, 6}, {11, 6}, { 3,14}, {11,14}, { 7, 6}, {15, 6}, { 7,14}, {15,14}, -{ 2, 7}, {10, 7}, { 2,15}, {10,15}, { 6, 7}, {14, 7}, { 6,15}, {14,15}, - -{ 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 0, 2}, { 8, 2}, { 0,10}, { 8,10}, -{ 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 0, 6}, { 8, 6}, { 0,14}, { 8,14}, -{ 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 1, 3}, { 9, 3}, { 1,11}, { 9,11}, -{ 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 1, 7}, { 9, 7}, { 1,15}, { 9,15}, -{ 2, 0}, {10, 0}, { 2, 8}, {10, 8}, { 2, 2}, {10, 2}, { 2,10}, {10,10}, -{ 2, 4}, {10, 4}, { 2,12}, {10,12}, { 2, 6}, {10, 6}, { 2,14}, {10,14}, -{ 3, 1}, {11, 1}, { 3, 9}, {11, 9}, { 3, 3}, {11, 3}, { 3,11}, {11,11}, -{ 3, 5}, {11, 5}, { 3,13}, {11,13}, { 3, 7}, {11, 7}, { 3,15}, {11,15}, -{ 4, 0}, {12, 0}, { 4, 8}, {12, 8}, { 4, 2}, {12, 2}, { 4,10}, {12,10}, -{ 4, 4}, {12, 4}, { 4,12}, {12,12}, { 4, 6}, {12, 6}, { 4,14}, {12,14}, -{ 5, 1}, {13, 1}, { 5, 9}, {13, 9}, { 5, 3}, {13, 3}, { 5,11}, {13,11}, -{ 5, 5}, {13, 5}, { 5,13}, {13,13}, { 5, 7}, {13, 7}, { 5,15}, {13,15}, -{ 6, 0}, {14, 0}, { 6, 8}, {14, 8}, { 6, 2}, {14, 2}, { 6,10}, {14,10}, -{ 6, 4}, {14, 4}, { 6,12}, {14,12}, { 6, 6}, {14, 6}, { 6,14}, {14,14}, -{ 7, 1}, {15, 1}, { 7, 9}, {15, 9}, { 7, 3}, {15, 3}, { 7,11}, {15,11}, -{ 7, 5}, {15, 5}, { 7,13}, {15,13}, { 7, 7}, {15, 7}, { 7,15}, {15,15}, - -{ 0, 0}, { 8, 0}, { 0, 8}, { 8, 8}, { 4, 4}, {12, 4}, { 4,12}, {12,12}, { 0, 4}, { 8, 4}, { 0,12}, { 8,12}, { 4, 0}, {12, 0}, { 4, 8}, {12, 8}, { 2, 2}, {10, 2}, { 2,10}, {10,10}, { 6, 6}, {14, 6}, { 6,14}, {14,14}, { 2, 6}, {10, 6}, { 2,14}, {10,14}, { 6, 2}, {14, 2}, { 6,10}, {14,10}, { 0, 2}, { 8, 2}, { 0,10}, { 8,10}, { 4, 6}, {12, 6}, { 4,14}, {12,14}, { 0, 6}, { 8, 6}, { 0,14}, { 8,14}, { 4, 2}, {12, 2}, { 4,10}, {12,10}, { 2, 0}, {10, 0}, { 2, 8}, {10, 8}, { 6, 4}, {14, 4}, { 6,12}, {14,12}, { 2, 4}, {10, 4}, { 2,12}, {10,12}, { 6, 0}, {14, 0}, { 6, 8}, {14, 8}, { 1, 1}, { 9, 1}, { 1, 9}, { 9, 9}, { 5, 5}, {13, 5}, { 5,13}, {13,13}, { 1, 5}, { 9, 5}, { 1,13}, { 9,13}, { 5, 1}, {13, 1}, { 5, 9}, {13, 9}, { 3, 3}, {11, 3}, { 3,11}, {11,11}, { 7, 7}, {15, 7}, { 7,15}, {15,15}, { 3, 7}, {11, 7}, { 3,15}, {11,15}, { 7, 3}, {15, 3}, { 7,11}, {15,11}, { 1, 3}, { 9, 3}, { 1,11}, { 9,11}, { 5, 7}, {13, 7}, { 5,15}, {13,15}, { 1, 7}, { 9, 7}, { 1,15}, { 9,15}, { 5, 3}, {13, 3}, { 5,11}, {13,11}, { 3, 1}, {11, 1}, { 3, 9}, {11, 9}, { 7, 5}, {15, 5}, { 7,13}, {15,13}, { 3, 5}, {11, 5}, { 3,13}, {11,13}, { 7, 1}, {15, 1}, { 7, 9}, {15, 9}, { 0, 1}, { 8, 1}, { 0, 9}, { 8, 9}, { 4, 5}, {12, 5}, { 4,13}, {12,13}, { 0, 5}, { 8, 5}, { 0,13}, { 8,13}, { 4, 1}, {12, 1}, { 4, 9}, {12, 9}, { 2, 3}, {10, 3}, { 2,11}, {10,11}, { 6, 7}, {14, 7}, { 6,15}, {14,15}, { 2, 7}, {10, 7}, { 2,15}, {10,15}, { 6, 3}, {14, 3}, { 6,11}, {14,11}, { 0, 3}, { 8, 3}, { 0,11}, { 8,11}, { 4, 7}, {12, 7}, { 4,15}, {12,15}, { 0, 7}, { 8, 7}, { 0,15}, { 8,15}, { 4, 3}, {12, 3}, { 4,11}, {12,11}, { 2, 1}, {10, 1}, { 2, 9}, {10, 9}, { 6, 5}, {14, 5}, { 6,13}, {14,13}, { 2, 5}, {10, 5}, { 2,13}, {10,13}, { 6, 1}, {14, 1}, { 6, 9}, {14, 9}, { 1, 0}, { 9, 0}, { 1, 8}, { 9, 8}, { 5, 4}, {13, 4}, { 5,12}, {13,12}, { 1, 4}, { 9, 4}, { 1,12}, { 9,12}, { 5, 0}, {13, 0}, { 5, 8}, {13, 8}, { 3, 2}, {11, 2}, { 3,10}, {11,10}, { 7, 6}, {15, 6}, { 7,14}, {15,14}, { 3, 6}, {11, 6}, { 3,14}, {11,14}, { 7, 2}, {15, 2}, { 7,10}, {15,10}, { 1, 2}, { 9, 2}, { 1,10}, { 9,10}, { 5, 6}, {13, 6}, { 5,14}, {13,14}, { 1, 6}, { 9, 6}, { 1,14}, { 9,14}, { 5, 2}, {13, 2}, { 5,10}, {13,10}, { 3, 0}, {11, 0}, { 3, 8}, {11, 8}, { 7, 4}, {15, 4}, { 7,12}, {15,12}, { 3, 4}, {11, 4}, { 3,12}, {11,12}, { 7, 0}, {15, 0}, { 7, 8}, {15, 8}, -}; - -struct vf_priv_s { - int log2_count; - int qp; - int mode; - int mpeg2; - int temp_stride[3]; - uint8_t *src[3]; - int16_t *temp[3]; - int outbuf_size; - uint8_t *outbuf; - AVCodecContext *avctx_enc[BLOCK*BLOCK]; - AVFrame *frame; - AVFrame *frame_dec; -}; - -static void store_slice_c(uint8_t *dst, int16_t *src, int dst_stride, int src_stride, int width, int height, int log2_scale){ - int y, x; - -#define STORE(pos) \ - temp= ((src[x + y*src_stride + pos]<<log2_scale) + d[pos])>>8;\ - if(temp & 0x100) temp= ~(temp>>31);\ - dst[x + y*dst_stride + pos]= temp; - - for(y=0; y<height; y++){ - const uint8_t *d= dither[y&7]; - for(x=0; x<width; x+=8){ - int temp; - STORE(0); - STORE(1); - STORE(2); - STORE(3); - STORE(4); - STORE(5); - STORE(6); - STORE(7); - } - } -} - -static void filter(struct vf_priv_s *p, uint8_t *dst[3], uint8_t *src[3], int dst_stride[3], int src_stride[3], int width, int height, uint8_t *qp_store, int qp_stride){ - int x, y, i, j; - const int count= 1<<p->log2_count; - - for(i=0; i<3; i++){ - int is_chroma= !!i; - int w= width >>is_chroma; - int h= height>>is_chroma; - int stride= p->temp_stride[i]; - int block= BLOCK>>is_chroma; - - if (!src[i] || !dst[i]) - continue; // HACK avoid crash for Y8 colourspace - for(y=0; y<h; y++){ - int index= block + block*stride + y*stride; - fast_memcpy(p->src[i] + index, src[i] + y*src_stride[i], w); - for(x=0; x<block; x++){ - p->src[i][index - x - 1]= p->src[i][index + x ]; - p->src[i][index + w + x ]= p->src[i][index + w - x - 1]; - } - } - for(y=0; y<block; y++){ - fast_memcpy(p->src[i] + ( block-1-y)*stride, p->src[i] + ( y+block )*stride, stride); - fast_memcpy(p->src[i] + (h+block +y)*stride, p->src[i] + (h-y+block-1)*stride, stride); - } - - p->frame->linesize[i]= stride; - memset(p->temp[i], 0, (h+2*block)*stride*sizeof(int16_t)); - } - - if(p->qp) - p->frame->quality= p->qp * FF_QP2LAMBDA; - else - p->frame->quality= norm_qscale(qp_store[0], p->mpeg2) * FF_QP2LAMBDA; -// init per MB qscale stuff FIXME - - for(i=0; i<count; i++){ - const int x1= offset[i+count-1][0]; - const int y1= offset[i+count-1][1]; - int offset; - p->frame->data[0]= p->src[0] + x1 + y1 * p->frame->linesize[0]; - p->frame->data[1]= p->src[1] + x1/2 + y1/2 * p->frame->linesize[1]; - p->frame->data[2]= p->src[2] + x1/2 + y1/2 * p->frame->linesize[2]; - - avcodec_encode_video(p->avctx_enc[i], p->outbuf, p->outbuf_size, p->frame); - p->frame_dec = p->avctx_enc[i]->coded_frame; - - offset= (BLOCK-x1) + (BLOCK-y1)*p->frame_dec->linesize[0]; - //FIXME optimize - for(y=0; y<height; y++){ - for(x=0; x<width; x++){ - p->temp[0][ x + y*p->temp_stride[0] ] += p->frame_dec->data[0][ x + y*p->frame_dec->linesize[0] + offset ]; - } - } - offset= (BLOCK/2-x1/2) + (BLOCK/2-y1/2)*p->frame_dec->linesize[1]; - for(y=0; y<height/2; y++){ - for(x=0; x<width/2; x++){ - p->temp[1][ x + y*p->temp_stride[1] ] += p->frame_dec->data[1][ x + y*p->frame_dec->linesize[1] + offset ]; - p->temp[2][ x + y*p->temp_stride[2] ] += p->frame_dec->data[2][ x + y*p->frame_dec->linesize[2] + offset ]; - } - } - } - - for(j=0; j<3; j++){ - int is_chroma= !!j; - if (!dst[j]) - continue; // HACK avoid crash for Y8 colourspace - store_slice_c(dst[j], p->temp[j], dst_stride[j], p->temp_stride[j], width>>is_chroma, height>>is_chroma, 8-p->log2_count); - } -} - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - int i; - AVCodec *enc= avcodec_find_encoder(CODEC_ID_SNOW); - - for(i=0; i<3; i++){ - int is_chroma= !!i; - int w= ((width + 4*BLOCK-1) & (~(2*BLOCK-1)))>>is_chroma; - int h= ((height + 4*BLOCK-1) & (~(2*BLOCK-1)))>>is_chroma; - - vf->priv->temp_stride[i]= w; - vf->priv->temp[i]= malloc(vf->priv->temp_stride[i]*h*sizeof(int16_t)); - vf->priv->src [i]= malloc(vf->priv->temp_stride[i]*h*sizeof(uint8_t)); - } - for(i=0; i< (1<<vf->priv->log2_count); i++){ - AVCodecContext *avctx_enc; - - avctx_enc = vf->priv->avctx_enc[i] = avcodec_alloc_context3(enc); - avctx_enc->width = width + BLOCK; - avctx_enc->height = height + BLOCK; - avctx_enc->time_base= (AVRational){1,25}; // meaningless - avctx_enc->gop_size = 300; - avctx_enc->max_b_frames= 0; - avctx_enc->pix_fmt = PIX_FMT_YUV420P; - avctx_enc->flags = CODEC_FLAG_QSCALE | CODEC_FLAG_LOW_DELAY; - avctx_enc->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL; - avctx_enc->global_quality= 123; - int res = avcodec_open2(avctx_enc, enc, NULL); - assert(res >= 0); - } - vf->priv->frame= avcodec_alloc_frame(); - vf->priv->frame_dec= avcodec_alloc_frame(); - - vf->priv->outbuf_size= (width + BLOCK)*(height + BLOCK)*10; - vf->priv->outbuf= malloc(vf->priv->outbuf_size); - - return vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); -} - -static void get_image(struct vf_instance *vf, mp_image_t *mpi){ - if(mpi->flags&MP_IMGFLAG_PRESERVE) return; // don't change - // ok, we can do pp in-place (or pp disabled): - vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, - mpi->type, mpi->flags | MP_IMGFLAG_READABLE, mpi->width, mpi->height); - mpi->planes[0]=vf->dmpi->planes[0]; - mpi->stride[0]=vf->dmpi->stride[0]; - mpi->width=vf->dmpi->width; - if(mpi->flags&MP_IMGFLAG_PLANAR){ - mpi->planes[1]=vf->dmpi->planes[1]; - mpi->planes[2]=vf->dmpi->planes[2]; - mpi->stride[1]=vf->dmpi->stride[1]; - mpi->stride[2]=vf->dmpi->stride[2]; - } - mpi->flags|=MP_IMGFLAG_DIRECT; -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - - if(!(mpi->flags&MP_IMGFLAG_DIRECT)){ - // no DR, so get a new image! hope we'll get DR buffer: - dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, - MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE, - mpi->width,mpi->height); - vf_clone_mpi_attributes(dmpi, mpi); - }else{ - dmpi=vf->dmpi; - } - - vf->priv->mpeg2= mpi->qscale_type; - if(vf->priv->log2_count || !(mpi->flags&MP_IMGFLAG_DIRECT)){ - if(mpi->qscale || vf->priv->qp){ - filter(vf->priv, dmpi->planes, mpi->planes, dmpi->stride, mpi->stride, mpi->w, mpi->h, mpi->qscale, mpi->qstride); - }else{ - memcpy_pic(dmpi->planes[0], mpi->planes[0], mpi->w, mpi->h, dmpi->stride[0], mpi->stride[0]); - memcpy_pic(dmpi->planes[1], mpi->planes[1], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[1], mpi->stride[1]); - memcpy_pic(dmpi->planes[2], mpi->planes[2], mpi->w>>mpi->chroma_x_shift, mpi->h>>mpi->chroma_y_shift, dmpi->stride[2], mpi->stride[2]); - } - } - -#if HAVE_MMX - if(gCpuCaps.hasMMX) __asm__ volatile ("emms\n\t"); -#endif -#if HAVE_MMX2 - if(gCpuCaps.hasMMX2) __asm__ volatile ("sfence\n\t"); -#endif - - return vf_next_put_image(vf,dmpi, pts); -} - -static void uninit(struct vf_instance *vf){ - int i; - if(!vf->priv) return; - - for(i=0; i<3; i++){ - free(vf->priv->temp[i]); - vf->priv->temp[i]= NULL; - free(vf->priv->src[i]); - vf->priv->src[i]= NULL; - } - for(i=0; i<BLOCK*BLOCK; i++){ - av_freep(&vf->priv->avctx_enc[i]); - } - - free(vf->priv); - vf->priv=NULL; -} - -//===========================================================================// -static int query_format(struct vf_instance *vf, unsigned int fmt){ - switch(fmt){ - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - case IMGFMT_Y800: - case IMGFMT_Y8: - return vf_next_query_format(vf,fmt); - } - return 0; -} - -static int control(struct vf_instance *vf, int request, void* data){ - switch(request){ - case VFCTRL_QUERY_MAX_PP_LEVEL: - return 8; - case VFCTRL_SET_PP_LEVEL: - vf->priv->log2_count= *((unsigned int*)data); - //FIXME we have to realloc a few things here - return CONTROL_TRUE; - } - return vf_next_control(vf,request,data); -} - -static int vf_open(vf_instance_t *vf, char *args){ - - int log2c=-1; - - vf->config=config; - vf->put_image=put_image; - vf->get_image=get_image; - vf->query_format=query_format; - vf->uninit=uninit; - vf->control= control; - vf->priv=malloc(sizeof(struct vf_priv_s)); - memset(vf->priv, 0, sizeof(struct vf_priv_s)); - - vf->priv->log2_count= 4; - - if (args) sscanf(args, "%d:%d:%d", &log2c, &vf->priv->qp, &vf->priv->mode); - - if( log2c >=0 && log2c <=8 ) - vf->priv->log2_count = log2c; - - if(vf->priv->qp < 0) - vf->priv->qp = 0; - -// #if HAVE_MMX -// if(gCpuCaps.hasMMX){ -// store_slice= store_slice_mmx; -// } -// #endif - - return 1; -} - -const vf_info_t vf_info_uspp = { - "ultra simple/slow postprocess", - "uspp", - "Michael Niedermayer", - "", - vf_open, - NULL -}; diff --git a/libmpcodecs/vf_yuvcsp.c b/libmpcodecs/vf_yuvcsp.c deleted file mode 100644 index 792fcaceb4..0000000000 --- a/libmpcodecs/vf_yuvcsp.c +++ /dev/null @@ -1,120 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -struct vf_priv_s { - int csp; -}; - -//===========================================================================// - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - return vf_next_config(vf, width, height, d_width, d_height, flags, outfmt); -} - -static inline int clamp_y(int x){ - return (x > 235) ? 235 : (x < 16) ? 16 : x; -} - -static inline int clamp_c(int x){ - return (x > 240) ? 240 : (x < 16) ? 16 : x; -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - int i,j; - uint8_t *y_in, *cb_in, *cr_in; - uint8_t *y_out, *cb_out, *cr_out; - - vf->dmpi=vf_get_image(vf->next,mpi->imgfmt, - MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, - mpi->width, mpi->height); - - y_in = mpi->planes[0]; - cb_in = mpi->planes[1]; - cr_in = mpi->planes[2]; - - y_out = vf->dmpi->planes[0]; - cb_out = vf->dmpi->planes[1]; - cr_out = vf->dmpi->planes[2]; - - for (i = 0; i < mpi->height; i++) - for (j = 0; j < mpi->width; j++) - y_out[i*vf->dmpi->stride[0]+j] = clamp_y(y_in[i*mpi->stride[0]+j]); - - for (i = 0; i < mpi->chroma_height; i++) - for (j = 0; j < mpi->chroma_width; j++) - { - cb_out[i*vf->dmpi->stride[1]+j] = clamp_c(cb_in[i*mpi->stride[1]+j]); - cr_out[i*vf->dmpi->stride[2]+j] = clamp_c(cr_in[i*mpi->stride[2]+j]); - } - - return vf_next_put_image(vf,vf->dmpi, pts); -} - -//===========================================================================// - -/* -static void uninit(struct vf_instance *vf){ - free(vf->priv); -} -*/ - -static int query_format(struct vf_instance *vf, unsigned int fmt){ - switch(fmt){ - case IMGFMT_YV12: - case IMGFMT_I420: - case IMGFMT_IYUV: - return 1; - } - return 0; -} - -static int vf_open(vf_instance_t *vf, char *args){ - vf->config=config; - vf->put_image=put_image; -// vf->uninit=uninit; - vf->query_format=query_format; -// vf->priv=calloc(1, sizeof(struct vf_priv_s)); -// if (args) -// vf->priv->csp = atoi(args); - return 1; -} - -const vf_info_t vf_info_yuvcsp = { - "yuv colorspace converter", - "yuvcsp", - "Alex Beregszaszi", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vf_yvu9.c b/libmpcodecs/vf_yvu9.c deleted file mode 100644 index 1e4e7be561..0000000000 --- a/libmpcodecs/vf_yvu9.c +++ /dev/null @@ -1,104 +0,0 @@ -/* - * This file is part of MPlayer. - * - * MPlayer is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * MPlayer 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with MPlayer; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <inttypes.h> - -#include "config.h" -#include "mp_msg.h" - -#include "img_format.h" -#include "mp_image.h" -#include "vf.h" - -#include "libvo/fastmemcpy.h" - -//===========================================================================// - -static int config(struct vf_instance *vf, - int width, int height, int d_width, int d_height, - unsigned int flags, unsigned int outfmt){ - - if(vf_next_query_format(vf,IMGFMT_YV12)<=0){ - mp_tmsg(MSGT_VFILTER, MSGL_WARN, "%s not supported by next filter/vo :(\n", "YVU9"); - return 0; - } - - return vf_next_config(vf,width,height,d_width,d_height,flags,IMGFMT_YV12); -} - -static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts){ - mp_image_t *dmpi; - int y,w,h; - - // hope we'll get DR buffer: - dmpi=vf_get_image(vf->next,IMGFMT_YV12, - MP_IMGTYPE_TEMP, 0/*MP_IMGFLAG_ACCEPT_STRIDE*/, - mpi->w, mpi->h); - - for(y=0;y<mpi->h;y++) - fast_memcpy(dmpi->planes[0]+dmpi->stride[0]*y, - mpi->planes[0]+mpi->stride[0]*y, - mpi->w); - - w=mpi->w/4; h=mpi->h/2; - for(y=0;y<h;y++){ - unsigned char* s=mpi->planes[1]+mpi->stride[1]*(y>>1); - unsigned char* d=dmpi->planes[1]+dmpi->stride[1]*y; - int x; - for(x=0;x<w;x++) d[2*x]=d[2*x+1]=s[x]; - } - for(y=0;y<h;y++){ - unsigned char* s=mpi->planes[2]+mpi->stride[2]*(y>>1); - unsigned char* d=dmpi->planes[2]+dmpi->stride[2]*y; - int x; - for(x=0;x<w;x++) d[2*x]=d[2*x+1]=s[x]; - } - - vf_clone_mpi_attributes(dmpi, mpi); - - return vf_next_put_image(vf,dmpi, pts); -} - -//===========================================================================// - -static int query_format(struct vf_instance *vf, unsigned int fmt){ - if (fmt == IMGFMT_YVU9 || fmt == IMGFMT_IF09) - return vf_next_query_format(vf,IMGFMT_YV12) & (~VFCAP_CSP_SUPPORTED_BY_HW); - return 0; -} - -static int vf_open(vf_instance_t *vf, char *args){ - vf->config=config; - vf->put_image=put_image; - vf->query_format=query_format; - return 1; -} - -const vf_info_t vf_info_yvu9 = { - "fast YVU9->YV12 conversion", - "yvu9", - "alex", - "", - vf_open, - NULL -}; - -//===========================================================================// diff --git a/libmpcodecs/vqf.h b/libmpcodecs/vqf.h deleted file mode 100644 index 139b578da7..0000000000 --- a/libmpcodecs/vqf.h +++ /dev/null @@ -1,228 +0,0 @@ -/* (c)Copyright 1996-2000 NTT Cyber Space Laboratories */ -/* Released on 2000.05.22 by N. Iwakami */ -/* Modified on 2000.05.25 by N. Iwakami */ -/* Released on 2000.09.06 by N. Iwakami */ - -// Modified for MPlayer on 2004.12.29 - -#ifndef MPLAYER_VQF_H -#define MPLAYER_VQF_H - -#include <stdio.h> - -#ifdef _MSC_VER -# ifdef DLL_MODULE -# define DllPort __declspec( dllexport ) -# else -# define DllPort __declspec( dllimport ) -# endif -#else -# define DllPort -#endif - -#ifdef __cplusplus -extern "C" { // only need to import/export C interface if used by C++ source code -#endif - -/************************/ -/*** General settings ***/ -/************************/ -/* Initialization error code */ -enum INIT_ERROR_CODE { - TVQ_NO_ERROR = 0, // no error - TVQ_ERROR, // general - TVQ_ERROR_VERSION, // wrong version - TVQ_ERROR_CHANNEL, // channel setting error - TVQ_ERROR_MODE, // wrong coding mode - TVQ_ERROR_PARAM, // inner parameter setting error - TVQ_ERROR_N_CAN, // wrong number of VQ pre-selection candidates, used only in encoder -}; - -/* version ID */ -#define TVQ_UNKNOWN_VERSION -1 -#define V2 0 -#define V2PP 1 - -#define N_VERSIONS 2 - -/* window types */ -enum WINDOW_TYPE { - ONLY_LONG_WINDOW = 0, - LONG_SHORT_WINDOW, - ONLY_SHORT_WINDOW, - SHORT_LONG_WINDOW, - SHORT_MEDIUM_WINDOW, - MEDIUM_LONG_WINDOW, - LONG_MEDIUM_WINDOW, - MEDIUM_SHORT_WINDOW, - ONLY_MEDIUM_WINDOW, -}; - -/* block types */ -enum BLOCK_TYPE { - BLK_SHORT = 0, - BLK_MEDIUM, - BLK_LONG, - BLK_PPC, -}; -#define N_BTYPE 3 // number of block types -#define N_INTR_TYPE 4 // number of interleave types, enum BLOCK_TYPE is commonly used for detecting interleave types. - -/* maximum number of channels */ -#define N_CH_MAX 2 - -/* type definition of code information interface */ -typedef struct { - /* block type */ - int w_type; - int btype; - - /* FBC info */ - int *segment_sw[ N_CH_MAX ]; - int *band_sw[ N_CH_MAX ]; - int *fg_intensity[ N_CH_MAX ]; - - /* VQ info */ - int *wvq; - - /* BSE info */ - int *fw; - int *fw_alf; - - /* gain info */ - int *pow; - - /* LSP info */ - int *lsp[ N_CH_MAX ]; - - /* PPC info */ - int pit[ N_CH_MAX ]; - int *pls; - int pgain[ N_CH_MAX ]; - - /* EBC info */ - int *bc[ N_CH_MAX ]; - - void *manager; -} INDEX; - -/***********************************************/ -/*** Definitions about program configuration ***/ -/***********************************************/ -/* type definition of tvqConfInfoSubBlock */ -typedef struct { - int sf_sz; // subframe size - int nsf; // number of subframes - int ndiv; // number of division of weighted interleave vector quantization - int ncrb; // number of Bark-scale subbands - int fw_ndiv; // number of division of BSE VQ - int fw_nbit; // number of bits for BSE VQ - int nsubg; // number of sub-blocks for gain coding - int ppc_enable; // PPC switch - int ebc_enable; // EBC switch - int ebc_crb_base; // EBC base band - int ebc_bits; // EBC bits - int fbc_enable; // FBC switch - int fbc_n_segment; // FBC number of segments - int fbc_nband; // FBC number of subbands - int *fbc_crb_tbl; // FBC subband table -} tvqConfInfoSubBlock; - -/* type definition of tvqConfInfo */ -typedef struct { - /* frame configuration */ - int N_CH; - /* window type coding */ - int BITS_WTYPE; - /* LSP coding */ - int LSP_BIT0; - int LSP_BIT1; - int LSP_BIT2; - int LSP_SPLIT; - /* Bark-scale envelope coding */ - int FW_ARSW_BITS; - /* gain coding */ - int GAIN_BITS; - int SUB_GAIN_BITS; - /* pitch excitation */ - int N_DIV_P; - int BASF_BIT; - int PGAIN_BIT; - - /* block type dependent parameters */ - tvqConfInfoSubBlock cfg[N_BTYPE]; - -} tvqConfInfo; - - -/*************************************************/ -/*** Definitions about TwinVQ bitstream header ***/ -/*************************************************/ -//#include "declib_src/tvq_hdr.h" -//#ifndef BUFSIZ -//#define BUFSIZ 1024 -//#endif - -#define KEYWORD_BYTES 4 -#define VERSION_BYTES 8 -#define ELEM_BYTES sizeof(unsigned long) - - -/* - */ -typedef struct { - char ID[KEYWORD_BYTES+VERSION_BYTES+1]; - int size; - /* Common Chunk */ - int channelMode; /* channel mode (mono:0/stereo:1) */ - int bitRate; /* bit rate (kbit/s) */ - int samplingRate; /* sampling rate (44.1 kHz -> 44) */ - int securityLevel; /* security level (always 0) */ - /* Text Chunk */ - char Name[BUFSIZ]; - char Comt[BUFSIZ]; - char Auth[BUFSIZ]; - char Cpyr[BUFSIZ]; - char File[BUFSIZ]; - char Extr[BUFSIZ]; // add by OKAMOTO 99.12.21 - /* Data size chunk*/ - int Dsiz; -} headerInfo; - -// TwinVQ decoder initialization/termination functions -//DllPort int TvqInitialize( headerInfo *setupInfo, INDEX *index, int dispErrorMessageBox ); -//DllPort void TvqTerminate( INDEX *index ); -//DllPort void TvqGetVectorInfo(int *bits0[], int *bits1[]); -//DllPort void TvqResetFrameCounter(void); - -// TwinVQ decoder function -//DllPort void TvqDecodeFrame(INDEX *indexp, float out[]); -//DllPort int TvqWtypeToBtype( int w_type, int *btype ); -//DllPort void TvqUpdateVectorInfo(int varbits, int *ndiv, int bits0[], int bits1[]); -//DllPort void TvqSetFrameCounter( int position ); - -// TwinVQ query functions -//DllPort int TvqCheckVersion(char *versionID); -//DllPort void TvqGetSetupInfo(headerInfo *setupInfo); // setup information -//DllPort void TvqGetConfInfo(tvqConfInfo *cf); // configuration information -//DllPort int TvqGetFrameSize(void); // frame size -//DllPort int TvqGetNumChannels(void); // number of channels -//DllPort int TvqGetBitRate(void); // total bitrate -//DllPort float TvqGetSamplingRate(void); // sampling rate -//DllPort int TvqGetNumFixedBitsPerFrame(void); // number of fixed bits per frame -//DllPort int TvqGetNumFrames(void); // number of decoded frame -//DllPort int TvqGetModuleVersion( char* versionString ); - -#ifdef V2PLUS_SUPPORT -// TwinVQ FB coding tool control -DllPort void TvqFbCountUsedBits(int nbit); // count number of used bits -DllPort float TvqGetFbCurrentBitrate(void); // query average bitrate for the tool -DllPort int TvqGetFbTotalBits(void); // query total number of used bits -#endif - -#ifdef __cplusplus -} -#endif - - -#endif /* MPLAYER_VQF_H */ |