timgfiltergrab.h

来自「从FFMPEG转换而来的H264解码程序,VC下编译..」· C头文件 代码 · 共 95 行

H
95
字号
#ifndef _TIMGFILTERGRAB_H_
#define _TIMGFILTERGRAB_H_

#include "TimgFilter.h"
#include "ffcodecs.h"
#include "Tlibavcodec.h"
#include "IimgFilterGrab.h"

class Tdll;
struct Tconfig;
struct Tlibavcodec;
struct AVCodecContext;
struct AVFrame;
class TimgFilterGrab : public TimgFilter, public IimgFilterGrab
_DECLARE_FILTER(TimgFilterGrab,TimgFilter)
private:
 struct TimgExport
  {
  public:
   bool ok,inited;
   TimgExport(void):ok(false),inited(false) {}
   virtual ~TimgExport() {}
   virtual void init(unsigned int dx,unsigned int dy)=0;
   virtual int requiredCSP()=0;
   virtual int compress(const unsigned char *src[4],stride_t stride[4],unsigned char *dst,unsigned int dstlen,int qual)=0;
   virtual void done(void) {inited=false;}
  };
 struct TimgExportLibavcodec :public TimgExport
  {
  private:
   Tlibavcodec *dll;
   AVCodecContext *avctx;
   AVFrame *picture;
   CodecID codecId;
   bool avctxinited;
  protected:
   virtual int setQual(int qual)=0;
  public:
   TimgExportLibavcodec(const Tconfig *config,IffdshowBase *deci,CodecID IcodecId);
   virtual ~TimgExportLibavcodec();
   virtual void init(unsigned int dx,unsigned int dy);
   virtual int compress(const unsigned char *src[4],stride_t stride[4],unsigned char *dst,unsigned int dstlen,int qual);
   virtual void done(void);
  };
 struct TimgExportJPEG :public TimgExportLibavcodec
  {
  protected:
   virtual int setQual(int qual)
    {
     return int(FF_QP2LAMBDA*(30.0f*(100-qual)/100+1));
    }
  public:
   TimgExportJPEG(const Tconfig *config,IffdshowBase *deci):TimgExportLibavcodec(config,deci,CODEC_ID_MJPEG) {}
   virtual int requiredCSP() {return FF_CSP_420P|FF_CSP_FLAGS_YUV_JPEG;}
  };
 struct TimgExportPNG :public TimgExportLibavcodec
  {
   virtual int setQual(int qual)
    {
     return (9*qual+50)/100;
    }
  public:
   TimgExportPNG(const Tconfig *config,IffdshowBase *deci):TimgExportLibavcodec(config,deci,CODEC_ID_PNG) {}
   virtual int requiredCSP() {return FF_CSP_BGR24;}
  };
 struct TimgExportBMP :public TimgExport
  {
  private:
   BITMAPFILEHEADER bfh;
   BITMAPCOREHEADER bch;
  public:
   TimgExportBMP(void);
   virtual void init(unsigned int dx,unsigned int dy);
   virtual int requiredCSP() {return FF_CSP_RGB24|FF_CSP_FLAGS_VFLIP;}
   virtual int compress(const unsigned char *src[4],stride_t stride[4],unsigned char *dst,unsigned int dstlen,int qual);
  };
 TimgExport *exp[3];
 unsigned char *dstbuf;unsigned int dstbuflen;
 volatile LONG now;
protected:
 virtual bool is(const TffPictBase &pict,const TfilterSettingsVideo *cfg);
 virtual int getSupportedInputColorspaces(const TfilterSettingsVideo *cfg) const;
 virtual void onSizeChange(void);
public:
 TimgFilterGrab(IffdshowBase *Ideci,Tfilters *Iparent);
 virtual ~TimgFilterGrab();
 virtual void done(void);
 virtual HRESULT process(TfilterQueue::iterator it,TffPict &pict,const TfilterSettingsVideo *cfg);

 virtual HRESULT queryInterface(const IID &iid,void **ptr) const;
 STDMETHODIMP grabNow(void);
};

#endif

⌨️ 快捷键说明

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