⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timgfilterpostproc.h

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻 H
字号:
#ifndef _TIMGFILTERPOSTPROC_H_
#define _TIMGFILTERPOSTPROC_H_

#include "TimgFilter.h"
#include "postproc/postprocess.h"
#include "nic/nic_postProcess.h"
#include "simd.h"

struct TpostprocSettings;
DECLARE_FILTER(TimgFilterPostprocBase,public,TimgFilter)
private:
 bool h264,testh264,playingH264;
 int oldh264mode;
 unsigned int oldDeblockStrength;
 bool wasIP;
 bool pp_codec(int);
protected:
 int currentq;
 int8_t *quants;
 static const unsigned int quantsDx,quantsDy;
 int prepare(const TpostprocSettings *cfg,int maxquant,int frametype);
public:
 TimgFilterPostprocBase(IffdshowBase *Ideci,Tfilters *Iparent,bool Ih264);
 virtual ~TimgFilterPostprocBase();
 virtual void onSeek(void);
};

struct Tlibmplayer;
DECLARE_FILTER(TimgFilterPostprocMplayer,public,TimgFilterPostprocBase)
private:
 Tlibmplayer *libmplayer;
 void *pp_ctx;PPMode pp_mode;
protected:
 virtual bool is(const TffPictBase &pict,const TfilterSettingsVideo *cfg);
 virtual int getSupportedInputColorspaces(const TfilterSettingsVideo *cfg) const {return FF_CSPS_MASK_YUV_PLANAR;}
 virtual void onSizeChange(void);
public:
 TimgFilterPostprocMplayer(IffdshowBase *Ideci,Tfilters *Iparent);
 virtual ~TimgFilterPostprocMplayer();
 virtual void done(void);
 virtual HRESULT process(TfilterQueue::iterator it,TffPict &pict,const TfilterSettingsVideo *cfg0);
};

struct Tlibavcodec;
DECLARE_FILTER(TimgFilterPostprocSpp,public,TimgFilterPostprocBase)
private:
 int old_sppMode;
 typedef short DCTELEM;
 void (*store_slice)(uint8_t *dst, const int16_t *src, int dst_stride, int src_stride, unsigned int width, unsigned int height, int log2_scale);
 void (*requantize)(DCTELEM dst[64], const DCTELEM src[64], int qp);
 int temp_stride;
 int16_t *temp;
 uint8_t *src;
 static const uint8_t offset[127][2];
 static void store_slice_c(uint8_t *dst, const int16_t *src, int dst_stride, int src_stride, unsigned int width, unsigned int height, int log2_scale);
 friend class TimgFilterPostprocFspp;
 template<class _mm> struct TstoreSlice
  {
   static __align16(const uint8_t,dither[8][_mm::size]);
   static void store_slice(uint8_t *dst, const int16_t *src, int dst_stride, int src_stride, unsigned int width, unsigned int height, int log2_scale);
  };
 static void softthresh_mmx(DCTELEM dst[64], const DCTELEM src[64], int qp);
 static __forceinline void requant_core_soft(unsigned char *dst0,unsigned char *dst1,unsigned char *dst2,unsigned char *dst3,const unsigned char *src0,const unsigned char *src1,const unsigned char *src2,const unsigned char *src3,const __m64 &mm4,const __m64 &mm5);
 static void hardthresh_mmx(DCTELEM dst[64], const DCTELEM src[64], int qp);
 static __forceinline void requant_core_hard(unsigned char *dst0,unsigned char *dst1,unsigned char *dst2,unsigned char *dst3,const unsigned char *src0,const unsigned char *src1,const unsigned char *src2,const unsigned char *src3,const __m64 &mm4,const __m64 &mm5,const __m64 &mm6);
 void filter(uint8_t *dst, const uint8_t *src, int dst_stride, int src_stride, unsigned int width, unsigned int height, const int8_t *qp_store, int qp_stride, bool is_luma);
 static inline void add_block(int16_t *dst,int stride,DCTELEM block[64]);
 static inline void get_pixels(DCTELEM *block, const uint8_t *pixels, int line_size);
 static __forceinline void store(int pos,const int16_t *src,int x,int y,int dst_stride,int src_stride,int log2_scale,const uint8_t *d,uint8_t *dst)
  {
   int temp= ((src[x + y*src_stride + pos]<<log2_scale) + d[pos])>>6;
   if (temp & 0x100) temp= ~(temp>>31);
   dst[x + y*dst_stride + pos]= (uint8_t)temp;
  }
 static void ff_fdct_mmx2(int16_t *block);
