FLICSource.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:3k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #pragma once
  22. #include <atlbase.h>
  23. #include <afxtempl.h>
  24. #pragma pack(push, 1)
  25. enum
  26. {
  27. FLIC_256_COLOR = 4,
  28. FLIC_DELTA = 7,
  29. FLIC_64_COLOR = 11,
  30. FLIC_LC = 12,
  31. FLIC_BLACK = 13,
  32. FLIC_BRUN = 15,
  33. FLIC_COPY = 16,
  34. FLIC_MINI = 18
  35. };
  36. struct FLIC
  37. {
  38. DWORD size;
  39. WORD id; // 0xaf11 or 0xaf12
  40. WORD frames, x, y, bpp;
  41. WORD flags, ticks;
  42. DWORD next, frit;
  43. BYTE reserved[102];
  44. };
  45. struct FLIC_PREFIX
  46. {
  47. DWORD size;
  48. WORD id; // 0xf100
  49. WORD chunks;
  50. BYTE reserved[8];
  51. };
  52. struct FLIC_FRAME
  53. {
  54. DWORD size;
  55. WORD id; // 0xf1fa
  56. WORD chunks;
  57. BYTE reserved[8];
  58. };
  59. struct FLIC_CHUNK
  60. {
  61. DWORD size;
  62. WORD type;
  63. };
  64. #pragma pack(pop)
  65. struct FLIC_FRAME_ENTRY
  66. {
  67. __int64 pos;
  68. bool fKeyframe;
  69. FLIC_FRAME hdr;
  70. };
  71. [uuid("17DB5CF6-39BB-4d5b-B0AA-BEBA44673AD4")]
  72. class CFLICSource
  73. : public CSource
  74. , public IFileSourceFilter
  75. , public IAMFilterMiscFlags
  76. {
  77. CStringW m_fn;
  78. public:
  79. CFLICSource(LPUNKNOWN lpunk, HRESULT* phr);
  80. virtual ~CFLICSource();
  81. DECLARE_IUNKNOWN;
  82.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  83. // IFileSourceFilter
  84. STDMETHODIMP Load(LPCOLESTR pszFileName, const AM_MEDIA_TYPE* pmt);
  85. STDMETHODIMP GetCurFile(LPOLESTR* ppszFileName, AM_MEDIA_TYPE* pmt);
  86. // IAMFilterMiscFlags
  87. STDMETHODIMP_(ULONG) GetMiscFlags();
  88. };
  89. class CFLICStream 
  90. : public CSourceStream
  91. , public CSourceSeeking
  92. {
  93. CFile m_flic;
  94. FLIC m_hdr;
  95. CArray<FLIC_FRAME_ENTRY> m_frames;
  96. CCritSec m_cSharedState;
  97. REFERENCE_TIME m_AvgTimePerFrame;
  98. REFERENCE_TIME m_rtSampleTime, m_rtPosition;
  99. BOOL m_bDiscontinuity, m_bFlushing;
  100. HRESULT OnThreadStartPlay();
  101. HRESULT OnThreadCreate();
  102. void UpdateFromSeek();
  103. STDMETHODIMP SetRate(double dRate);
  104. HRESULT ChangeStart();
  105.     HRESULT ChangeStop();
  106.     HRESULT ChangeRate() {return S_OK;}
  107. private:
  108. int m_nLastFrameNum;
  109. DWORD m_pPalette[256];
  110. CAutoVectorPtr<BYTE> m_pFrameBuffer;
  111. void SeekToNearestKeyFrame(int nFrame);
  112. void ExtractFrame(int nFrame);
  113. void _blackchunk();
  114. void _copychunk();
  115. bool _colorchunk(bool f64);
  116. void _brunchunk();
  117. void _lcchunk();
  118. void _deltachunk();
  119. public:
  120.     CFLICStream(const WCHAR* wfn, CFLICSource* pParent, HRESULT* phr);
  121. virtual ~CFLICStream();
  122.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  123.     HRESULT DecideBufferSize(IMemAllocator* pIMemAlloc, ALLOCATOR_PROPERTIES* pProperties);
  124.     HRESULT FillBuffer(IMediaSample* pSample);
  125. HRESULT CheckConnect(IPin* pPin);
  126.     HRESULT CheckMediaType(const CMediaType* pMediaType);
  127.     HRESULT GetMediaType(int iPosition, CMediaType* pmt);
  128. STDMETHODIMP Notify(IBaseFilter* pSender, Quality q);
  129. };