/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/av_helpers.h |
---|
0,0 → 1,27 |
/* |
* Generic libav* helpers |
* |
* 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_AV_HELPERS_H |
#define MPLAYER_AV_HELPERS_H |
void ff_init_avcodec(void); |
void ff_init_avformat(void); |
#endif /* MPLAYER_AV_HELPERS_H */ |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/cpudetect.h |
---|
0,0 → 1,60 |
/* |
* 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_CPUDETECT_H |
#define MPLAYER_CPUDETECT_H |
#define CPUTYPE_I386 3 |
#define CPUTYPE_I486 4 |
#define CPUTYPE_I586 5 |
#define CPUTYPE_I686 6 |
#include "libavutil/x86_cpu.h" |
typedef struct cpucaps_s { |
int cpuType; |
int cpuModel; |
int cpuStepping; |
int hasMMX; |
int hasMMX2; |
int has3DNow; |
int has3DNowExt; |
int hasSSE; |
int hasSSE2; |
int hasSSE3; |
int hasSSSE3; |
int hasSSE4; |
int hasSSE42; |
int hasSSE4a; |
int hasAVX; |
int isX86; |
unsigned cl_size; /* size of cache line */ |
int hasAltiVec; |
int hasTSC; |
} CpuCaps; |
extern CpuCaps ff_gCpuCaps; |
void ff_do_cpuid(unsigned int ax, unsigned int *p); |
void ff_GetCpuCaps(CpuCaps *caps); |
/* returned value is malloc()'ed so free() it after use */ |
char *ff_GetCpuFriendlyName(unsigned int regs[], unsigned int regs2[]); |
#endif /* MPLAYER_CPUDETECT_H */ |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/img_format.c |
---|
0,0 → 1,233 |
/* |
* 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 "config.h" |
#include "img_format.h" |
#include "stdio.h" |
#include "libavutil/bswap.h" |
const char *ff_vo_format_name(int format) |
{ |
static char unknown_format[20]; |
switch(format) |
{ |
case IMGFMT_RGB1: return "RGB 1-bit"; |
case IMGFMT_RGB4: return "RGB 4-bit"; |
case IMGFMT_RG4B: return "RGB 4-bit per byte"; |
case IMGFMT_RGB8: return "RGB 8-bit"; |
case IMGFMT_RGB12: return "RGB 12-bit"; |
case IMGFMT_RGB15: return "RGB 15-bit"; |
case IMGFMT_RGB16: return "RGB 16-bit"; |
case IMGFMT_RGB24: return "RGB 24-bit"; |
// case IMGFMT_RGB32: return "RGB 32-bit"; |
case IMGFMT_RGB48LE: return "RGB 48-bit LE"; |
case IMGFMT_RGB48BE: return "RGB 48-bit BE"; |
case IMGFMT_RGB64LE: return "RGB 64-bit LE"; |
case IMGFMT_RGB64BE: return "RGB 64-bit BE"; |
case IMGFMT_BGR1: return "BGR 1-bit"; |
case IMGFMT_BGR4: return "BGR 4-bit"; |
case IMGFMT_BG4B: return "BGR 4-bit per byte"; |
case IMGFMT_BGR8: return "BGR 8-bit"; |
case IMGFMT_BGR12: return "BGR 12-bit"; |
case IMGFMT_BGR15: return "BGR 15-bit"; |
case IMGFMT_BGR16: return "BGR 16-bit"; |
case IMGFMT_BGR24: return "BGR 24-bit"; |
// case IMGFMT_BGR32: return "BGR 32-bit"; |
case IMGFMT_ABGR: return "ABGR"; |
case IMGFMT_BGRA: return "BGRA"; |
case IMGFMT_ARGB: return "ARGB"; |
case IMGFMT_RGBA: return "RGBA"; |
case IMGFMT_GBR24P: return "Planar GBR 24-bit"; |
case IMGFMT_GBR12P: return "Planar GBR 36-bit"; |
case IMGFMT_GBR14P: return "Planar GBR 42-bit"; |
case IMGFMT_YVU9: return "Planar YVU9"; |
case IMGFMT_IF09: return "Planar IF09"; |
case IMGFMT_YV12: return "Planar YV12"; |
case IMGFMT_I420: return "Planar I420"; |
case IMGFMT_IYUV: return "Planar IYUV"; |
case IMGFMT_CLPL: return "Planar CLPL"; |
case IMGFMT_Y800: return "Planar Y800"; |
case IMGFMT_Y8: return "Planar Y8"; |
case IMGFMT_Y8A: return "Planar Y8 with alpha"; |
case IMGFMT_Y16_LE: return "Planar Y16 little-endian"; |
case IMGFMT_Y16_BE: return "Planar Y16 big-endian"; |
case IMGFMT_420P16_LE: return "Planar 420P 16-bit little-endian"; |
case IMGFMT_420P16_BE: return "Planar 420P 16-bit big-endian"; |
case IMGFMT_420P14_LE: return "Planar 420P 14-bit little-endian"; |
case IMGFMT_420P14_BE: return "Planar 420P 14-bit big-endian"; |
case IMGFMT_420P12_LE: return "Planar 420P 12-bit little-endian"; |
case IMGFMT_420P12_BE: return "Planar 420P 12-bit big-endian"; |
case IMGFMT_420P10_LE: return "Planar 420P 10-bit little-endian"; |
case IMGFMT_420P10_BE: return "Planar 420P 10-bit big-endian"; |
case IMGFMT_420P9_LE: return "Planar 420P 9-bit little-endian"; |
case IMGFMT_420P9_BE: return "Planar 420P 9-bit big-endian"; |
case IMGFMT_422P16_LE: return "Planar 422P 16-bit little-endian"; |
case IMGFMT_422P16_BE: return "Planar 422P 16-bit big-endian"; |
case IMGFMT_422P14_LE: return "Planar 422P 14-bit little-endian"; |
case IMGFMT_422P14_BE: return "Planar 422P 14-bit big-endian"; |
case IMGFMT_422P12_LE: return "Planar 422P 12-bit little-endian"; |
case IMGFMT_422P12_BE: return "Planar 422P 12-bit big-endian"; |
case IMGFMT_422P10_LE: return "Planar 422P 10-bit little-endian"; |
case IMGFMT_422P10_BE: return "Planar 422P 10-bit big-endian"; |
case IMGFMT_422P9_LE: return "Planar 422P 9-bit little-endian"; |
case IMGFMT_422P9_BE: return "Planar 422P 9-bit big-endian"; |
case IMGFMT_444P16_LE: return "Planar 444P 16-bit little-endian"; |
case IMGFMT_444P16_BE: return "Planar 444P 16-bit big-endian"; |
case IMGFMT_444P14_LE: return "Planar 444P 14-bit little-endian"; |
case IMGFMT_444P14_BE: return "Planar 444P 14-bit big-endian"; |
case IMGFMT_444P12_LE: return "Planar 444P 12-bit little-endian"; |
case IMGFMT_444P12_BE: return "Planar 444P 12-bit big-endian"; |
case IMGFMT_444P10_LE: return "Planar 444P 10-bit little-endian"; |
case IMGFMT_444P10_BE: return "Planar 444P 10-bit big-endian"; |
case IMGFMT_444P9_LE: return "Planar 444P 9-bit little-endian"; |
case IMGFMT_444P9_BE: return "Planar 444P 9-bit big-endian"; |
case IMGFMT_420A: return "Planar 420P with alpha"; |
case IMGFMT_444P: return "Planar 444P"; |
case IMGFMT_444A: return "Planar 444P with alpha"; |
case IMGFMT_422P: return "Planar 422P"; |
case IMGFMT_422A: return "Planar 422P with alpha"; |
case IMGFMT_411P: return "Planar 411P"; |
case IMGFMT_NV12: return "Planar NV12"; |
case IMGFMT_NV21: return "Planar NV21"; |
case IMGFMT_HM12: return "Planar NV12 Macroblock"; |
case IMGFMT_IUYV: return "Packed IUYV"; |
case IMGFMT_IY41: return "Packed IY41"; |
case IMGFMT_IYU1: return "Packed IYU1"; |
case IMGFMT_IYU2: return "Packed IYU2"; |
case IMGFMT_UYVY: return "Packed UYVY"; |
case IMGFMT_UYNV: return "Packed UYNV"; |
case IMGFMT_cyuv: return "Packed CYUV"; |
case IMGFMT_Y422: return "Packed Y422"; |
case IMGFMT_YUY2: return "Packed YUY2"; |
case IMGFMT_YUNV: return "Packed YUNV"; |
case IMGFMT_YVYU: return "Packed YVYU"; |
case IMGFMT_Y41P: return "Packed Y41P"; |
case IMGFMT_Y211: return "Packed Y211"; |
case IMGFMT_Y41T: return "Packed Y41T"; |
case IMGFMT_Y42T: return "Packed Y42T"; |
case IMGFMT_V422: return "Packed V422"; |
case IMGFMT_V655: return "Packed V655"; |
case IMGFMT_CLJR: return "Packed CLJR"; |
case IMGFMT_YUVP: return "Packed YUVP"; |
case IMGFMT_UYVP: return "Packed UYVP"; |
case IMGFMT_MPEGPES: return "Mpeg PES"; |
case IMGFMT_ZRMJPEGNI: return "Zoran MJPEG non-interlaced"; |
case IMGFMT_ZRMJPEGIT: return "Zoran MJPEG top field first"; |
case IMGFMT_ZRMJPEGIB: return "Zoran MJPEG bottom field first"; |
case IMGFMT_XVMC_MOCO_MPEG2: return "MPEG1/2 Motion Compensation"; |
case IMGFMT_XVMC_IDCT_MPEG2: return "MPEG1/2 Motion Compensation and IDCT"; |
case IMGFMT_VDPAU_MPEG1: return "MPEG1 VDPAU acceleration"; |
case IMGFMT_VDPAU_MPEG2: return "MPEG2 VDPAU acceleration"; |
case IMGFMT_VDPAU_H264: return "H.264 VDPAU acceleration"; |
case IMGFMT_VDPAU_MPEG4: return "MPEG-4 Part 2 VDPAU acceleration"; |
case IMGFMT_VDPAU_WMV3: return "WMV3 VDPAU acceleration"; |
case IMGFMT_VDPAU_VC1: return "VC1 VDPAU acceleration"; |
} |
snprintf(unknown_format,20,"Unknown 0x%04x",format); |
return unknown_format; |
} |
int ff_mp_get_chroma_shift(int format, int *x_shift, int *y_shift, int *component_bits) |
{ |
int xs = 0, ys = 0; |
int bpp; |
int err = 0; |
int bits = 8; |
if ((format & 0xff0000f0) == 0x34000050) |
format = av_bswap32(format); |
if ((format & 0xf00000ff) == 0x50000034) { |
switch (format >> 24) { |
case 0x50: |
break; |
case 0x51: |
bits = 16; |
break; |
case 0x52: |
bits = 10; |
break; |
case 0x53: |
bits = 9; |
break; |
default: |
err = 1; |
break; |
} |
switch (format & 0x00ffffff) { |
case 0x00343434: // 444 |
xs = 0; |
ys = 0; |
break; |
case 0x00323234: // 422 |
xs = 1; |
ys = 0; |
break; |
case 0x00303234: // 420 |
xs = 1; |
ys = 1; |
break; |
case 0x00313134: // 411 |
xs = 2; |
ys = 0; |
break; |
case 0x00303434: // 440 |
xs = 0; |
ys = 1; |
break; |
default: |
err = 1; |
break; |
} |
} else switch (format) { |
case IMGFMT_444A: |
xs = 0; |
ys = 0; |
break; |
case IMGFMT_422A: |
xs = 1; |
ys = 0; |
break; |
case IMGFMT_420A: |
case IMGFMT_I420: |
case IMGFMT_IYUV: |
case IMGFMT_YV12: |
xs = 1; |
ys = 1; |
break; |
case IMGFMT_IF09: |
case IMGFMT_YVU9: |
xs = 2; |
ys = 2; |
break; |
case IMGFMT_Y8: |
case IMGFMT_Y800: |
xs = 31; |
ys = 31; |
break; |
default: |
err = 1; |
break; |
} |
if (x_shift) *x_shift = xs; |
if (y_shift) *y_shift = ys; |
if (component_bits) *component_bits = bits; |
bpp = 8 + ((16 >> xs) >> ys); |
if (format == IMGFMT_420A || format == IMGFMT_422A || format == IMGFMT_444A) |
bpp += 8; |
bpp *= (bits + 7) >> 3; |
return err ? 0 : bpp; |
} |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/img_format.h |
---|
0,0 → 1,300 |
/* |
* 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_IMG_FORMAT_H |
#define MPLAYER_IMG_FORMAT_H |
#include "config.h" |
/* RGB/BGR Formats */ |
#define IMGFMT_RGB_MASK 0xFFFFFF00 |
#define IMGFMT_RGB (('R'<<24)|('G'<<16)|('B'<<8)) |
#define IMGFMT_RGB1 (IMGFMT_RGB|1) |
#define IMGFMT_RGB4 (IMGFMT_RGB|4) |
#define IMGFMT_RGB4_CHAR (IMGFMT_RGB|4|128) // RGB4 with 1 pixel per byte |
#define IMGFMT_RGB8 (IMGFMT_RGB|8) |
#define IMGFMT_RGB12 (IMGFMT_RGB|12) |
#define IMGFMT_RGB15 (IMGFMT_RGB|15) |
#define IMGFMT_RGB16 (IMGFMT_RGB|16) |
#define IMGFMT_RGB24 (IMGFMT_RGB|24) |
#define IMGFMT_RGB32 (IMGFMT_RGB|32) |
#define IMGFMT_RGB48LE (IMGFMT_RGB|48) |
#define IMGFMT_RGB48BE (IMGFMT_RGB|48|128) |
#define IMGFMT_RGB64LE (IMGFMT_RGB|64) |
#define IMGFMT_RGB64BE (IMGFMT_RGB|64|128) |
#define IMGFMT_BGR_MASK 0xFFFFFF00 |
#define IMGFMT_BGR (('B'<<24)|('G'<<16)|('R'<<8)) |
#define IMGFMT_BGR1 (IMGFMT_BGR|1) |
#define IMGFMT_BGR4 (IMGFMT_BGR|4) |
#define IMGFMT_BGR4_CHAR (IMGFMT_BGR|4|128) // BGR4 with 1 pixel per byte |
#define IMGFMT_BGR8 (IMGFMT_BGR|8) |
#define IMGFMT_BGR12 (IMGFMT_BGR|12) |
#define IMGFMT_BGR15 (IMGFMT_BGR|15) |
#define IMGFMT_BGR16 (IMGFMT_BGR|16) |
#define IMGFMT_BGR24 (IMGFMT_BGR|24) |
#define IMGFMT_BGR32 (IMGFMT_BGR|32) |
#define IMGFMT_GBR24P (('G'<<24)|('B'<<16)|('R'<<8)|24) |
#define IMGFMT_GBR12PLE (('G'<<24)|('B'<<16)|('R'<<8)|36) |
#define IMGFMT_GBR12PBE (('G'<<24)|('B'<<16)|('R'<<8)|36|128) |
#define IMGFMT_GBR14PLE (('G'<<24)|('B'<<16)|('R'<<8)|42) |
#define IMGFMT_GBR14PBE (('G'<<24)|('B'<<16)|('R'<<8)|42|128) |
#if HAVE_BIGENDIAN |
#define IMGFMT_ABGR IMGFMT_RGB32 |
#define IMGFMT_BGRA (IMGFMT_RGB32|128) |
#define IMGFMT_ARGB IMGFMT_BGR32 |
#define IMGFMT_RGBA (IMGFMT_BGR32|128) |
#define IMGFMT_RGB64NE IMGFMT_RGB64BE |
#define IMGFMT_RGB48NE IMGFMT_RGB48BE |
#define IMGFMT_RGB12BE IMGFMT_RGB12 |
#define IMGFMT_RGB12LE (IMGFMT_RGB12|128) |
#define IMGFMT_RGB15BE IMGFMT_RGB15 |
#define IMGFMT_RGB15LE (IMGFMT_RGB15|128) |
#define IMGFMT_RGB16BE IMGFMT_RGB16 |
#define IMGFMT_RGB16LE (IMGFMT_RGB16|128) |
#define IMGFMT_BGR12BE IMGFMT_BGR12 |
#define IMGFMT_BGR12LE (IMGFMT_BGR12|128) |
#define IMGFMT_BGR15BE IMGFMT_BGR15 |
#define IMGFMT_BGR15LE (IMGFMT_BGR15|128) |
#define IMGFMT_BGR16BE IMGFMT_BGR16 |
#define IMGFMT_BGR16LE (IMGFMT_BGR16|128) |
#define IMGFMT_GBR12P IMGFMT_GBR12PBE |
#define IMGFMT_GBR14P IMGFMT_GBR14PBE |
#else |
#define IMGFMT_ABGR (IMGFMT_BGR32|128) |
#define IMGFMT_BGRA IMGFMT_BGR32 |
#define IMGFMT_ARGB (IMGFMT_RGB32|128) |
#define IMGFMT_RGBA IMGFMT_RGB32 |
#define IMGFMT_RGB64NE IMGFMT_RGB64LE |
#define IMGFMT_RGB48NE IMGFMT_RGB48LE |
#define IMGFMT_RGB12BE (IMGFMT_RGB12|128) |
#define IMGFMT_RGB12LE IMGFMT_RGB12 |
#define IMGFMT_RGB15BE (IMGFMT_RGB15|128) |
#define IMGFMT_RGB15LE IMGFMT_RGB15 |
#define IMGFMT_RGB16BE (IMGFMT_RGB16|128) |
#define IMGFMT_RGB16LE IMGFMT_RGB16 |
#define IMGFMT_BGR12BE (IMGFMT_BGR12|128) |
#define IMGFMT_BGR12LE IMGFMT_BGR12 |
#define IMGFMT_BGR15BE (IMGFMT_BGR15|128) |
#define IMGFMT_BGR15LE IMGFMT_BGR15 |
#define IMGFMT_BGR16BE (IMGFMT_BGR16|128) |
#define IMGFMT_BGR16LE IMGFMT_BGR16 |
#define IMGFMT_GBR12P IMGFMT_GBR12PLE |
#define IMGFMT_GBR14P IMGFMT_GBR14PLE |
#endif |
/* old names for compatibility */ |
#define IMGFMT_RG4B IMGFMT_RGB4_CHAR |
#define IMGFMT_BG4B IMGFMT_BGR4_CHAR |
#define IMGFMT_IS_RGB(fmt) (((fmt)&IMGFMT_RGB_MASK)==IMGFMT_RGB) |
#define IMGFMT_IS_BGR(fmt) (((fmt)&IMGFMT_BGR_MASK)==IMGFMT_BGR) |
#define IMGFMT_RGB_DEPTH(fmt) ((fmt)&0x7F) |
#define IMGFMT_BGR_DEPTH(fmt) ((fmt)&0x7F) |
/* Planar YUV Formats */ |
#define IMGFMT_YVU9 0x39555659 |
#define IMGFMT_IF09 0x39304649 |
#define IMGFMT_YV12 0x32315659 |
#define IMGFMT_I420 0x30323449 |
#define IMGFMT_IYUV 0x56555949 |
#define IMGFMT_CLPL 0x4C504C43 |
#define IMGFMT_Y800 0x30303859 |
#define IMGFMT_Y8 0x20203859 |
#define IMGFMT_NV12 0x3231564E |
#define IMGFMT_NV21 0x3132564E |
#define IMGFMT_Y16_LE 0x20363159 |
/* unofficial Planar Formats, FIXME if official 4CC exists */ |
#define IMGFMT_444P 0x50343434 |
#define IMGFMT_422P 0x50323234 |
#define IMGFMT_411P 0x50313134 |
#define IMGFMT_440P 0x50303434 |
#define IMGFMT_HM12 0x32314D48 |
#define IMGFMT_Y16_BE 0x59313620 |
// Gray with alpha |
#define IMGFMT_Y8A 0x59320008 |
// 4:2:0 planar with alpha |
#define IMGFMT_420A 0x41303234 |
// 4:2:2 planar with alpha |
#define IMGFMT_422A 0x41323234 |
// 4:4:4 planar with alpha |
#define IMGFMT_444A 0x41343434 |
#define IMGFMT_444P16_LE 0x51343434 |
#define IMGFMT_444P16_BE 0x34343451 |
#define IMGFMT_444P14_LE 0x54343434 |
#define IMGFMT_444P14_BE 0x34343454 |
#define IMGFMT_444P12_LE 0x55343434 |
#define IMGFMT_444P12_BE 0x34343455 |
#define IMGFMT_444P10_LE 0x52343434 |
#define IMGFMT_444P10_BE 0x34343452 |
#define IMGFMT_444P9_LE 0x53343434 |
#define IMGFMT_444P9_BE 0x34343453 |
#define IMGFMT_422P16_LE 0x51323234 |
#define IMGFMT_422P16_BE 0x34323251 |
#define IMGFMT_422P14_LE 0x54323234 |
#define IMGFMT_422P14_BE 0x34323254 |
#define IMGFMT_422P12_LE 0x55323234 |
#define IMGFMT_422P12_BE 0x34323255 |
#define IMGFMT_422P10_LE 0x52323234 |
#define IMGFMT_422P10_BE 0x34323252 |
#define IMGFMT_422P9_LE 0x53323234 |
#define IMGFMT_422P9_BE 0x34323253 |
#define IMGFMT_420P16_LE 0x51303234 |
#define IMGFMT_420P16_BE 0x34323051 |
#define IMGFMT_420P14_LE 0x54303234 |
#define IMGFMT_420P14_BE 0x34323054 |
#define IMGFMT_420P12_LE 0x55303234 |
#define IMGFMT_420P12_BE 0x34323055 |
#define IMGFMT_420P10_LE 0x52303234 |
#define IMGFMT_420P10_BE 0x34323052 |
#define IMGFMT_420P9_LE 0x53303234 |
#define IMGFMT_420P9_BE 0x34323053 |
#if HAVE_BIGENDIAN |
#define IMGFMT_444P16 IMGFMT_444P16_BE |
#define IMGFMT_444P14 IMGFMT_444P14_BE |
#define IMGFMT_444P12 IMGFMT_444P12_BE |
#define IMGFMT_444P10 IMGFMT_444P10_BE |
#define IMGFMT_444P9 IMGFMT_444P9_BE |
#define IMGFMT_422P16 IMGFMT_422P16_BE |
#define IMGFMT_422P14 IMGFMT_422P14_BE |
#define IMGFMT_422P12 IMGFMT_422P12_BE |
#define IMGFMT_422P10 IMGFMT_422P10_BE |
#define IMGFMT_422P9 IMGFMT_422P9_BE |
#define IMGFMT_420P16 IMGFMT_420P16_BE |
#define IMGFMT_420P14 IMGFMT_420P14_BE |
#define IMGFMT_420P12 IMGFMT_420P12_BE |
#define IMGFMT_420P10 IMGFMT_420P10_BE |
#define IMGFMT_420P9 IMGFMT_420P9_BE |
#define IMGFMT_Y16 IMGFMT_Y16_BE |
#define IMGFMT_IS_YUVP16_NE(fmt) IMGFMT_IS_YUVP16_BE(fmt) |
#else |
#define IMGFMT_444P16 IMGFMT_444P16_LE |
#define IMGFMT_444P14 IMGFMT_444P14_LE |
#define IMGFMT_444P12 IMGFMT_444P12_LE |
#define IMGFMT_444P10 IMGFMT_444P10_LE |
#define IMGFMT_444P9 IMGFMT_444P9_LE |
#define IMGFMT_422P16 IMGFMT_422P16_LE |
#define IMGFMT_422P14 IMGFMT_422P14_LE |
#define IMGFMT_422P12 IMGFMT_422P12_LE |
#define IMGFMT_422P10 IMGFMT_422P10_LE |
#define IMGFMT_422P9 IMGFMT_422P9_LE |
#define IMGFMT_420P16 IMGFMT_420P16_LE |
#define IMGFMT_420P14 IMGFMT_420P14_LE |
#define IMGFMT_420P12 IMGFMT_420P12_LE |
#define IMGFMT_420P10 IMGFMT_420P10_LE |
#define IMGFMT_420P9 IMGFMT_420P9_LE |
#define IMGFMT_Y16 IMGFMT_Y16_LE |
#define IMGFMT_IS_YUVP16_NE(fmt) IMGFMT_IS_YUVP16_LE(fmt) |
#endif |
#define IMGFMT_IS_YUVP16_LE(fmt) (((fmt - 0x51000034) & 0xfc0000ff) == 0) |
#define IMGFMT_IS_YUVP16_BE(fmt) (((fmt - 0x34000051) & 0xff0000fc) == 0) |
#define IMGFMT_IS_YUVP16(fmt) (IMGFMT_IS_YUVP16_LE(fmt) || IMGFMT_IS_YUVP16_BE(fmt)) |
/** |
* \brief Find the corresponding full 16 bit format, i.e. IMGFMT_420P10_LE -> IMGFMT_420P16_LE |
* \return normalized format ID or 0 if none exists. |
*/ |
static inline int normalize_yuvp16(int fmt) { |
if (IMGFMT_IS_YUVP16_LE(fmt)) |
return (fmt & 0x00ffffff) | 0x51000000; |
if (IMGFMT_IS_YUVP16_BE(fmt)) |
return (fmt & 0xffffff00) | 0x00000051; |
return 0; |
} |
/* Packed YUV Formats */ |
#define IMGFMT_IUYV 0x56595549 // Interlaced UYVY |
#define IMGFMT_IY41 0x31435949 // Interlaced Y41P |
#define IMGFMT_IYU1 0x31555949 |
#define IMGFMT_IYU2 0x32555949 |
#define IMGFMT_UYVY 0x59565955 |
#define IMGFMT_UYNV 0x564E5955 // Exactly same as UYVY |
#define IMGFMT_cyuv 0x76757963 // upside-down UYVY |
#define IMGFMT_Y422 0x32323459 // Exactly same as UYVY |
#define IMGFMT_YUY2 0x32595559 |
#define IMGFMT_YUNV 0x564E5559 // Exactly same as YUY2 |
#define IMGFMT_YVYU 0x55595659 |
#define IMGFMT_Y41P 0x50313459 |
#define IMGFMT_Y211 0x31313259 |
#define IMGFMT_Y41T 0x54313459 // Y41P, Y lsb = transparency |
#define IMGFMT_Y42T 0x54323459 // UYVY, Y lsb = transparency |
#define IMGFMT_V422 0x32323456 // upside-down UYVY? |
#define IMGFMT_V655 0x35353656 |
#define IMGFMT_CLJR 0x524A4C43 |
#define IMGFMT_YUVP 0x50565559 // 10-bit YUYV |
#define IMGFMT_UYVP 0x50565955 // 10-bit UYVY |
/* Compressed Formats */ |
#define IMGFMT_MPEGPES (('M'<<24)|('P'<<16)|('E'<<8)|('S')) |
#define IMGFMT_MJPEG (('M')|('J'<<8)|('P'<<16)|('G'<<24)) |
/* Formats that are understood by zoran chips, we include |
* non-interlaced, interlaced top-first, interlaced bottom-first */ |
#define IMGFMT_ZRMJPEGNI (('Z'<<24)|('R'<<16)|('N'<<8)|('I')) |
#define IMGFMT_ZRMJPEGIT (('Z'<<24)|('R'<<16)|('I'<<8)|('T')) |
#define IMGFMT_ZRMJPEGIB (('Z'<<24)|('R'<<16)|('I'<<8)|('B')) |
// I think that this code could not be used by any other codec/format |
#define IMGFMT_XVMC 0x1DC70000 |
#define IMGFMT_XVMC_MASK 0xFFFF0000 |
#define IMGFMT_IS_XVMC(fmt) (((fmt)&IMGFMT_XVMC_MASK)==IMGFMT_XVMC) |
//these are chroma420 |
#define IMGFMT_XVMC_MOCO_MPEG2 (IMGFMT_XVMC|0x02) |
#define IMGFMT_XVMC_IDCT_MPEG2 (IMGFMT_XVMC|0x82) |
// VDPAU specific format. |
#define IMGFMT_VDPAU 0x1DC80000 |
#define IMGFMT_VDPAU_MASK 0xFFFF0000 |
#define IMGFMT_IS_VDPAU(fmt) (((fmt)&IMGFMT_VDPAU_MASK)==IMGFMT_VDPAU) |
#define IMGFMT_VDPAU_MPEG1 (IMGFMT_VDPAU|0x01) |
#define IMGFMT_VDPAU_MPEG2 (IMGFMT_VDPAU|0x02) |
#define IMGFMT_VDPAU_H264 (IMGFMT_VDPAU|0x03) |
#define IMGFMT_VDPAU_WMV3 (IMGFMT_VDPAU|0x04) |
#define IMGFMT_VDPAU_VC1 (IMGFMT_VDPAU|0x05) |
#define IMGFMT_VDPAU_MPEG4 (IMGFMT_VDPAU|0x06) |
#define IMGFMT_IS_HWACCEL(fmt) (IMGFMT_IS_VDPAU(fmt) || IMGFMT_IS_XVMC(fmt)) |
typedef struct { |
void* data; |
int size; |
int id; // stream id. usually 0x1E0 |
int timestamp; // pts, 90000 Hz counter based |
} vo_mpegpes_t; |
const char *ff_vo_format_name(int format); |
/** |
* Calculates the scale shifts for the chroma planes for planar YUV |
* |
* \param component_bits bits per component |
* \return bits-per-pixel for format if successful (i.e. format is 3 or 4-planes planar YUV), 0 otherwise |
*/ |
int ff_mp_get_chroma_shift(int format, int *x_shift, int *y_shift, int *component_bits); |
#endif /* MPLAYER_IMG_FORMAT_H */ |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/libvo/fastmemcpy.h |
---|
0,0 → 1,99 |
/* |
* This file is part of MPlayer. |
* |
* MPlayer is free software; you can redistribute it and/or |
* modify it under the terms of the GNU Lesser General Public |
* License as published by the Free Software Foundation; either |
* version 2.1 of the License, or (at your option) any later version. |
* |
* 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 |
* Lesser General Public License for more details. |
* |
* You should have received a copy of the GNU Lesser 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_FASTMEMCPY_H |
#define MPLAYER_FASTMEMCPY_H |
#include <inttypes.h> |
#include <string.h> |
#include <stddef.h> |
void * fast_memcpy(void * to, const void * from, size_t len); |
void * mem2agpcpy(void * to, const void * from, size_t len); |
#if ! defined(CONFIG_FASTMEMCPY) || ! (HAVE_MMX || HAVE_MMX2 || HAVE_AMD3DNOW /* || HAVE_SSE || HAVE_SSE2 */) |
#define mem2agpcpy(a,b,c) memcpy(a,b,c) |
#define fast_memcpy(a,b,c) memcpy(a,b,c) |
#endif |
static inline void * mem2agpcpy_pic(void * dst, const void * src, int bytesPerLine, int height, int dstStride, int srcStride) |
{ |
int i; |
void *retval=dst; |
if(dstStride == srcStride) |
{ |
if (srcStride < 0) { |
src = (const uint8_t*)src + (height-1)*srcStride; |
dst = (uint8_t*)dst + (height-1)*dstStride; |
srcStride = -srcStride; |
} |
mem2agpcpy(dst, src, srcStride*height); |
} |
else |
{ |
for(i=0; i<height; i++) |
{ |
mem2agpcpy(dst, src, bytesPerLine); |
src = (const uint8_t*)src + srcStride; |
dst = (uint8_t*)dst + dstStride; |
} |
} |
return retval; |
} |
#define memcpy_pic(d, s, b, h, ds, ss) memcpy_pic2(d, s, b, h, ds, ss, 0) |
#define my_memcpy_pic(d, s, b, h, ds, ss) memcpy_pic2(d, s, b, h, ds, ss, 1) |
/** |
* \param limit2width always skip data between end of line and start of next |
* instead of copying the full block when strides are the same |
*/ |
static inline void * memcpy_pic2(void * dst, const void * src, |
int bytesPerLine, int height, |
int dstStride, int srcStride, int limit2width) |
{ |
int i; |
void *retval=dst; |
if(!limit2width && dstStride == srcStride) |
{ |
if (srcStride < 0) { |
src = (const uint8_t*)src + (height-1)*srcStride; |
dst = (uint8_t*)dst + (height-1)*dstStride; |
srcStride = -srcStride; |
} |
fast_memcpy(dst, src, srcStride*height); |
} |
else |
{ |
for(i=0; i<height; i++) |
{ |
fast_memcpy(dst, src, bytesPerLine); |
src = (const uint8_t*)src + srcStride; |
dst = (uint8_t*)dst + dstStride; |
} |
} |
return retval; |
} |
#endif /* MPLAYER_FASTMEMCPY_H */ |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/libvo/video_out.h |
---|
0,0 → 1,281 |
/* |
* Copyright (C) Aaron Holtzman - Aug 1999 |
* Strongly modified, most parts rewritten: A'rpi/ESP-team - 2000-2001 |
* (C) MPlayer developers |
* |
* 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_VIDEO_OUT_H |
#define MPLAYER_VIDEO_OUT_H |
#include <inttypes.h> |
#include <stdarg.h> |
//#include "sub/font_load.h" |
#include "../img_format.h" |
//#include "vidix/vidix.h" |
#define VO_EVENT_EXPOSE 1 |
#define VO_EVENT_RESIZE 2 |
#define VO_EVENT_KEYPRESS 4 |
#define VO_EVENT_REINIT 8 |
#define VO_EVENT_MOVE 16 |
/* Obsolete: VOCTRL_QUERY_VAA 1 */ |
/* does the device support the required format */ |
#define VOCTRL_QUERY_FORMAT 2 |
/* signal a device reset seek */ |
#define VOCTRL_RESET 3 |
/* true if vo driver can use GUI created windows */ |
#define VOCTRL_GUISUPPORT 4 |
#define VOCTRL_GUI_NOWINDOW 19 |
/* used to switch to fullscreen */ |
#define VOCTRL_FULLSCREEN 5 |
/* signal a device pause */ |
#define VOCTRL_PAUSE 7 |
/* start/resume playback */ |
#define VOCTRL_RESUME 8 |
/* libmpcodecs direct rendering: */ |
#define VOCTRL_GET_IMAGE 9 |
#define VOCTRL_DRAW_IMAGE 13 |
#define VOCTRL_SET_SPU_PALETTE 14 |
/* decoding ahead: */ |
#define VOCTRL_GET_NUM_FRAMES 10 |
#define VOCTRL_GET_FRAME_NUM 11 |
#define VOCTRL_SET_FRAME_NUM 12 |
#define VOCTRL_GET_PANSCAN 15 |
#define VOCTRL_SET_PANSCAN 16 |
/* equalizer controls */ |
#define VOCTRL_SET_EQUALIZER 17 |
#define VOCTRL_GET_EQUALIZER 18 |
//#define VOCTRL_GUI_NOWINDOW 19 |
/* Frame duplication */ |
#define VOCTRL_DUPLICATE_FRAME 20 |
// ... 21 |
#define VOCTRL_START_SLICE 21 |
#define VOCTRL_ONTOP 25 |
#define VOCTRL_ROOTWIN 26 |
#define VOCTRL_BORDER 27 |
#define VOCTRL_DRAW_EOSD 28 |
#define VOCTRL_GET_EOSD_RES 29 |
#define VOCTRL_SET_DEINTERLACE 30 |
#define VOCTRL_GET_DEINTERLACE 31 |
#define VOCTRL_UPDATE_SCREENINFO 32 |
// Vo can be used by xover |
#define VOCTRL_XOVERLAY_SUPPORT 22 |
#define VOCTRL_XOVERLAY_SET_COLORKEY 24 |
typedef struct { |
uint32_t x11; // The raw x11 color |
uint16_t r,g,b; |
} mp_colorkey_t; |
#define VOCTRL_XOVERLAY_SET_WIN 23 |
typedef struct { |
int x,y; |
int w,h; |
} mp_win_t; |
#define VO_TRUE 1 |
#define VO_FALSE 0 |
#define VO_ERROR -1 |
#define VO_NOTAVAIL -2 |
#define VO_NOTIMPL -3 |
#define VOFLAG_FULLSCREEN 0x01 |
#define VOFLAG_MODESWITCHING 0x02 |
#define VOFLAG_SWSCALE 0x04 |
#define VOFLAG_FLIPPING 0x08 |
#define VOFLAG_HIDDEN 0x10 //< Use to create a hidden window |
#define VOFLAG_STEREO 0x20 //< Use to create a stereo-capable window |
#define VOFLAG_XOVERLAY_SUB_VO 0x10000 |
typedef struct vo_info_s |
{ |
/* driver name ("Matrox Millennium G200/G400" */ |
const char *name; |
/* short name (for config strings) ("mga") */ |
const char *short_name; |
/* author ("Aaron Holtzman <aholtzma@ess.engr.uvic.ca>") */ |
const char *author; |
/* any additional comments */ |
const char *comment; |
} vo_info_t; |
typedef struct vo_functions_s |
{ |
const vo_info_t *info; |
/* |
* Preinitializes driver (real INITIALIZATION) |
* arg - currently it's vo_subdevice |
* returns: zero on successful initialization, non-zero on error. |
*/ |
int (*preinit)(const char *arg); |
/* |
* Initialize (means CONFIGURE) the display driver. |
* params: |
* width,height: image source size |
* d_width,d_height: size of the requested window size, just a hint |
* fullscreen: flag, 0=windowd 1=fullscreen, just a hint |
* title: window title, if available |
* format: fourcc of pixel format |
* returns : zero on successful initialization, non-zero on error. |
*/ |
int (*config)(uint32_t width, uint32_t height, uint32_t d_width, |
uint32_t d_height, uint32_t fullscreen, char *title, |
uint32_t format); |
/* |
* Control interface |
*/ |
int (*control)(uint32_t request, void *data, ...); |
/* |
* Display a new RGB/BGR frame of the video to the screen. |
* params: |
* src[0] - pointer to the image |
*/ |
int (*draw_frame)(uint8_t *src[]); |
/* |
* Draw a planar YUV slice to the buffer: |
* params: |
* src[3] = source image planes (Y,U,V) |
* stride[3] = source image planes line widths (in bytes) |
* w,h = width*height of area to be copied (in Y pixels) |
* x,y = position at the destination image (in Y pixels) |
*/ |
int (*draw_slice)(uint8_t *src[], int stride[], int w,int h, int x,int y); |
/* |
* Draws OSD to the screen buffer |
*/ |
void (*draw_osd)(void); |
/* |
* Blit/Flip buffer to the screen. Must be called after each frame! |
*/ |
void (*flip_page)(void); |
/* |
* This func is called after every frames to handle keyboard and |
* other events. It's called in PAUSE mode too! |
*/ |
void (*check_events)(void); |
/* |
* Closes driver. Should restore the original state of the system. |
*/ |
void (*uninit)(void); |
} vo_functions_t; |
const vo_functions_t* init_best_video_out(char** vo_list); |
int config_video_out(const vo_functions_t *vo, uint32_t width, uint32_t height, |
uint32_t d_width, uint32_t d_height, uint32_t flags, |
char *title, uint32_t format); |
void list_video_out(void); |
// NULL terminated array of all drivers |
extern const vo_functions_t* const video_out_drivers[]; |
extern int vo_flags; |
extern int vo_config_count; |
extern int xinerama_screen; |
extern int xinerama_x; |
extern int xinerama_y; |
// correct resolution/bpp on screen: (should be autodetected by vo_init()) |
extern int vo_depthonscreen; |
extern int vo_screenwidth; |
extern int vo_screenheight; |
// requested resolution/bpp: (-x -y -bpp options) |
extern int vo_dx; |
extern int vo_dy; |
extern int vo_dwidth; |
extern int vo_dheight; |
extern int vo_dbpp; |
extern int vo_grabpointer; |
extern int vo_doublebuffering; |
extern int vo_directrendering; |
extern int vo_vsync; |
extern int vo_fsmode; |
extern float vo_panscan; |
extern int vo_adapter_num; |
extern int vo_refresh_rate; |
extern int vo_keepaspect; |
extern int vo_rootwin; |
extern int vo_ontop; |
extern int vo_border; |
extern int vo_gamma_gamma; |
extern int vo_gamma_brightness; |
extern int vo_gamma_saturation; |
extern int vo_gamma_contrast; |
extern int vo_gamma_hue; |
extern int vo_gamma_red_intensity; |
extern int vo_gamma_green_intensity; |
extern int vo_gamma_blue_intensity; |
extern int vo_nomouse_input; |
extern int enable_mouse_movements; |
extern int vo_pts; |
extern float vo_fps; |
extern char *vo_subdevice; |
extern int vo_colorkey; |
extern char *vo_winname; |
extern char *vo_wintitle; |
extern int64_t WinID; |
typedef struct { |
float min; |
float max; |
} range_t; |
float range_max(range_t *r); |
int in_range(range_t *r, float f); |
range_t *str2range(char *s); |
extern char *monitor_hfreq_str; |
extern char *monitor_vfreq_str; |
extern char *monitor_dotclock_str; |
struct mp_keymap { |
int from; |
int to; |
}; |
int lookup_keymap_table(const struct mp_keymap *map, int key); |
struct vo_rect { |
int left, right, top, bottom, width, height; |
}; |
void calc_src_dst_rects(int src_width, int src_height, struct vo_rect *src, struct vo_rect *dst, |
struct vo_rect *borders, const struct vo_rect *crop); |
void vo_mouse_movement(int posx, int posy); |
#endif /* MPLAYER_VIDEO_OUT_H */ |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/mp_image.c |
---|
0,0 → 1,253 |
/* |
* 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 "config.h" |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#if HAVE_MALLOC_H |
#include <malloc.h> |
#endif |
#include "img_format.h" |
#include "mp_image.h" |
#include "libvo/fastmemcpy.h" |
//#include "libavutil/mem.h" |
#include "libavutil/imgutils.h" |
void ff_mp_image_alloc_planes(mp_image_t *mpi) { |
uint32_t temp[256]; |
if (avpriv_set_systematic_pal2(temp, ff_mp2ff_pix_fmt(mpi->imgfmt)) >= 0) |
mpi->flags |= MP_IMGFLAG_RGB_PALETTE; |
// IF09 - allocate space for 4. plane delta info - unused |
if (mpi->imgfmt == IMGFMT_IF09) { |
mpi->planes[0]=av_malloc(mpi->bpp*mpi->width*(mpi->height+2)/8+ |
mpi->chroma_width*mpi->chroma_height); |
} else |
mpi->planes[0]=av_malloc(mpi->bpp*mpi->width*(mpi->height+2)/8); |
if (mpi->flags&MP_IMGFLAG_PLANAR) { |
int bpp = IMGFMT_IS_YUVP16(mpi->imgfmt)? 2 : 1; |
// YV12/I420/YVU9/IF09. feel free to add other planar formats here... |
mpi->stride[0]=mpi->stride[3]=bpp*mpi->width; |
if(mpi->num_planes > 2){ |
mpi->stride[1]=mpi->stride[2]=bpp*mpi->chroma_width; |
if(mpi->flags&MP_IMGFLAG_SWAPPED){ |
// I420/IYUV (Y,U,V) |
mpi->planes[1]=mpi->planes[0]+mpi->stride[0]*mpi->height; |
mpi->planes[2]=mpi->planes[1]+mpi->stride[1]*mpi->chroma_height; |
if (mpi->num_planes > 3) |
mpi->planes[3]=mpi->planes[2]+mpi->stride[2]*mpi->chroma_height; |
} else { |
// YV12,YVU9,IF09 (Y,V,U) |
mpi->planes[2]=mpi->planes[0]+mpi->stride[0]*mpi->height; |
mpi->planes[1]=mpi->planes[2]+mpi->stride[1]*mpi->chroma_height; |
if (mpi->num_planes > 3) |
mpi->planes[3]=mpi->planes[1]+mpi->stride[1]*mpi->chroma_height; |
} |
} else { |
// NV12/NV21 |
mpi->stride[1]=mpi->chroma_width; |
mpi->planes[1]=mpi->planes[0]+mpi->stride[0]*mpi->height; |
} |
} else { |
mpi->stride[0]=mpi->width*mpi->bpp/8; |
if (mpi->flags & MP_IMGFLAG_RGB_PALETTE) { |
mpi->planes[1] = av_malloc(1024); |
memcpy(mpi->planes[1], temp, 1024); |
} |
} |
mpi->flags|=MP_IMGFLAG_ALLOCATED; |
} |
mp_image_t* ff_alloc_mpi(int w, int h, unsigned long int fmt) { |
mp_image_t* mpi = ff_new_mp_image(w,h); |
ff_mp_image_setfmt(mpi,fmt); |
ff_mp_image_alloc_planes(mpi); |
return mpi; |
} |
void ff_copy_mpi(mp_image_t *dmpi, mp_image_t *mpi) { |
if(mpi->flags&MP_IMGFLAG_PLANAR){ |
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->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]); |
} else { |
memcpy_pic(dmpi->planes[0],mpi->planes[0], |
mpi->w*(dmpi->bpp/8), mpi->h, |
dmpi->stride[0],mpi->stride[0]); |
} |
} |
void ff_mp_image_setfmt(mp_image_t* mpi,unsigned int out_fmt){ |
mpi->flags&=~(MP_IMGFLAG_PLANAR|MP_IMGFLAG_YUV|MP_IMGFLAG_SWAPPED); |
mpi->imgfmt=out_fmt; |
// compressed formats |
if(out_fmt == IMGFMT_MPEGPES || |
out_fmt == IMGFMT_ZRMJPEGNI || out_fmt == IMGFMT_ZRMJPEGIT || out_fmt == IMGFMT_ZRMJPEGIB || |
IMGFMT_IS_HWACCEL(out_fmt)){ |
mpi->bpp=0; |
return; |
} |
mpi->num_planes=1; |
if (IMGFMT_IS_RGB(out_fmt)) { |
if (IMGFMT_RGB_DEPTH(out_fmt) < 8 && !(out_fmt&128)) |
mpi->bpp = IMGFMT_RGB_DEPTH(out_fmt); |
else |
mpi->bpp=(IMGFMT_RGB_DEPTH(out_fmt)+7)&(~7); |
return; |
} |
if (IMGFMT_IS_BGR(out_fmt)) { |
if (IMGFMT_BGR_DEPTH(out_fmt) < 8 && !(out_fmt&128)) |
mpi->bpp = IMGFMT_BGR_DEPTH(out_fmt); |
else |
mpi->bpp=(IMGFMT_BGR_DEPTH(out_fmt)+7)&(~7); |
mpi->flags|=MP_IMGFLAG_SWAPPED; |
return; |
} |
mpi->num_planes=3; |
if (out_fmt == IMGFMT_GBR24P) { |
mpi->bpp=24; |
mpi->flags|=MP_IMGFLAG_PLANAR; |
return; |
} else if (out_fmt == IMGFMT_GBR12P) { |
mpi->bpp=36; |
mpi->flags|=MP_IMGFLAG_PLANAR; |
return; |
} else if (out_fmt == IMGFMT_GBR14P) { |
mpi->bpp=42; |
mpi->flags|=MP_IMGFLAG_PLANAR; |
return; |
} |
mpi->flags|=MP_IMGFLAG_YUV; |
if (ff_mp_get_chroma_shift(out_fmt, NULL, NULL, NULL)) { |
mpi->flags|=MP_IMGFLAG_PLANAR; |
mpi->bpp = ff_mp_get_chroma_shift(out_fmt, &mpi->chroma_x_shift, &mpi->chroma_y_shift, NULL); |
mpi->chroma_width = mpi->width >> mpi->chroma_x_shift; |
mpi->chroma_height = mpi->height >> mpi->chroma_y_shift; |
} |
switch(out_fmt){ |
case IMGFMT_I420: |
case IMGFMT_IYUV: |
mpi->flags|=MP_IMGFLAG_SWAPPED; |
case IMGFMT_YV12: |
return; |
case IMGFMT_420A: |
case IMGFMT_422A: |
case IMGFMT_444A: |
case IMGFMT_IF09: |
mpi->num_planes=4; |
case IMGFMT_YVU9: |
case IMGFMT_444P: |
case IMGFMT_422P: |
case IMGFMT_411P: |
case IMGFMT_440P: |
case IMGFMT_444P16_LE: |
case IMGFMT_444P16_BE: |
case IMGFMT_444P14_LE: |
case IMGFMT_444P14_BE: |
case IMGFMT_444P12_LE: |
case IMGFMT_444P12_BE: |
case IMGFMT_444P10_LE: |
case IMGFMT_444P10_BE: |
case IMGFMT_444P9_LE: |
case IMGFMT_444P9_BE: |
case IMGFMT_422P16_LE: |
case IMGFMT_422P16_BE: |
case IMGFMT_422P14_LE: |
case IMGFMT_422P14_BE: |
case IMGFMT_422P12_LE: |
case IMGFMT_422P12_BE: |
case IMGFMT_422P10_LE: |
case IMGFMT_422P10_BE: |
case IMGFMT_422P9_LE: |
case IMGFMT_422P9_BE: |
case IMGFMT_420P16_LE: |
case IMGFMT_420P16_BE: |
case IMGFMT_420P14_LE: |
case IMGFMT_420P14_BE: |
case IMGFMT_420P12_LE: |
case IMGFMT_420P12_BE: |
case IMGFMT_420P10_LE: |
case IMGFMT_420P10_BE: |
case IMGFMT_420P9_LE: |
case IMGFMT_420P9_BE: |
return; |
case IMGFMT_Y16_LE: |
case IMGFMT_Y16_BE: |
mpi->bpp=16; |
case IMGFMT_Y800: |
case IMGFMT_Y8: |
/* they're planar ones, but for easier handling use them as packed */ |
mpi->flags&=~MP_IMGFLAG_PLANAR; |
mpi->num_planes=1; |
return; |
case IMGFMT_Y8A: |
mpi->num_planes=2; |
return; |
case IMGFMT_UYVY: |
mpi->flags|=MP_IMGFLAG_SWAPPED; |
case IMGFMT_YUY2: |
mpi->chroma_x_shift = 1; |
mpi->bpp=16; |
mpi->num_planes=1; |
return; |
case IMGFMT_NV12: |
mpi->flags|=MP_IMGFLAG_SWAPPED; |
case IMGFMT_NV21: |
mpi->flags|=MP_IMGFLAG_PLANAR; |
mpi->bpp=12; |
mpi->num_planes=2; |
mpi->chroma_width=(mpi->width>>0); |
mpi->chroma_height=(mpi->height>>1); |
mpi->chroma_x_shift=0; |
mpi->chroma_y_shift=1; |
return; |
} |
ff_mp_msg(MSGT_DECVIDEO,MSGL_WARN,"mp_image: unknown out_fmt: 0x%X\n",out_fmt); |
mpi->bpp=0; |
} |
mp_image_t* ff_new_mp_image(int w,int h){ |
mp_image_t* mpi = malloc(sizeof(mp_image_t)); |
if(!mpi) return NULL; // error! |
memset(mpi,0,sizeof(mp_image_t)); |
mpi->width=mpi->w=w; |
mpi->height=mpi->h=h; |
return mpi; |
} |
void ff_free_mp_image(mp_image_t* mpi){ |
if(!mpi) return; |
if(mpi->flags&MP_IMGFLAG_ALLOCATED){ |
/* becouse we allocate the whole image in once */ |
av_free(mpi->planes[0]); |
if (mpi->flags & MP_IMGFLAG_RGB_PALETTE) |
av_free(mpi->planes[1]); |
} |
free(mpi); |
} |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/mp_image.h |
---|
0,0 → 1,159 |
/* |
* 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_MP_IMAGE_H |
#define MPLAYER_MP_IMAGE_H |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
#undef printf //FIXME |
#undef fprintf //FIXME |
#include "mp_msg.h" |
#include "libavutil/avutil.h" |
#include "libavutil/avassert.h" |
#undef realloc |
#undef malloc |
#undef free |
#undef rand |
#undef srand |
#undef printf |
#undef strncpy |
#define ASMALIGN(ZEROBITS) ".p2align " #ZEROBITS "\n\t" |
#define CODEC_FLAG2_MEMC_ONLY 0x00001000 ///< Only do ME/MC (I frames -> ref, P frame -> ME+MC). |
enum AVPixelFormat ff_mp2ff_pix_fmt(int mp); |
//--------- codec's requirements (filled by the codec/vf) --------- |
//--- buffer content restrictions: |
// set if buffer content shouldn't be modified: |
#define MP_IMGFLAG_PRESERVE 0x01 |
// set if buffer content will be READ. |
// This can be e.g. for next frame's MC: (I/P mpeg frames) - |
// then in combination with MP_IMGFLAG_PRESERVE - or it |
// can be because a video filter or codec will read a significant |
// amount of data while processing that frame (e.g. blending something |
// onto the frame, MV based intra prediction). |
// A frame marked like this should not be placed in to uncachable |
// video RAM for example. |
#define MP_IMGFLAG_READABLE 0x02 |
//--- buffer width/stride/plane restrictions: (used for direct rendering) |
// stride _have_to_ be aligned to MB boundary: [for DR restrictions] |
#define MP_IMGFLAG_ACCEPT_ALIGNED_STRIDE 0x4 |
// stride should be aligned to MB boundary: [for buffer allocation] |
#define MP_IMGFLAG_PREFER_ALIGNED_STRIDE 0x8 |
// codec accept any stride (>=width): |
#define MP_IMGFLAG_ACCEPT_STRIDE 0x10 |
// codec accept any width (width*bpp=stride -> stride%bpp==0) (>=width): |
#define MP_IMGFLAG_ACCEPT_WIDTH 0x20 |
//--- for planar formats only: |
// uses only stride[0], and stride[1]=stride[2]=stride[0]>>mpi->chroma_x_shift |
#define MP_IMGFLAG_COMMON_STRIDE 0x40 |
// uses only planes[0], and calculates planes[1,2] from width,height,imgfmt |
#define MP_IMGFLAG_COMMON_PLANE 0x80 |
#define MP_IMGFLAGMASK_RESTRICTIONS 0xFF |
//--------- color info (filled by ff_mp_image_setfmt() ) ----------- |
// set if number of planes > 1 |
#define MP_IMGFLAG_PLANAR 0x100 |
// set if it's YUV colorspace |
#define MP_IMGFLAG_YUV 0x200 |
// set if it's swapped (BGR or YVU) plane/byteorder |
#define MP_IMGFLAG_SWAPPED 0x400 |
// set if you want memory for palette allocated and managed by ff_vf_get_image etc. |
#define MP_IMGFLAG_RGB_PALETTE 0x800 |
#define MP_IMGFLAGMASK_COLORS 0xF00 |
// codec uses drawing/rendering callbacks (draw_slice()-like thing, DR method 2) |
// [the codec will set this flag if it supports callbacks, and the vo _may_ |
// clear it in get_image() if draw_slice() not implemented] |
#define MP_IMGFLAG_DRAW_CALLBACK 0x1000 |
// set if it's in video buffer/memory: [set by vo/vf's get_image() !!!] |
#define MP_IMGFLAG_DIRECT 0x2000 |
// set if buffer is allocated (used in destination images): |
#define MP_IMGFLAG_ALLOCATED 0x4000 |
// buffer type was printed (do NOT set this flag - it's for INTERNAL USE!!!) |
#define MP_IMGFLAG_TYPE_DISPLAYED 0x8000 |
// codec doesn't support any form of direct rendering - it has own buffer |
// allocation. so we just export its buffer pointers: |
#define MP_IMGTYPE_EXPORT 0 |
// codec requires a static WO buffer, but it does only partial updates later: |
#define MP_IMGTYPE_STATIC 1 |
// codec just needs some WO memory, where it writes/copies the whole frame to: |
#define MP_IMGTYPE_TEMP 2 |
// I+P type, requires 2+ independent static R/W buffers |
#define MP_IMGTYPE_IP 3 |
// I+P+B type, requires 2+ independent static R/W and 1+ temp WO buffers |
#define MP_IMGTYPE_IPB 4 |
// Upper 16 bits give desired buffer number, -1 means get next available |
#define MP_IMGTYPE_NUMBERED 5 |
// Doesn't need any buffer, incomplete image (probably a first field only) |
// we need this type to be able to differentiate between half frames and |
// all other cases |
#define MP_IMGTYPE_INCOMPLETE 6 |
#define MP_MAX_PLANES 4 |
#define MP_IMGFIELD_ORDERED 0x01 |
#define MP_IMGFIELD_TOP_FIRST 0x02 |
#define MP_IMGFIELD_REPEAT_FIRST 0x04 |
#define MP_IMGFIELD_TOP 0x08 |
#define MP_IMGFIELD_BOTTOM 0x10 |
#define MP_IMGFIELD_INTERLACED 0x20 |
typedef struct mp_image { |
unsigned int flags; |
unsigned char type; |
int number; |
unsigned char bpp; // bits/pixel. NOT depth! for RGB it will be n*8 |
unsigned int imgfmt; |
int width,height; // stored dimensions |
int x,y,w,h; // visible dimensions |
unsigned char* planes[MP_MAX_PLANES]; |
int stride[MP_MAX_PLANES]; |
char * qscale; |
int qstride; |
int pict_type; // 0->unknown, 1->I, 2->P, 3->B |
int fields; |
int qscale_type; // 0->mpeg1/4/h263, 1->mpeg2 |
int num_planes; |
/* these are only used by planar formats Y,U(Cb),V(Cr) */ |
int chroma_width; |
int chroma_height; |
int chroma_x_shift; // horizontal |
int chroma_y_shift; // vertical |
int usage_count; |
/* for private use by filter or vo driver (to store buffer id or dmpi) */ |
void* priv; |
} mp_image_t; |
void ff_mp_image_setfmt(mp_image_t* mpi,unsigned int out_fmt); |
mp_image_t* ff_new_mp_image(int w,int h); |
void ff_free_mp_image(mp_image_t* mpi); |
mp_image_t* ff_alloc_mpi(int w, int h, unsigned long int fmt); |
void ff_mp_image_alloc_planes(mp_image_t *mpi); |
void ff_copy_mpi(mp_image_t *dmpi, mp_image_t *mpi); |
#endif /* MPLAYER_MP_IMAGE_H */ |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/mp_msg.h |
---|
0,0 → 1,166 |
/* |
* 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_MP_MSG_H |
#define MPLAYER_MP_MSG_H |
#include <stdarg.h> |
// defined in mplayer.c and mencoder.c |
extern int verbose; |
// verbosity elevel: |
/* Only messages level MSGL_FATAL-MSGL_STATUS should be translated, |
* messages level MSGL_V and above should not be translated. */ |
#define MSGL_FATAL 0 // will exit/abort |
#define MSGL_ERR 1 // continues |
#define MSGL_WARN 2 // only warning |
#define MSGL_HINT 3 // short help message |
#define MSGL_INFO 4 // -quiet |
#define MSGL_STATUS 5 // v=0 |
#define MSGL_V 6 // v=1 |
#define MSGL_DBG2 7 // v=2 |
#define MSGL_DBG3 8 // v=3 |
#define MSGL_DBG4 9 // v=4 |
#define MSGL_DBG5 10 // v=5 |
#define MSGL_FIXME 1 // for conversions from printf where the appropriate MSGL is not known; set equal to ERR for obtrusiveness |
#define MSGT_FIXME 0 // for conversions from printf where the appropriate MSGT is not known; set equal to GLOBAL for obtrusiveness |
// code/module: |
#define MSGT_GLOBAL 0 // common player stuff errors |
#define MSGT_CPLAYER 1 // console player (mplayer.c) |
#define MSGT_GPLAYER 2 // gui player |
#define MSGT_VO 3 // libvo |
#define MSGT_AO 4 // libao |
#define MSGT_DEMUXER 5 // demuxer.c (general stuff) |
#define MSGT_DS 6 // demux stream (add/read packet etc) |
#define MSGT_DEMUX 7 // fileformat-specific stuff (demux_*.c) |
#define MSGT_HEADER 8 // fileformat-specific header (*header.c) |
#define MSGT_AVSYNC 9 // mplayer.c timer stuff |
#define MSGT_AUTOQ 10 // mplayer.c auto-quality stuff |
#define MSGT_CFGPARSER 11 // cfgparser.c |
#define MSGT_DECAUDIO 12 // av decoder |
#define MSGT_DECVIDEO 13 |
#define MSGT_SEEK 14 // seeking code |
#define MSGT_WIN32 15 // win32 dll stuff |
#define MSGT_OPEN 16 // open.c (stream opening) |
#define MSGT_DVD 17 // open.c (DVD init/read/seek) |
#define MSGT_PARSEES 18 // parse_es.c (mpeg stream parser) |
#define MSGT_LIRC 19 // lirc_mp.c and input lirc driver |
#define MSGT_STREAM 20 // stream.c |
#define MSGT_CACHE 21 // cache2.c |
#define MSGT_MENCODER 22 |
#define MSGT_XACODEC 23 // XAnim codecs |
#define MSGT_TV 24 // TV input subsystem |
#define MSGT_OSDEP 25 // OS-dependent parts |
#define MSGT_SPUDEC 26 // spudec.c |
#define MSGT_PLAYTREE 27 // Playtree handeling (playtree.c, playtreeparser.c) |
#define MSGT_INPUT 28 |
#define MSGT_VFILTER 29 |
#define MSGT_OSD 30 |
#define MSGT_NETWORK 31 |
#define MSGT_CPUDETECT 32 |
#define MSGT_CODECCFG 33 |
#define MSGT_SWS 34 |
#define MSGT_VOBSUB 35 |
#define MSGT_SUBREADER 36 |
#define MSGT_AFILTER 37 // Audio filter messages |
#define MSGT_NETST 38 // Netstream |
#define MSGT_MUXER 39 // muxer layer |
#define MSGT_OSD_MENU 40 |
#define MSGT_IDENTIFY 41 // -identify output |
#define MSGT_RADIO 42 |
#define MSGT_ASS 43 // libass messages |
#define MSGT_LOADER 44 // dll loader messages |
#define MSGT_STATUSLINE 45 // playback/encoding status line |
#define MSGT_TELETEXT 46 // Teletext decoder |
#define MSGT_MAX 64 |
extern char *ff_mp_msg_charset; |
extern int ff_mp_msg_color; |
extern int ff_mp_msg_module; |
extern int ff_mp_msg_levels[MSGT_MAX]; |
extern int ff_mp_msg_level_all; |
void ff_mp_msg_init(void); |
int ff_mp_msg_test(int mod, int lev); |
#include "config.h" |
void ff_mp_msg_va(int mod, int lev, const char *format, va_list va); |
#ifdef __GNUC__ |
void ff_mp_msg(int mod, int lev, const char *format, ... ) __attribute__ ((format (printf, 3, 4))); |
# ifdef MP_DEBUG |
# define mp_dbg(mod,lev, args... ) ff_mp_msg(mod, lev, ## args ) |
# else |
// only useful for developers, disable but check syntax |
# define mp_dbg(mod,lev, args... ) do { if (0) ff_mp_msg(mod, lev, ## args ); } while (0) |
# endif |
#else // not GNU C |
void ff_mp_msg(int mod, int lev, const char *format, ... ); |
# ifdef MP_DEBUG |
# define mp_dbg(mod,lev, ... ) ff_mp_msg(mod, lev, __VA_ARGS__) |
# else |
// only useful for developers, disable but check syntax |
# define mp_dbg(mod,lev, ... ) do { if (0) ff_mp_msg(mod, lev, __VA_ARGS__); } while (0) |
# endif |
#endif /* __GNUC__ */ |
const char* ff_filename_recode(const char* filename); |
#endif /* MPLAYER_MP_MSG_H */ |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/mpc_info.h |
---|
0,0 → 1,43 |
/* |
* 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_MPC_INFO_H |
#define MPLAYER_MPC_INFO_H |
typedef struct mp_codec_info_s |
{ |
/* codec long name ("Autodesk FLI/FLC Animation decoder" */ |
const char *name; |
/* short name (same as driver name in codecs.conf) ("dshow") */ |
const char *short_name; |
/* interface author/maintainer */ |
const char *maintainer; |
/* codec author ("Aaron Holtzman <aholtzma@ess.engr.uvic.ca>") */ |
const char *author; |
/* any additional comments */ |
const char *comment; |
} mp_codec_info_t; |
#define CONTROL_OK 1 |
#define CONTROL_TRUE 1 |
#define CONTROL_FALSE 0 |
#define CONTROL_UNKNOWN -1 |
#define CONTROL_ERROR -2 |
#define CONTROL_NA -3 |
#endif /* MPLAYER_MPC_INFO_H */ |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/vf.h |
---|
0,0 → 1,169 |
/* |
* 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_VF_H |
#define MPLAYER_VF_H |
//#include "m_option.h" |
#include "mp_image.h" |
//extern m_obj_settings_t* vf_settings; |
//extern const m_obj_list_t vf_obj_list; |
struct vf_instance; |
struct vf_priv_s; |
typedef struct vf_info_s { |
const char *info; |
const char *name; |
const char *author; |
const char *comment; |
int (*vf_open)(struct vf_instance *vf,char* args); |
// Ptr to a struct dscribing the options |
const void* opts; |
} vf_info_t; |
#define NUM_NUMBERED_MPI 50 |
typedef struct vf_image_context_s { |
mp_image_t* static_images[2]; |
mp_image_t* temp_images[1]; |
mp_image_t* export_images[1]; |
mp_image_t* numbered_images[NUM_NUMBERED_MPI]; |
int static_idx; |
} vf_image_context_t; |
typedef struct vf_format_context_t { |
int have_configured; |
int orig_width, orig_height, orig_fmt; |
} vf_format_context_t; |
typedef struct vf_instance { |
const vf_info_t* info; |
// funcs: |
int (*config)(struct vf_instance *vf, |
int width, int height, int d_width, int d_height, |
unsigned int flags, unsigned int outfmt); |
int (*control)(struct vf_instance *vf, |
int request, void* data); |
int (*query_format)(struct vf_instance *vf, |
unsigned int fmt); |
void (*get_image)(struct vf_instance *vf, |
mp_image_t *mpi); |
int (*put_image)(struct vf_instance *vf, |
mp_image_t *mpi, double pts); |
void (*start_slice)(struct vf_instance *vf, |
mp_image_t *mpi); |
void (*draw_slice)(struct vf_instance *vf, |
unsigned char** src, int* stride, int w,int h, int x, int y); |
void (*uninit)(struct vf_instance *vf); |
int (*continue_buffered_image)(struct vf_instance *vf); |
// caps: |
unsigned int default_caps; // used by default query_format() |
unsigned int default_reqs; // used by default config() |
// data: |
int w, h; |
vf_image_context_t imgctx; |
vf_format_context_t fmt; |
struct vf_instance *next; |
mp_image_t *dmpi; |
struct vf_priv_s* priv; |
} vf_instance_t; |
// control codes: |
#include "mpc_info.h" |
typedef struct vf_seteq_s |
{ |
const char *item; |
int value; |
} vf_equalizer_t; |
#define VFCTRL_QUERY_MAX_PP_LEVEL 4 /* test for postprocessing support (max level) */ |
#define VFCTRL_SET_PP_LEVEL 5 /* set postprocessing level */ |
#define VFCTRL_SET_EQUALIZER 6 /* set color options (brightness,contrast etc) */ |
#define VFCTRL_GET_EQUALIZER 8 /* gset color options (brightness,contrast etc) */ |
#define VFCTRL_DRAW_OSD 7 |
#define VFCTRL_CHANGE_RECTANGLE 9 /* Change the rectangle boundaries */ |
#define VFCTRL_FLIP_PAGE 10 /* Tell the vo to flip pages */ |
#define VFCTRL_DUPLICATE_FRAME 11 /* For encoding - encode zero-change frame */ |
#define VFCTRL_SKIP_NEXT_FRAME 12 /* For encoding - drop the next frame that passes thru */ |
#define VFCTRL_FLUSH_FRAMES 13 /* For encoding - flush delayed frames */ |
#define VFCTRL_SCREENSHOT 14 /* Make a screenshot */ |
#define VFCTRL_INIT_EOSD 15 /* Select EOSD renderer */ |
#define VFCTRL_DRAW_EOSD 16 /* Render EOSD */ |
#define VFCTRL_GET_PTS 17 /* Return last pts value that reached vf_vo*/ |
#define VFCTRL_SET_DEINTERLACE 18 /* Set deinterlacing status */ |
#define VFCTRL_GET_DEINTERLACE 19 /* Get deinterlacing status */ |
#include "vfcap.h" |
//FIXME this should be in a common header, but i dunno which |
#define MP_NOPTS_VALUE (-1LL<<63) //both int64_t and double should be able to represent this exactly |
// functions: |
void ff_vf_mpi_clear(mp_image_t* mpi,int x0,int y0,int w,int h); |
mp_image_t* ff_vf_get_image(vf_instance_t* vf, unsigned int outfmt, int mp_imgtype, int mp_imgflag, int w, int h); |
vf_instance_t* vf_open_plugin(const vf_info_t* const* filter_list, vf_instance_t* next, const char *name, char **args); |
vf_instance_t* vf_open_filter(vf_instance_t* next, const char *name, char **args); |
vf_instance_t* ff_vf_add_before_vo(vf_instance_t **vf, char *name, char **args); |
vf_instance_t* vf_open_encoder(vf_instance_t* next, const char *name, char *args); |
unsigned int ff_vf_match_csp(vf_instance_t** vfp,const unsigned int* list,unsigned int preferred); |
void ff_vf_clone_mpi_attributes(mp_image_t* dst, mp_image_t* src); |
void ff_vf_queue_frame(vf_instance_t *vf, int (*)(vf_instance_t *)); |
int ff_vf_output_queued_frame(vf_instance_t *vf); |
// default wrappers: |
int ff_vf_next_config(struct vf_instance *vf, |
int width, int height, int d_width, int d_height, |
unsigned int flags, unsigned int outfmt); |
int ff_vf_next_control(struct vf_instance *vf, int request, void* data); |
void ff_vf_extra_flip(struct vf_instance *vf); |
int ff_vf_next_query_format(struct vf_instance *vf, unsigned int fmt); |
int ff_vf_next_put_image(struct vf_instance *vf,mp_image_t *mpi, double pts); |
void ff_vf_next_draw_slice (struct vf_instance *vf, unsigned char** src, int* stride, int w,int h, int x, int y); |
vf_instance_t* ff_append_filters(vf_instance_t* last); |
void ff_vf_uninit_filter(vf_instance_t* vf); |
void ff_vf_uninit_filter_chain(vf_instance_t* vf); |
int ff_vf_config_wrapper(struct vf_instance *vf, |
int width, int height, int d_width, int d_height, |
unsigned int flags, unsigned int outfmt); |
static inline int norm_qscale(int qscale, int type) |
{ |
switch (type) { |
case 0: // MPEG-1 |
return qscale; |
case 1: // MPEG-2 |
return qscale >> 1; |
case 2: // H264 |
return qscale >> 2; |
case 3: // VP56 |
return (63 - qscale + 2) >> 2; |
} |
return qscale; |
} |
#endif /* MPLAYER_VF_H */ |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/vf_eq.c |
---|
0,0 → 1,240 |
/* |
* 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" |
struct vf_priv_s { |
unsigned char *buf; |
int brightness; |
int contrast; |
}; |
#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=ff_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 ff_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 ff_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 ff_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; |
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->brightness, &vf->priv->contrast); |
process = process_C; |
#if HAVE_MMX |
if(ff_gCpuCaps.hasMMX) process = process_MMX; |
#endif |
return 1; |
} |
const vf_info_t ff_vf_info_eq = { |
"soft video equalizer", |
"eq", |
"Richard Felker", |
"", |
vf_open, |
}; |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/vf_eq2.c |
---|
0,0 → 1,519 |
/* |
* Software equalizer (brightness, contrast, gamma, saturation) |
* |
* Hampa Hug <hampa@hampa.ch> (original LUT gamma/contrast/brightness filter) |
* Daniel Moreno <comac@comac.darktech.org> (saturation, R/G/B gamma support) |
* Richard Felker (original MMX contrast/brightness code (vf_eq.c)) |
* Michael Niedermayer <michalni@gmx.at> (LUT16) |
* |
* 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 "config.h" |
#include "mp_msg.h" |
#include "cpudetect.h" |
#include "img_format.h" |
#include "mp_image.h" |
#include "vf.h" |
#define LUT16 |
/* Per channel parameters */ |
typedef struct eq2_param_t { |
unsigned char lut[256]; |
#ifdef LUT16 |
uint16_t lut16[256*256]; |
#endif |
int lut_clean; |
void (*adjust) (struct eq2_param_t *par, unsigned char *dst, unsigned char *src, |
unsigned w, unsigned h, unsigned dstride, unsigned sstride); |
double c; |
double b; |
double g; |
double w; |
} eq2_param_t; |
typedef struct vf_priv_s { |
eq2_param_t param[3]; |
double contrast; |
double brightness; |
double saturation; |
double gamma; |
double gamma_weight; |
double rgamma; |
double ggamma; |
double bgamma; |
unsigned buf_w[3]; |
unsigned buf_h[3]; |
unsigned char *buf[3]; |
} vf_eq2_t; |
static |
void create_lut (eq2_param_t *par) |
{ |
unsigned i; |
double g, v; |
double lw, gw; |
g = par->g; |
gw = par->w; |
lw = 1.0 - gw; |
if ((g < 0.001) || (g > 1000.0)) { |
g = 1.0; |
} |
g = 1.0 / g; |
for (i = 0; i < 256; i++) { |
v = (double) i / 255.0; |
v = par->c * (v - 0.5) + 0.5 + par->b; |
if (v <= 0.0) { |
par->lut[i] = 0; |
} |
else { |
v = v*lw + pow(v, g)*gw; |
if (v >= 1.0) { |
par->lut[i] = 255; |
} |
else { |
par->lut[i] = (unsigned char) (256.0 * v); |
} |
} |
} |
#ifdef LUT16 |
for(i=0; i<256*256; i++){ |
par->lut16[i]= par->lut[i&0xFF] + (par->lut[i>>8]<<8); |
} |
#endif |
par->lut_clean = 1; |
} |
#if HAVE_MMX |
static |
void affine_1d_MMX (eq2_param_t *par, unsigned char *dst, unsigned char *src, |
unsigned w, unsigned h, unsigned dstride, unsigned sstride) |
{ |
unsigned i; |
int contrast, brightness; |
unsigned dstep, sstep; |
int pel; |
short brvec[4]; |
short contvec[4]; |
// printf("\nmmx: src=%p dst=%p w=%d h=%d ds=%d ss=%d\n",src,dst,w,h,dstride,sstride); |
contrast = (int) (par->c * 256 * 16); |
brightness = ((int) (100.0 * par->b + 100.0) * 511) / 200 - 128 - contrast / 32; |
brvec[0] = brvec[1] = brvec[2] = brvec[3] = brightness; |
contvec[0] = contvec[1] = contvec[2] = contvec[3] = contrast; |
sstep = sstride - w; |
dstep = dstride - w; |
while (h-- > 0) { |
__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" (dst) |
: "0" (src), "1" (dst), "r" (w >> 3), "r" (brvec), "r" (contvec) |
: "%eax" |
); |
for (i = w & 7; i > 0; i--) { |
pel = ((*src++ * contrast) >> 12) + brightness; |
if (pel & 768) { |
pel = (-pel) >> 31; |
} |
*dst++ = pel; |
} |
src += sstep; |
dst += dstep; |
} |
__asm__ volatile ( "emms \n\t" ::: "memory" ); |
} |
#endif |
static |
void apply_lut (eq2_param_t *par, unsigned char *dst, unsigned char *src, |
unsigned w, unsigned h, unsigned dstride, unsigned sstride) |
{ |
unsigned i, j, w2; |
unsigned char *lut; |
uint16_t *lut16; |
if (!par->lut_clean) { |
create_lut (par); |
} |
lut = par->lut; |
#ifdef LUT16 |
lut16 = par->lut16; |
w2= (w>>3)<<2; |
for (j = 0; j < h; j++) { |
uint16_t *src16= (uint16_t*)src; |
uint16_t *dst16= (uint16_t*)dst; |
for (i = 0; i < w2; i+=4) { |
dst16[i+0] = lut16[src16[i+0]]; |
dst16[i+1] = lut16[src16[i+1]]; |
dst16[i+2] = lut16[src16[i+2]]; |
dst16[i+3] = lut16[src16[i+3]]; |
} |
i <<= 1; |
#else |
w2= (w>>3)<<3; |
for (j = 0; j < h; j++) { |
for (i = 0; i < w2; i+=8) { |
dst[i+0] = lut[src[i+0]]; |
dst[i+1] = lut[src[i+1]]; |
dst[i+2] = lut[src[i+2]]; |
dst[i+3] = lut[src[i+3]]; |
dst[i+4] = lut[src[i+4]]; |
dst[i+5] = lut[src[i+5]]; |
dst[i+6] = lut[src[i+6]]; |
dst[i+7] = lut[src[i+7]]; |
} |
#endif |
for (; i < w; i++) { |
dst[i] = lut[src[i]]; |
} |
src += sstride; |
dst += dstride; |
} |
} |
static |
int put_image (vf_instance_t *vf, mp_image_t *src, double pts) |
{ |
unsigned i; |
vf_eq2_t *eq2; |
mp_image_t *dst; |
unsigned long img_n,img_c; |
eq2 = vf->priv; |
if ((eq2->buf_w[0] != src->w) || (eq2->buf_h[0] != src->h)) { |
eq2->buf_w[0] = src->w; |
eq2->buf_h[0] = src->h; |
eq2->buf_w[1] = eq2->buf_w[2] = src->w >> src->chroma_x_shift; |
eq2->buf_h[1] = eq2->buf_h[2] = src->h >> src->chroma_y_shift; |
img_n = eq2->buf_w[0]*eq2->buf_h[0]; |
if(src->num_planes>1){ |
img_c = eq2->buf_w[1]*eq2->buf_h[1]; |
eq2->buf[0] = realloc (eq2->buf[0], img_n + 2*img_c); |
eq2->buf[1] = eq2->buf[0] + img_n; |
eq2->buf[2] = eq2->buf[1] + img_c; |
} else |
eq2->buf[0] = realloc (eq2->buf[0], img_n); |
} |
dst = ff_vf_get_image (vf->next, src->imgfmt, MP_IMGTYPE_EXPORT, 0, src->w, src->h); |
for (i = 0; i < ((src->num_planes>1)?3:1); i++) { |
if (eq2->param[i].adjust != NULL) { |
dst->planes[i] = eq2->buf[i]; |
dst->stride[i] = eq2->buf_w[i]; |
eq2->param[i].adjust (&eq2->param[i], dst->planes[i], src->planes[i], |
eq2->buf_w[i], eq2->buf_h[i], dst->stride[i], src->stride[i]); |
} |
else { |
dst->planes[i] = src->planes[i]; |
dst->stride[i] = src->stride[i]; |
} |
} |
return ff_vf_next_put_image (vf, dst, pts); |
} |
static |
void check_values (eq2_param_t *par) |
{ |
/* yuck! floating point comparisons... */ |
if ((par->c == 1.0) && (par->b == 0.0) && (par->g == 1.0)) { |
par->adjust = NULL; |
} |
#if HAVE_MMX |
else if (par->g == 1.0 && ff_gCpuCaps.hasMMX) { |
par->adjust = &affine_1d_MMX; |
} |
#endif |
else { |
par->adjust = &apply_lut; |
} |
} |
static |
void print_values (vf_eq2_t *eq2) |
{ |
ff_mp_msg (MSGT_VFILTER, MSGL_V, "vf_eq2: c=%.2f b=%.2f g=%.4f s=%.2f \n", |
eq2->contrast, eq2->brightness, eq2->gamma, eq2->saturation |
); |
} |
static |
void set_contrast (vf_eq2_t *eq2, double c) |
{ |
eq2->contrast = c; |
eq2->param[0].c = c; |
eq2->param[0].lut_clean = 0; |
check_values (&eq2->param[0]); |
print_values (eq2); |
} |
static |
void set_brightness (vf_eq2_t *eq2, double b) |
{ |
eq2->brightness = b; |
eq2->param[0].b = b; |
eq2->param[0].lut_clean = 0; |
check_values (&eq2->param[0]); |
print_values (eq2); |
} |
static |
void set_gamma (vf_eq2_t *eq2, double g) |
{ |
eq2->gamma = g; |
eq2->param[0].g = eq2->gamma * eq2->ggamma; |
eq2->param[1].g = sqrt (eq2->bgamma / eq2->ggamma); |
eq2->param[2].g = sqrt (eq2->rgamma / eq2->ggamma); |
eq2->param[0].w = eq2->param[1].w = eq2->param[2].w = eq2->gamma_weight; |
eq2->param[0].lut_clean = 0; |
eq2->param[1].lut_clean = 0; |
eq2->param[2].lut_clean = 0; |
check_values (&eq2->param[0]); |
check_values (&eq2->param[1]); |
check_values (&eq2->param[2]); |
print_values (eq2); |
} |
static |
void set_saturation (vf_eq2_t *eq2, double s) |
{ |
eq2->saturation = s; |
eq2->param[1].c = s; |
eq2->param[2].c = s; |
eq2->param[1].lut_clean = 0; |
eq2->param[2].lut_clean = 0; |
check_values (&eq2->param[1]); |
check_values (&eq2->param[2]); |
print_values (eq2); |
} |
static |
int control (vf_instance_t *vf, int request, void *data) |
{ |
vf_equalizer_t *eq; |
switch (request) { |
case VFCTRL_SET_EQUALIZER: |
eq = (vf_equalizer_t *) data; |
if (strcmp (eq->item, "gamma") == 0) { |
set_gamma (vf->priv, exp (log (8.0) * eq->value / 100.0)); |
return CONTROL_TRUE; |
} |
else if (strcmp (eq->item, "contrast") == 0) { |
set_contrast (vf->priv, (1.0 / 100.0) * (eq->value + 100)); |
return CONTROL_TRUE; |
} |
else if (strcmp (eq->item, "brightness") == 0) { |
set_brightness (vf->priv, (1.0 / 100.0) * eq->value); |
return CONTROL_TRUE; |
} |
else if (strcmp (eq->item, "saturation") == 0) { |
set_saturation (vf->priv, (double) (eq->value + 100) / 100.0); |
return CONTROL_TRUE; |
} |
break; |
case VFCTRL_GET_EQUALIZER: |
eq = (vf_equalizer_t *) data; |
if (strcmp (eq->item, "gamma") == 0) { |
eq->value = (int) (100.0 * log (vf->priv->gamma) / log (8.0)); |
return CONTROL_TRUE; |
} |
else if (strcmp (eq->item, "contrast") == 0) { |
eq->value = (int) (100.0 * vf->priv->contrast) - 100; |
return CONTROL_TRUE; |
} |
else if (strcmp (eq->item, "brightness") == 0) { |
eq->value = (int) (100.0 * vf->priv->brightness); |
return CONTROL_TRUE; |
} |
else if (strcmp (eq->item, "saturation") == 0) { |
eq->value = (int) (100.0 * vf->priv->saturation) - 100; |
return CONTROL_TRUE; |
} |
break; |
} |
return ff_vf_next_control (vf, request, data); |
} |
static |
int query_format (vf_instance_t *vf, unsigned fmt) |
{ |
switch (fmt) { |
case IMGFMT_YVU9: |
case IMGFMT_IF09: |
case IMGFMT_YV12: |
case IMGFMT_I420: |
case IMGFMT_IYUV: |
case IMGFMT_Y800: |
case IMGFMT_Y8: |
case IMGFMT_444P: |
case IMGFMT_422P: |
case IMGFMT_411P: |
return ff_vf_next_query_format (vf, fmt); |
} |
return 0; |
} |
static |
void uninit (vf_instance_t *vf) |
{ |
if (vf->priv != NULL) { |
free (vf->priv->buf[0]); |
free (vf->priv); |
} |
} |
static |
int vf_open(vf_instance_t *vf, char *args) |
{ |
unsigned i; |
vf_eq2_t *eq2; |
double par[8]; |
vf->control = control; |
vf->query_format = query_format; |
vf->put_image = put_image; |
vf->uninit = uninit; |
vf->priv = malloc (sizeof (vf_eq2_t)); |
eq2 = vf->priv; |
for (i = 0; i < 3; i++) { |
eq2->buf[i] = NULL; |
eq2->buf_w[i] = 0; |
eq2->buf_h[i] = 0; |
eq2->param[i].adjust = NULL; |
eq2->param[i].c = 1.0; |
eq2->param[i].b = 0.0; |
eq2->param[i].g = 1.0; |
eq2->param[i].lut_clean = 0; |
} |
eq2->contrast = 1.0; |
eq2->brightness = 0.0; |
eq2->saturation = 1.0; |
eq2->gamma = 1.0; |
eq2->gamma_weight = 1.0; |
eq2->rgamma = 1.0; |
eq2->ggamma = 1.0; |
eq2->bgamma = 1.0; |
if (args != NULL) { |
par[0] = 1.0; |
par[1] = 1.0; |
par[2] = 0.0; |
par[3] = 1.0; |
par[4] = 1.0; |
par[5] = 1.0; |
par[6] = 1.0; |
par[7] = 1.0; |
sscanf (args, "%lf:%lf:%lf:%lf:%lf:%lf:%lf:%lf", |
par, par + 1, par + 2, par + 3, par + 4, par + 5, par + 6, par + 7 |
); |
eq2->rgamma = par[4]; |
eq2->ggamma = par[5]; |
eq2->bgamma = par[6]; |
eq2->gamma_weight = par[7]; |
set_gamma (eq2, par[0]); |
set_contrast (eq2, par[1]); |
set_brightness (eq2, par[2]); |
set_saturation (eq2, par[3]); |
} |
return 1; |
} |
const vf_info_t ff_vf_info_eq2 = { |
"Software equalizer", |
"eq2", |
"Hampa Hug, Daniel Moreno, Richard Felker", |
"", |
&vf_open, |
NULL |
}; |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/vf_fspp.c |
---|
0,0 → 1,2118 |
/* |
* 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 "config.h" |
#include "mp_msg.h" |
#include "cpudetect.h" |
#include "img_format.h" |
#include "mp_image.h" |
#include "vf.h" |
#include "av_helpers.h" |
#include "libvo/fastmemcpy.h" |
#include "libavutil/internal.h" |
#include "libavutil/intreadwrite.h" |
#include "libavutil/mem.h" |
#include "libavutil/x86/asm.h" |
#include "libavcodec/avcodec.h" |
#include "libavcodec/dsputil.h" |
#undef free |
#undef malloc |
//===========================================================================// |
#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, int16_t *data, int16_t *output, int cnt); |
static void row_idct_c(int16_t* workspace, |
int16_t* output_adr, int output_stride, int cnt); |
static void row_fdct_c(int16_t *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, int16_t *data, int16_t *output, int cnt); |
static void row_idct_mmx(int16_t* workspace, |
int16_t* output_adr, int output_stride, int cnt); |
static void row_fdct_mmx(int16_t *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]; |
int16_t *block= (int16_t *)block_align; |
int16_t *block3=(int16_t *)(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(int16_t)); //cycling |
memmove(block3, block3+(BLOCKSZ-1)*64, 6*8*sizeof(int16_t)); |
} |
// |
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 ff_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=ff_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=ff_vf_get_image(vf->next,mpi->imgfmt, |
MP_IMGTYPE_TEMP, |
MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE, |
mpi->width,mpi->height); |
ff_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(ff_gCpuCaps.hasMMX) __asm__ volatile ("emms\n\t"); |
#endif |
#if HAVE_MMX2 |
if(ff_gCpuCaps.hasMMX2) __asm__ volatile ("sfence\n\t"); |
#endif |
return ff_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 ff_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 ff_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 ! |
ff_init_avcodec(); |
//vf->priv->avctx= avcodec_alloc_context(); |
//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 ff_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 int16_t; //! 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_ALIGNED(8, uint64_t, ff_MM_FIX_0_541196100)=FIX64(0.541196100, 14); |
DECLARE_ALIGNED(8, uint64_t, ff_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, int16_t *data, int16_t *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; |
int16_t* dataptr; |
int16_t* 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, int16_t *data, int16_t *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(ff_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(ff_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(ff_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(ff_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(ff_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(ff_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(int16_t* 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; |
int16_t* 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 (int16_t* 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(int16_t *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; |
int16_t *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(int16_t *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(ff_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(ff_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(ff_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 |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/vf_ilpack.c |
---|
0,0 → 1,458 |
/* |
* 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 "libavutil/attributes.h" |
#include "libavutil/x86/asm.h" |
typedef void (pack_func_t)(unsigned char *dst, unsigned char *y, |
unsigned char *u, unsigned char *v, int w, int us, int vs); |
struct vf_priv_s { |
int mode; |
pack_func_t *pack[2]; |
}; |
static void pack_nn_C(unsigned char *dst, unsigned char *y, |
unsigned char *u, unsigned char *v, int w, |
int av_unused us, int av_unused vs) |
{ |
int j; |
for (j = w/2; j; j--) { |
*dst++ = *y++; |
*dst++ = *u++; |
*dst++ = *y++; |
*dst++ = *v++; |
} |
} |
static void pack_li_0_C(unsigned char *dst, unsigned char *y, |
unsigned char *u, unsigned char *v, int w, int us, int vs) |
{ |
int j; |
for (j = w/2; j; j--) { |
*dst++ = *y++; |
*dst++ = (u[us+us] + 7*u[0])>>3; |
*dst++ = *y++; |
*dst++ = (v[vs+vs] + 7*v[0])>>3; |
u++; v++; |
} |
} |
static void pack_li_1_C(unsigned char *dst, unsigned char *y, |
unsigned char *u, unsigned char *v, int w, int us, int vs) |
{ |
int j; |
for (j = w/2; j; j--) { |
*dst++ = *y++; |
*dst++ = (3*u[us+us] + 5*u[0])>>3; |
*dst++ = *y++; |
*dst++ = (3*v[vs+vs] + 5*v[0])>>3; |
u++; v++; |
} |
} |
#if HAVE_MMX |
static void pack_nn_MMX(unsigned char *dst, unsigned char *y, |
unsigned char *u, unsigned char *v, int w, |
int av_unused us, int av_unused vs) |
{ |
__asm__ volatile ("" |
ASMALIGN(4) |
"1: \n\t" |
"movq (%0), %%mm1 \n\t" |
"movq (%0), %%mm2 \n\t" |
"movq (%1), %%mm4 \n\t" |
"movq (%2), %%mm6 \n\t" |
"punpcklbw %%mm6, %%mm4 \n\t" |
"punpcklbw %%mm4, %%mm1 \n\t" |
"punpckhbw %%mm4, %%mm2 \n\t" |
"add $8, %0 \n\t" |
"add $4, %1 \n\t" |
"add $4, %2 \n\t" |
"movq %%mm1, (%3) \n\t" |
"movq %%mm2, 8(%3) \n\t" |
"add $16, %3 \n\t" |
"decl %4 \n\t" |
"jnz 1b \n\t" |
"emms \n\t" |
: |
: "r" (y), "r" (u), "r" (v), "r" (dst), "r" (w/8) |
: "memory" |
); |
pack_nn_C(dst, y, u, v, (w&7), 0, 0); |
} |
#if HAVE_EBX_AVAILABLE |
static void pack_li_0_MMX(unsigned char *dst, unsigned char *y, |
unsigned char *u, unsigned char *v, int w, int us, int vs) |
{ |
__asm__ volatile ("" |
"push %%"REG_BP" \n\t" |
#if ARCH_X86_64 |
"mov %6, %%"REG_BP" \n\t" |
#else |
"movl 4(%%"REG_d"), %%"REG_BP" \n\t" |
"movl (%%"REG_d"), %%"REG_d" \n\t" |
#endif |
"pxor %%mm0, %%mm0 \n\t" |
ASMALIGN(4) |
".Lli0: \n\t" |
"movq (%%"REG_S"), %%mm1 \n\t" |
"movq (%%"REG_S"), %%mm2 \n\t" |
"movq (%%"REG_a",%%"REG_d",2), %%mm4 \n\t" |
"movq (%%"REG_b",%%"REG_BP",2), %%mm6 \n\t" |
"punpcklbw %%mm0, %%mm4 \n\t" |
"punpcklbw %%mm0, %%mm6 \n\t" |
"movq (%%"REG_a"), %%mm3 \n\t" |
"movq (%%"REG_b"), %%mm5 \n\t" |
"punpcklbw %%mm0, %%mm3 \n\t" |
"punpcklbw %%mm0, %%mm5 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"psrlw $3, %%mm4 \n\t" |
"psrlw $3, %%mm6 \n\t" |
"packuswb %%mm4, %%mm4 \n\t" |
"packuswb %%mm6, %%mm6 \n\t" |
"punpcklbw %%mm6, %%mm4 \n\t" |
"punpcklbw %%mm4, %%mm1 \n\t" |
"punpckhbw %%mm4, %%mm2 \n\t" |
"movq %%mm1, (%%"REG_D") \n\t" |
"movq %%mm2, 8(%%"REG_D") \n\t" |
"movq 8(%%"REG_S"), %%mm1 \n\t" |
"movq 8(%%"REG_S"), %%mm2 \n\t" |
"movq (%%"REG_a",%%"REG_d",2), %%mm4 \n\t" |
"movq (%%"REG_b",%%"REG_BP",2), %%mm6 \n\t" |
"punpckhbw %%mm0, %%mm4 \n\t" |
"punpckhbw %%mm0, %%mm6 \n\t" |
"movq (%%"REG_a"), %%mm3 \n\t" |
"movq (%%"REG_b"), %%mm5 \n\t" |
"punpckhbw %%mm0, %%mm3 \n\t" |
"punpckhbw %%mm0, %%mm5 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"psrlw $3, %%mm4 \n\t" |
"psrlw $3, %%mm6 \n\t" |
"packuswb %%mm4, %%mm4 \n\t" |
"packuswb %%mm6, %%mm6 \n\t" |
"punpcklbw %%mm6, %%mm4 \n\t" |
"punpcklbw %%mm4, %%mm1 \n\t" |
"punpckhbw %%mm4, %%mm2 \n\t" |
"add $16, %%"REG_S" \n\t" |
"add $8, %%"REG_a" \n\t" |
"add $8, %%"REG_b" \n\t" |
"movq %%mm1, 16(%%"REG_D") \n\t" |
"movq %%mm2, 24(%%"REG_D") \n\t" |
"add $32, %%"REG_D" \n\t" |
"decl %%ecx \n\t" |
"jnz .Lli0 \n\t" |
"emms \n\t" |
"pop %%"REG_BP" \n\t" |
: |
: "S" (y), "D" (dst), "a" (u), "b" (v), "c" (w/16), |
#if ARCH_X86_64 |
"d" ((x86_reg)us), "r" ((x86_reg)vs) |
#else |
"d" (&us) |
#endif |
: "memory" |
); |
pack_li_0_C(dst, y, u, v, (w&15), us, vs); |
} |
static void pack_li_1_MMX(unsigned char *dst, unsigned char *y, |
unsigned char *u, unsigned char *v, int w, int us, int vs) |
{ |
__asm__ volatile ("" |
"push %%"REG_BP" \n\t" |
#if ARCH_X86_64 |
"mov %6, %%"REG_BP" \n\t" |
#else |
"movl 4(%%"REG_d"), %%"REG_BP" \n\t" |
"movl (%%"REG_d"), %%"REG_d" \n\t" |
#endif |
"pxor %%mm0, %%mm0 \n\t" |
ASMALIGN(4) |
".Lli1: \n\t" |
"movq (%%"REG_S"), %%mm1 \n\t" |
"movq (%%"REG_S"), %%mm2 \n\t" |
"movq (%%"REG_a",%%"REG_d",2), %%mm4 \n\t" |
"movq (%%"REG_b",%%"REG_BP",2), %%mm6 \n\t" |
"punpcklbw %%mm0, %%mm4 \n\t" |
"punpcklbw %%mm0, %%mm6 \n\t" |
"movq (%%"REG_a"), %%mm3 \n\t" |
"movq (%%"REG_b"), %%mm5 \n\t" |
"punpcklbw %%mm0, %%mm3 \n\t" |
"punpcklbw %%mm0, %%mm5 \n\t" |
"movq %%mm4, %%mm7 \n\t" |
"paddw %%mm4, %%mm4 \n\t" |
"paddw %%mm7, %%mm4 \n\t" |
"movq %%mm6, %%mm7 \n\t" |
"paddw %%mm6, %%mm6 \n\t" |
"paddw %%mm7, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"psrlw $3, %%mm4 \n\t" |
"psrlw $3, %%mm6 \n\t" |
"packuswb %%mm4, %%mm4 \n\t" |
"packuswb %%mm6, %%mm6 \n\t" |
"punpcklbw %%mm6, %%mm4 \n\t" |
"punpcklbw %%mm4, %%mm1 \n\t" |
"punpckhbw %%mm4, %%mm2 \n\t" |
"movq %%mm1, (%%"REG_D") \n\t" |
"movq %%mm2, 8(%%"REG_D") \n\t" |
"movq 8(%%"REG_S"), %%mm1 \n\t" |
"movq 8(%%"REG_S"), %%mm2 \n\t" |
"movq (%%"REG_a",%%"REG_d",2), %%mm4 \n\t" |
"movq (%%"REG_b",%%"REG_BP",2), %%mm6 \n\t" |
"punpckhbw %%mm0, %%mm4 \n\t" |
"punpckhbw %%mm0, %%mm6 \n\t" |
"movq (%%"REG_a"), %%mm3 \n\t" |
"movq (%%"REG_b"), %%mm5 \n\t" |
"punpckhbw %%mm0, %%mm3 \n\t" |
"punpckhbw %%mm0, %%mm5 \n\t" |
"movq %%mm4, %%mm7 \n\t" |
"paddw %%mm4, %%mm4 \n\t" |
"paddw %%mm7, %%mm4 \n\t" |
"movq %%mm6, %%mm7 \n\t" |
"paddw %%mm6, %%mm6 \n\t" |
"paddw %%mm7, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"paddw %%mm3, %%mm4 \n\t" |
"paddw %%mm5, %%mm6 \n\t" |
"psrlw $3, %%mm4 \n\t" |
"psrlw $3, %%mm6 \n\t" |
"packuswb %%mm4, %%mm4 \n\t" |
"packuswb %%mm6, %%mm6 \n\t" |
"punpcklbw %%mm6, %%mm4 \n\t" |
"punpcklbw %%mm4, %%mm1 \n\t" |
"punpckhbw %%mm4, %%mm2 \n\t" |
"add $16, %%"REG_S" \n\t" |
"add $8, %%"REG_a" \n\t" |
"add $8, %%"REG_b" \n\t" |
"movq %%mm1, 16(%%"REG_D") \n\t" |
"movq %%mm2, 24(%%"REG_D") \n\t" |
"add $32, %%"REG_D" \n\t" |
"decl %%ecx \n\t" |
"jnz .Lli1 \n\t" |
"emms \n\t" |
"pop %%"REG_BP" \n\t" |
: |
: "S" (y), "D" (dst), "a" (u), "b" (v), "c" (w/16), |
#if ARCH_X86_64 |
"d" ((x86_reg)us), "r" ((x86_reg)vs) |
#else |
"d" (&us) |
#endif |
: "memory" |
); |
pack_li_1_C(dst, y, u, v, (w&15), us, vs); |
} |
#endif /* HAVE_EBX_AVAILABLE */ |
#endif |
static pack_func_t *pack_nn; |
static pack_func_t *pack_li_0; |
static pack_func_t *pack_li_1; |
static void ilpack(unsigned char *dst, unsigned char *src[3], |
int dststride, int srcstride[3], int w, int h, pack_func_t *pack[2]) |
{ |
int i; |
unsigned char *y, *u, *v; |
int ys = srcstride[0], us = srcstride[1], vs = srcstride[2]; |
int a, b; |
y = src[0]; |
u = src[1]; |
v = src[2]; |
pack_nn(dst, y, u, v, w, 0, 0); |
y += ys; dst += dststride; |
pack_nn(dst, y, u+us, v+vs, w, 0, 0); |
y += ys; dst += dststride; |
for (i=2; i<h-2; i++) { |
a = (i&2) ? 1 : -1; |
b = (i&1) ^ ((i&2)>>1); |
pack[b](dst, y, u, v, w, us*a, vs*a); |
y += ys; |
if ((i&3) == 1) { |
u -= us; |
v -= vs; |
} else { |
u += us; |
v += vs; |
} |
dst += dststride; |
} |
pack_nn(dst, y, u, v, w, 0, 0); |
y += ys; dst += dststride; u += us; v += vs; |
pack_nn(dst, y, u, v, w, 0, 0); |
} |
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=ff_vf_get_image(vf->next, IMGFMT_YUY2, |
MP_IMGTYPE_TEMP, MP_IMGFLAG_ACCEPT_STRIDE, |
mpi->w, mpi->h); |
ilpack(dmpi->planes[0], mpi->planes, dmpi->stride[0], mpi->stride, mpi->w, mpi->h, vf->priv->pack); |
return ff_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) |
{ |
/* FIXME - also support UYVY output? */ |
return ff_vf_next_config(vf, width, height, 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 ff_vf_next_query_format(vf,IMGFMT_YUY2); |
} |
return 0; |
} |
static int vf_open(vf_instance_t *vf, char *args) |
{ |
vf->config=config; |
vf->query_format=query_format; |
vf->put_image=put_image; |
vf->priv = calloc(1, sizeof(struct vf_priv_s)); |
vf->priv->mode = 1; |
if (args) sscanf(args, "%d", &vf->priv->mode); |
pack_nn = pack_nn_C; |
pack_li_0 = pack_li_0_C; |
pack_li_1 = pack_li_1_C; |
#if HAVE_MMX |
if(ff_gCpuCaps.hasMMX) { |
pack_nn = pack_nn_MMX; |
#if HAVE_EBX_AVAILABLE |
pack_li_0 = pack_li_0_MMX; |
pack_li_1 = pack_li_1_MMX; |
#endif |
} |
#endif |
switch(vf->priv->mode) { |
case 0: |
vf->priv->pack[0] = vf->priv->pack[1] = pack_nn; |
break; |
default: |
ff_mp_msg(MSGT_VFILTER, MSGL_WARN, |
"ilpack: unknown mode %d (fallback to linear)\n", |
vf->priv->mode); |
/* Fallthrough */ |
case 1: |
vf->priv->pack[0] = pack_li_0; |
vf->priv->pack[1] = pack_li_1; |
break; |
} |
return 1; |
} |
const vf_info_t ff_vf_info_ilpack = { |
"4:2:0 planar -> 4:2:2 packed reinterlacer", |
"ilpack", |
"Richard Felker", |
"", |
vf_open, |
NULL |
}; |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/vf_pp7.c |
---|
0,0 → 1,491 |
/* |
* 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" |
#if HAVE_MALLOC_H |
#include <malloc.h> |
#endif |
#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)) |
//===========================================================================// |
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(int16_t *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(int16_t *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(int16_t *dst, int16_t *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(int16_t *dst, int16_t *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)(int16_t *dst, int16_t *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(int16_t *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(int16_t *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(int16_t *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)(int16_t *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; |
int16_t *block= (int16_t *)p->src; |
int16_t *temp= (int16_t *)(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; |
int16_t *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; |
int16_t *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 ff_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=ff_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=ff_vf_get_image(vf->next,mpi->imgfmt, |
MP_IMGTYPE_TEMP, |
MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE, |
mpi->width,mpi->height); |
ff_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(ff_gCpuCaps.hasMMX) __asm__ volatile ("emms\n\t"); |
#endif |
#if HAVE_MMX2 |
if(ff_gCpuCaps.hasMMX2) __asm__ volatile ("sfence\n\t"); |
#endif |
return ff_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 ff_vf_next_query_format(vf,fmt); |
} |
return 0; |
} |
static int control(struct vf_instance *vf, int request, void* data){ |
return ff_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(ff_gCpuCaps.hasMMX){ |
dctB= dctB_mmx; |
} |
#endif |
#if 0 |
if(ff_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 ff_vf_info_pp7 = { |
"postprocess 7", |
"pp7", |
"Michael Niedermayer", |
"", |
vf_open, |
NULL |
}; |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/vf_softpulldown.c |
---|
0,0 → 1,163 |
/* |
* 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 state; |
long long in; |
long long out; |
}; |
static int put_image(struct vf_instance *vf, mp_image_t *mpi, double pts) |
{ |
mp_image_t *dmpi; |
int ret = 0; |
int flags = mpi->fields; |
int state = vf->priv->state; |
dmpi = ff_vf_get_image(vf->next, mpi->imgfmt, |
MP_IMGTYPE_STATIC, MP_IMGFLAG_ACCEPT_STRIDE | |
MP_IMGFLAG_PRESERVE, mpi->width, mpi->height); |
vf->priv->in++; |
if ((state == 0 && |
!(flags & MP_IMGFIELD_TOP_FIRST)) || |
(state == 1 && |
flags & MP_IMGFIELD_TOP_FIRST)) { |
ff_mp_msg(MSGT_VFILTER, MSGL_WARN, |
"softpulldown: Unexpected field flags: state=%d top_field_first=%d repeat_first_field=%d\n", |
state, |
(flags & MP_IMGFIELD_TOP_FIRST) != 0, |
(flags & MP_IMGFIELD_REPEAT_FIRST) != 0); |
state ^= 1; |
} |
if (state == 0) { |
ret = ff_vf_next_put_image(vf, mpi, MP_NOPTS_VALUE); |
vf->priv->out++; |
if (flags & MP_IMGFIELD_REPEAT_FIRST) { |
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); |
} |
state=1; |
} |
} else { |
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 = ff_vf_next_put_image(vf, dmpi, MP_NOPTS_VALUE); |
vf->priv->out++; |
if (flags & MP_IMGFIELD_REPEAT_FIRST) { |
ret |= ff_vf_next_put_image(vf, mpi, MP_NOPTS_VALUE); |
vf->priv->out++; |
state=0; |
} else { |
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); |
} |
} |
} |
vf->priv->state = state; |
return ret; |
} |
static int config(struct vf_instance *vf, |
int width, int height, int d_width, int d_height, |
unsigned int flags, unsigned int outfmt) |
{ |
return ff_vf_next_config(vf,width,height,d_width,d_height,flags,outfmt); |
} |
static void uninit(struct vf_instance *vf) |
{ |
ff_mp_msg(MSGT_VFILTER, MSGL_INFO, "softpulldown: %lld frames in, %lld frames out\n", vf->priv->in, vf->priv->out); |
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->state = 0; |
return 1; |
} |
const vf_info_t ff_vf_info_softpulldown = { |
"mpeg2 soft 3:2 pulldown", |
"softpulldown", |
"Tobias Diedrich <ranma+mplayer@tdiedrich.de>", |
"", |
vf_open, |
NULL |
}; |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/vf_uspp.c |
---|
0,0 → 1,393 |
/* |
* 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 "config.h" |
#include "mp_msg.h" |
#include "cpudetect.h" |
#include "libavutil/mem.h" |
#include "libavcodec/avcodec.h" |
#include "img_format.h" |
#include "mp_image.h" |
#include "vf.h" |
#include "av_helpers.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(AV_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; |
AVDictionary *opts = NULL; |
avctx_enc= |
vf->priv->avctx_enc[i]= avcodec_alloc_context3(NULL); |
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 = AV_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; |
av_dict_set(&opts, "no_bitstream", "1", 0); |
avcodec_open2(avctx_enc, enc, &opts); |
av_dict_free(&opts); |
assert(avctx_enc->codec); |
} |
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 ff_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=ff_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=ff_vf_get_image(vf->next,mpi->imgfmt, |
MP_IMGTYPE_TEMP, |
MP_IMGFLAG_ACCEPT_STRIDE|MP_IMGFLAG_PREFER_ALIGNED_STRIDE, |
mpi->width,mpi->height); |
ff_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(ff_gCpuCaps.hasMMX) __asm__ volatile ("emms\n\t"); |
#endif |
#if HAVE_MMX2 |
if(ff_gCpuCaps.hasMMX2) __asm__ volatile ("sfence\n\t"); |
#endif |
return ff_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 ff_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 ff_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)); |
ff_init_avcodec(); |
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(ff_gCpuCaps.hasMMX){ |
// store_slice= store_slice_mmx; |
// } |
// #endif |
return 1; |
} |
const vf_info_t ff_vf_info_uspp = { |
"ultra simple/slow postprocess", |
"uspp", |
"Michael Niedermayer", |
"", |
vf_open, |
NULL |
}; |
/contrib/sdk/sources/ffmpeg/ffmpeg-2.1/libavfilter/libmpcodecs/vfcap.h |
---|
0,0 → 1,56 |
/* VFCAP_* values: they are flags, returned by query_format(): |
* |
* 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_VFCAP_H |
#define MPLAYER_VFCAP_H |
// set, if the given colorspace is supported (with or without conversion) |
#define VFCAP_CSP_SUPPORTED 0x1 |
// set, if the given colorspace is supported _without_ conversion |
#define VFCAP_CSP_SUPPORTED_BY_HW 0x2 |
// set if the driver/filter can draw OSD |
#define VFCAP_OSD 0x4 |
// set if the driver/filter can handle compressed SPU stream |
#define VFCAP_SPU 0x8 |
// scaling up/down by hardware, or software: |
#define VFCAP_HWSCALE_UP 0x10 |
#define VFCAP_HWSCALE_DOWN 0x20 |
#define VFCAP_SWSCALE 0x40 |
// driver/filter can do vertical flip (upside-down) |
#define VFCAP_FLIP 0x80 |
// driver/hardware handles timing (blocking) |
#define VFCAP_TIMER 0x100 |
// driver _always_ flip image upside-down (for ve_vfw) |
#define VFCAP_FLIPPED 0x200 |
// vf filter: accepts stride (put_image) |
// vo driver: has draw_slice() support for the given csp |
#define VFCAP_ACCEPT_STRIDE 0x400 |
// filter does postprocessing (so you shouldn't scale/filter image before it) |
#define VFCAP_POSTPROC 0x800 |
// filter cannot be reconfigured to different size & format |
#define VFCAP_CONSTANT 0x1000 |
// filter can draw EOSD |
#define VFCAP_EOSD 0x2000 |
// filter will draw EOSD at screen resolution (without scaling) |
#define VFCAP_EOSD_UNSCALED 0x4000 |
// used by libvo and vf_vo, indicates the VO does not support draw_slice for this format |
#define VOCAP_NOSLICES 0x8000 |
#endif /* MPLAYER_VFCAP_H */ |