protected:
 virtual bool is(const TffPictBase &pict,const TfilterSettingsVideo *cfg);
 virtual int getSupportedInputColorspaces(const TfilterSettingsVideo *cfg) const {return FF_CSPS_MASK_YUV_PLANAR;}
 virtual void onSizeChange(void);
public:
 TimgFilterPostprocSpp(IffdshowBase *Ideci,Tfilters *Iparent);
 virtual void done(void);
 virtual HRESULT process(TfilterQueue::iterator it,TffPict &pict,const TfilterSettingsVideo *cfg0);
};

DECLARE_FILTER(TimgFilterPostprocNic,public,TimgFilterPostprocBase)
private:
 Tnic_deringFc nic_dering;
protected:
 virtual bool is(const TffPictBase &pict,const TfilterSettingsVideo *cfg);
 virtual int getSupportedInputColorspaces(const TfilterSettingsVideo *cfg) const {return FF_CSP_420P;}
public:
 TimgFilterPostprocNic(IffdshowBase *Ideci,Tfilters *Iparent);
 virtual HRESULT process(TfilterQueue::iterator it,TffPict &pict,const TfilterSettingsVideo *cfg0);
};

DECLARE_FILTER(TimgFilterPostprocFspp,public,TimgFilterPostprocBase)
private:
 void filter(uint8_t *dst, const uint8_t *src,
            stride_t dst_stride, stride_t src_stride,
            int width, int height,
            int8_t *qp_store, int qp_stride, int is_luma);
 uint8_t *src;
 int temp_stride;int16_t *temp;
 int prev_q;static const int qp=0;
 static const int log2_count=4;
 static const int BLOCKSZ=12;
 typedef short DCTELEM;
 uint64_t threshold_mtx_noq[8*2];
 uint64_t threshold_mtx[8*2];
 void mul_thrmat_s(int q);
 static void row_fdct_s(DCTELEM *data, const uint8_t *pixels, int line_size, int cnt);
 static void column_fidct_s(int16_t* thr_adr, DCTELEM *data, DCTELEM *output, int cnt);
 static void row_idct_s(DCTELEM* workspace, int16_t* output_adr, int output_stride, int cnt);
 static void store_slice_s(uint8_t *dst, int16_t *src, stride_t dst_stride, stride_t src_stride, long width, long height, long log2_scale);
 static void store_slice2_s(uint8_t *dst, int16_t *src, stride_t dst_stride, stride_t src_stride, long width, long height, long log2_scale);
 static const int DCTSIZE_S=8;
 static const __int64 MM_FIX_0_382683433,MM_FIX_0_541196100,MM_FIX_0_707106781,MM_FIX_1_306562965,MM_FIX_1_414213562_A,MM_FIX_1_847759065,MM_FIX_2_613125930,MM_FIX_1_414213562,MM_FIX_1_082392200,MM_FIX_0_847759065,MM_FIX_0_566454497,MM_FIX_0_198912367,MM_DESCALE_RND,MM_2;
protected:
 virtual bool is(const TffPictBase &pict,const TfilterSettingsVideo *cfg);
 virtual int getSupportedInputColorspaces(const TfilterSettingsVideo *cfg) const {return FF_CSPS_MASK_YUV_PLANAR;}
 virtual void onSizeChange(void);
public:
 TimgFilterPostprocFspp(IffdshowBase *Ideci,Tfilters *Iparent);
 virtual void done(void);
 virtual HRESULT process(TfilterQueue::iterator it,TffPict &pict,const TfilterSettingsVideo *cfg0);
};

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -