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

多媒体编程

开发平台:

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 "..BaseSplitterBaseSplitter.h"
  23. // {48B93619-A959-45d9-B5FD-E12A67A96CF1}
  24. DEFINE_GUID(MEDIASUBTYPE_RoQ, 
  25. 0x48b93619, 0xa959, 0x45d9, 0xb5, 0xfd, 0xe1, 0x2a, 0x67, 0xa9, 0x6c, 0xf1);
  26. // 56516F52-0000-0010-8000-00AA00389B71  'RoQV' == MEDIASUBTYPE_RoQV
  27. DEFINE_GUID(MEDIASUBTYPE_RoQV,
  28. 0x56516F52, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
  29. #define WAVE_FORMAT_RoQA 0x41516F52
  30. // 41516F52-0000-0010-8000-00AA00389B71  'RoQA' == MEDIASUBTYPE_RoQA
  31. DEFINE_GUID(MEDIASUBTYPE_RoQA,
  32. WAVE_FORMAT_RoQA, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
  33. #pragma pack(push, 1)
  34. struct roq_chunk {WORD id; DWORD size; WORD arg;};
  35. struct roq_info {WORD w, h, unk1, unk2;};
  36. #pragma pack(pop)
  37. [uuid("C73DF7C1-21F2-44C7-A430-D35FB9BB298F")]
  38. class CRoQSplitterFilter : public CBaseSplitterFilter
  39. {
  40. CComPtr<IAsyncReader> m_pAsyncReader;
  41. struct index {REFERENCE_TIME rtv, rta; __int64 fp;};
  42. CList<index> m_index;
  43. POSITION m_indexpos;
  44. protected:
  45. HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
  46. bool DemuxInit();
  47. void DemuxSeek(REFERENCE_TIME rt);
  48. bool DemuxLoop();
  49. public:
  50. CRoQSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
  51. };
  52. [uuid("02B8E5C2-4E1F-45D3-9A8E-B8F1EDE6DE09")]
  53. class CRoQSourceFilter : public CRoQSplitterFilter
  54. {
  55. public:
  56. CRoQSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
  57. };
  58. [uuid("FBEFC5EC-ABA0-4E6C-ACA3-D05FDFEFB853")]
  59. class CRoQVideoDecoder : public CTransformFilter
  60. {
  61. CCritSec m_csReceive;
  62. REFERENCE_TIME m_rtStart;
  63. BYTE* m_y[2];
  64. BYTE* m_u[2];
  65. BYTE* m_v[2];
  66. int m_pitch;
  67. void Copy(BYTE* pOut, BYTE* pIn, DWORD w, DWORD h);
  68. #pragma pack(push, 1)
  69. struct roq_cell {BYTE y0, y1, y2, y3, u, v;} m_cells[256];
  70. struct roq_qcell {roq_cell* idx[4];} m_qcells[256];
  71. #pragma pack(pop)
  72. void apply_vector_2x2(int x, int y, roq_cell* cell);
  73. void apply_vector_4x4(int x, int y, roq_cell* cell);
  74. void apply_motion_4x4(int x, int y, unsigned char mv, char mean_x, char mean_y);
  75. void apply_motion_8x8(int x, int y, unsigned char mv, char mean_x, char mean_y);
  76. public:
  77. CRoQVideoDecoder(LPUNKNOWN lpunk, HRESULT* phr);
  78. virtual ~CRoQVideoDecoder();
  79.     HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
  80. HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
  81. HRESULT CheckInputType(const CMediaType* mtIn);
  82. HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
  83. HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
  84. HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
  85. HRESULT StartStreaming();
  86. HRESULT StopStreaming();
  87. };
  88. [uuid("226FAF85-E358-4502-8C98-F4224BE76953")]
  89. class CRoQAudioDecoder : public CTransformFilter
  90. {
  91. public:
  92. CRoQAudioDecoder(LPUNKNOWN lpunk, HRESULT* phr);
  93. virtual ~CRoQAudioDecoder();
  94. HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
  95. HRESULT CheckInputType(const CMediaType* mtIn);
  96. HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
  97. HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
  98. HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
  99. };