00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #pragma once
00023
00024 #include "..\BaseSplitter\BaseSplitter.h"
00025
00026
00027 DEFINE_GUID(MEDIASUBTYPE_RoQ,
00028 0x48b93619, 0xa959, 0x45d9, 0xb5, 0xfd, 0xe1, 0x2a, 0x67, 0xa9, 0x6c, 0xf1);
00029
00030
00031 DEFINE_GUID(MEDIASUBTYPE_RoQV,
00032 0x56516F52, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
00033
00034 #define WAVE_FORMAT_RoQA 0x41516F52
00035
00036
00037 DEFINE_GUID(MEDIASUBTYPE_RoQA,
00038 WAVE_FORMAT_RoQA, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
00039
00040 #pragma pack(push, 1)
00041 struct roq_chunk {WORD id; DWORD size; WORD arg;};
00042 struct roq_info {WORD w, h, unk1, unk2;};
00043 #pragma pack(pop)
00044
00045 [uuid("C73DF7C1-21F2-44C7-A430-D35FB9BB298F")]
00046 class CRoQSplitterFilter : public CBaseSplitterFilter
00047 {
00048 CComPtr<IAsyncReader> m_pAsyncReader;
00049
00050 struct index {REFERENCE_TIME rtv, rta; __int64 fp;};
00051 CList<index> m_index;
00052 POSITION m_indexpos;
00053
00054 protected:
00055 HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
00056
00057 bool DemuxInit();
00058 void DemuxSeek(REFERENCE_TIME rt);
00059 bool DemuxLoop();
00060
00061 public:
00062 CRoQSplitterFilter(LPUNKNOWN pUnk, HRESULT* phr);
00063 };
00064
00065 [uuid("02B8E5C2-4E1F-45D3-9A8E-B8F1EDE6DE09")]
00066 class CRoQSourceFilter : public CRoQSplitterFilter
00067 {
00068 public:
00069 CRoQSourceFilter(LPUNKNOWN pUnk, HRESULT* phr);
00070 };
00071
00072 [uuid("FBEFC5EC-ABA0-4E6C-ACA3-D05FDFEFB853")]
00073 class CRoQVideoDecoder : public CTransformFilter
00074 {
00075 CCritSec m_csReceive;
00076
00077 REFERENCE_TIME m_rtStart;
00078
00079 BYTE* m_y[2];
00080 BYTE* m_u[2];
00081 BYTE* m_v[2];
00082 int m_pitch;
00083
00084 void Copy(BYTE* pOut, BYTE* pIn, DWORD w, DWORD h);
00085
00086 #pragma pack(push, 1)
00087 struct roq_cell {BYTE y0, y1, y2, y3, u, v;} m_cells[256];
00088 struct roq_qcell {roq_cell* idx[4];} m_qcells[256];
00089 #pragma pack(pop)
00090 void apply_vector_2x2(int x, int y, roq_cell* cell);
00091 void apply_vector_4x4(int x, int y, roq_cell* cell);
00092 void apply_motion_4x4(int x, int y, unsigned char mv, char mean_x, char mean_y);
00093 void apply_motion_8x8(int x, int y, unsigned char mv, char mean_x, char mean_y);
00094
00095 public:
00096 CRoQVideoDecoder(LPUNKNOWN lpunk, HRESULT* phr);
00097 virtual ~CRoQVideoDecoder();
00098
00099 HRESULT NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate);
00100
00101 HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
00102 HRESULT CheckInputType(const CMediaType* mtIn);
00103 HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
00104 HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
00105 HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
00106
00107 HRESULT StartStreaming();
00108 HRESULT StopStreaming();
00109 };
00110
00111 [uuid("226FAF85-E358-4502-8C98-F4224BE76953")]
00112 class CRoQAudioDecoder : public CTransformFilter
00113 {
00114 public:
00115 CRoQAudioDecoder(LPUNKNOWN lpunk, HRESULT* phr);
00116 virtual ~CRoQAudioDecoder();
00117
00118 HRESULT Transform(IMediaSample* pIn, IMediaSample* pOut);
00119 HRESULT CheckInputType(const CMediaType* mtIn);
00120 HRESULT CheckTransform(const CMediaType* mtIn, const CMediaType* mtOut);
00121 HRESULT DecideBufferSize(IMemAllocator* pAllocator, ALLOCATOR_PROPERTIES* pProperties);
00122 HRESULT GetMediaType(int iPosition, CMediaType* pMediaType);
00123 };
00124