📄 dsmp4v.h
字号:
#ifndef _DSMP4V_H
#define _DSMP4V_H
#ifdef DEBUG2
#include <stdio.h>
#endif
#include "mp4v.h"
// {90348BCF-CB8E-4d8d-B67E-6C938906BBBB}
DEFINE_GUID(CLSID_DSMP4V,
0x90348bcf, 0xcb8e, 0x4d8d, 0xb6, 0x7e, 0x6c, 0x93, 0x89, 0x6, 0xbb, 0xbb);
// divx
DEFINE_GUID(CLSID_DIVX,
0x78766964, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
// DIVX
DEFINE_GUID(CLSID_DIVX_UC,
0x58564944, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
// DX50
DEFINE_GUID(CLSID_DIVX_50,
0x30355844, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
// RMP4
DEFINE_GUID(CLSID_RMP4,
0x34504d52, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71);
class MP4VDecoder : public CTransformFilter
{
private:
HINSTANCE m_hDecodeLibrary;
int (__cdecl *m_pMP4V_init)(void *, int, void *, void *);
int (__cdecl *m_pMP4V_decode)(void *, int, void *);
int m_DecodeBFrame;
MP4V_DEC_PARAM m_param;
MP4V_DEC_FRAME m_Frame;
DWORD m_BFrameOffset;
REFERENCE_TIME m_AvgTimePerFrame;
REFERENCE_TIME m_SyncPoint;
REFERENCE_TIME m_ReferenceCounter;
HRESULT TranslateColorSpace(GUID subtype, GUID formattype, void * format);
public:
MP4VDecoder(TCHAR *, LPUNKNOWN, REFCLSID clsid);
~MP4VDecoder();
// =================================================================
// ----- override these bits ---------------------------------------
// =================================================================
// The following methods are in CTransformFilter which is inherited.
// They are mentioned here for completeness
//
// These MUST be supplied in a derived class
//
// NOTE:
// virtual HRESULT Transform(IMediaSample * pIn, IMediaSample *pOut);
// virtual HRESULT CheckInputType(const CMediaType* mtIn) PURE;
// virtual HRESULT CheckTransform
// (const CMediaType* mtIn, const CMediaType* mtOut) PURE;
// static CCOMObject * CreateInstance(LPUNKNOWN, HRESULT *);
// virtual HRESULT DecideBufferSize
// (IMemAllocator * pAllocator, ALLOCATOR_PROPERTIES *pprop) PURE;
//virtual HRESULT GetMediaType(int iPosition, CMediaType *pMediaType) PURE;
static CUnknown * WINAPI CreateInstance(LPUNKNOWN punk, HRESULT *phr);
HRESULT Transform(IMediaSample *pIn, IMediaSample *pOut);
HRESULT CheckInputType (const CMediaType * mtIn);
HRESULT GetMediaType (int iPos, CMediaType * pmt);
HRESULT SetMediaType (PIN_DIRECTION direction, const CMediaType *pmt);
HRESULT CheckTransform (const CMediaType *mtIn, const CMediaType *mtOut);
HRESULT DecideBufferSize (IMemAllocator * pima, ALLOCATOR_PROPERTIES * pProperties);
//
// These MAY also be overridden
//
// virtual HRESULT StopStreaming();
// virtual HRESULT SetMediaType(PIN_DIRECTION direction,const CMediaType *pmt);
// virtual HRESULT CheckConnect(PIN_DIRECTION dir,IPin *pPin);
// virtual HRESULT BreakConnect(PIN_DIRECTION dir);
// virtual HRESULT CompleteConnect(PIN_DIRECTION direction,IPin *pReceivePin);
// virtual HRESULT EndOfStream(void);
// virtual HRESULT BeginFlush(void);
// virtual HRESULT EndFlush(void);
// virtual HRESULT NewSegment
// (REFERENCE_TIME tStart,REFERENCE_TIME tStop,double dRate);
HRESULT EndFlush();
#ifdef PERF
// If you override this - ensure that you register all these ids
// as well as any of your own,
virtual void RegisterPerfId() {
m_idSkip = MSR_REGISTER("Video Transform Skip frame");
m_idFrameType = MSR_REGISTER("Video transform frame type");
m_idLate = MSR_REGISTER("Video Transform Lateness");
m_idTimeTillKey = MSR_REGISTER("Video Transform Estd. time to next key");
CTransformFilter::RegisterPerfId();
}
#endif
protected:
// =========== QUALITY MANAGEMENT IMPLEMENTATION ========================
// Frames are assumed to come in three types:
// Type 1: an AVI key frame or an MPEG I frame.
// This frame can be decoded with no history.
// Dropping this frame means that no further frame can be decoded
// until the next type 1 frame.
// Type 1 frames are sync points.
// Type 2: an AVI non-key frame or an MPEG P frame.
// This frame cannot be decoded unless the previous type 1 frame was
// decoded and all type 2 frames since have been decoded.
// Dropping this frame means that no further frame can be decoded
// until the next type 1 frame.
// Type 3: An MPEG B frame.
// This frame cannot be decoded unless the previous type 1 or 2 frame
// has been decoded AND the subsequent type 1 or 2 frame has also
// been decoded. (This requires decoding the frames out of sequence).
// Dropping this frame affects no other frames. This implementation
// does not allow for these. All non-sync-point frames are treated
// as being type 2.
//
// The spacing of frames of type 1 in a file is not guaranteed. There MUST
// be a type 1 frame at (well, near) the start of the file in order to start
// decoding at all. After that there could be one every half second or so,
// there could be one at the start of each scene (aka "cut", "shot") or
// there could be no more at all.
// If there is only a single type 1 frame then NO FRAMES CAN BE DROPPED
// without losing all the rest of the movie. There is no way to tell whether
// this is the case, so we find that we are in the gambling business.
// To try to improve the odds, we record the greatest interval between type 1s
// that we have seen and we bet on things being no worse than this in the
// future.
// You can tell if it's a type 1 frame by calling IsSyncPoint().
// there is no architected way to test for a type 3, so you should override
// the quality management here if you have B-frames.
int m_nKeyFramePeriod; // the largest observed interval between type 1 frames
// 1 means every frame is type 1, 2 means every other.
int m_nFramesSinceKeyFrame; // Used to count frames since the last type 1.
// becomes the new m_nKeyFramePeriod if greater.
BOOL m_bSkipping; // we are skipping to the next type 1 frame
#ifdef PERF
int m_idFrameType; // MSR id Frame type. 1=Key, 2="non-key"
int m_idSkip; // MSR id skipping
int m_idLate; // MSR id lateness
int m_idTimeTillKey; // MSR id for guessed time till next key frame.
#endif
virtual HRESULT StartStreaming();
HRESULT AbortPlayback(HRESULT hr); // if something bad happens
HRESULT Receive(IMediaSample *pSample);
HRESULT AlterQuality(Quality q);
BOOL ShouldSkipFrame(IMediaSample * pIn);
int m_itrLate; // lateness from last Quality message
// (this overflows at 214 secs late).
int m_tDecodeStart; // timeGetTime when decode started.
int m_itrAvgDecode; // Average decode time in reference units.
BOOL m_bNoSkip; // debug - no skipping.
// We send an EC_QUALITY_CHANGE notification to the app if we have to degrade.
// We send one when we start degrading, not one for every frame, this means
// we track whether we've sent one yet.
BOOL m_bQualityChanged;
// When non-zero, don't pass anything to renderer until next keyframe
// If there are few keys, give up and eventually draw something
int m_nWaitForKey;
#ifdef DEBUG2
FILE *m_debug;
#endif
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -