媒体播放器探索之IMediaObject

IMediaObject 接口为集成一个Directx媒体对象提供了诸多方法,其方法如下:

AllocateStreamingResources:

  这个函数通过媒体对象DMO分配任何需要的资源,这个方法的调用时可选的。如果成功返回S_OK,如果失败,这个返回值将指示错误。一个应用程序可以调用这个方法用作最优流,在流开始之前,这个应用程序会获得这个媒体对象去执行初始化的机会,在设置媒体格式之后调用了这个方法,在ProcessInput和ProcessOutput之前。

  HRESULT Discontinuity(

   DWORD dwInputStreamIndex

);

dwInputStreamIndex 以0为基础的索引,这个索引属于在一个媒体对象上的输入流

 返回值:

Return code

Description

DMO_E_INVALIDSTREAMINDEX

Invalid stream index

DMO_E_NOTACCEPTING

The DMO is not accepting input.

DMO_E_TYPE_NOT_SET

The input and output types have not been set.

S_OK

Success

一个中断信号出现以后,后续的输入流是不会再继续

 

Discountinuity:

   向一个指定的输入流中发射中断信号。

Flush:

HRESULT Flush();

刷新整个缓冲的数据

FreeStreamingResources:

HRESULT FreeStreamingResources();

这个方法的调用时可选的。这个方法释放AllocateStreamSource 分配的所有资源。

GetInputCurrentType:

HRESULT GetInputCurrentType(

        DWORD          dwInputStreamIndex,

  [out] DMO_MEDIA_TYPE *pmt

);

根据输入流类型的索引,得到当前媒体的格式。

typedef struct _DMOMediaType {

  GUID     majortype;//Major type GUID of the stream.

  GUID     subtype;//Subtype GUID of the stream.

  BOOL     bFixedSizeSamples;//If TRUE, samples are of a fixed size. This field is informational only. For audio, it is generally set to TRUE. For video, it is usually TRUE for uncompressed video and FALSE for compressed video.

  BOOL     bTemporalCompression;

/*如果是true  该例子是被压缩的使用暂时的使用帧间隔,意思是不是所有的帧都是关键帧,这个领域是仅有的信息。*/

  ULONG    lSampleSize;  // 该例子的大小用字节表示,对于压缩数据这个值可以是0.

  GUID     formattype;

/*指定媒体类型。

Format type:

  FORMAT_DvInfo 对应的结构体是

 

DVINFO:

  typedef struct tag_DVINFO {

  DWORD dwDVAAuxSrc;  // 指定第一个音频数据块的辅助资源包

  DWORD dwDVAAuxCtl; // 指定第一块音频数据块的音频辅助数据控制包

  DWORD dwDVAAuxSrc1; // 指定第二块的音频数据块的辅助包

  DWORD dwDVAAuxCtl1; // 指定第二块音频辅助数据包的音频辅助资源控制报

  DWORD dwDVVAuxSrc; // 指定第一块视频辅助资源包

  DWORD dwDVVAuxCtl; // 指定第一块块视频辅助控制资源包

  DWORD dwDVReserved[2]; // 保留,被设置为0.

} DVINFO, *PDVINFO;

 

 

  

  

*/

  IUnknown *pUnk; NULL

  ULONG    cbFormat;

  BYTE     *pbFormat;

} DMO_MEDIA_TYPE;

Format type: FORMAT_MPEG2Video 对应的结构体是

MPEG2VIDOEINFO:

typedef struct tagMPEG2VIDEOINFO {

  VIDEOINFOHEADER2 hdr;

/*

  typedef struct tagVIDEOINFOHEADER2 {

  RECT             rcSource;  // 原矩形大小

  RECT             rcTarget;  // 目标矩形大小

  DWORD            dwBitRate; // 视频流的大概比率。位每秒

  DWORD            dwBitErrorRate; // 视频流的错误数据比率,位每秒

  REFERENCE_TIME   AvgTimePerFrame; // 视频帧的显示时间,每纳秒

  DWORD            dwInterlaceFlags;

  DWORD            dwCopyProtectFlags;

  DWORD            dwPictAspectRatioX;

  DWORD            dwPictAspectRatioY;

  union {

    DWORD dwControlFlags;

    DWORD dwReserved1;

  };

  DWORD            dwReserved2;

  BITMAPINFOHEADER bmiHeader;

} VIDEOINFOHEADER2;

 

*/

  DWORD            dwStartTimeCode;

  DWORD            cbSequenceHeader;

  DWORD            dwProfile;

  DWORD            dwLevel;

  DWORD            dwFlags;

  DWORD            dwSequenceHeader[1];

} MPEG2VIDEOINFO;

Format type    Format structure

 

Format type

Format structure

FORMAT_DvInfo

DVINFO

FORMAT_MPEG2Video

MPEG2VIDEOINFO

FORMAT_MPEGVideo

MPEG1VIDEOINFO

FORMAT_None

None.

FORMAT_VideoInfo

VIDEOINFOHEADER

FORMAT_VideoInfo2

VIDEOINFOHEADER2

FORMAT_WaveFormatEx

WAVEFORMATEX

The caller must set the media type for the stream before calling this method. To set the media type, call theIMediaObject::SetInputType method.

GetInputMaxLatency:

HRESULT GetInputMaxLatency(

        DWORD          dwInputStreamIndex,

  [out] REFERENCE_TIME *prtMaxLatency

);

获得最大的延迟时间

GetInputSizeInfo:

HRESULT GetInputSizeInfo(

        DWORD dwInputStreamIndex, // 标识输入流

  [out] DWORD *pcbSize, //收到输入缓冲区的最小大小,用字节表示

  [out] DWORD *pcbMaxLookahead,// 能预测的最大数据,如果该出入流不预测数据,则是0

  [out] DWORD *pcbAlignment 输出序列需要的缓冲区,如果没有输出序列,则该值是1

);

 

对于一个指定的输入流需要多少缓冲区。

需要指定输入流的媒体类型。

GetInputStatus:

HRESULT GetInputStatus(

        DWORD dwInputStreamIndex, // 输入流的索引标志。

  [out] DWORD *dwFlags

);

查询指定的输入流的状态

GetInputStreamInfo:

HRESULT GetInputStreamInfo(

        DWORD dwInputStreamIndex,// 输入流的索引标志。

  [out] DWORD *pdwFlags

/*

enum _DMO_INPUT_STREAM_INFO_FLAGS {  DMO_INPUT_STREAMF_WHOLE_SAMPLES             = 0x00000001,

  DMO_INPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER  = 0x00000002,

  DMO_INPUT_STREAMF_FIXED_SAMPLE_SIZE         = 0x00000004,

  DMO_INPUT_STREAMF_HOLDS_BUFFERS             = 0x00000008

 

};

 

*/

);

 

GetInputType:

HRESULT GetInputType(

        DWORD          dwInputStreamIndex, // 输入流

        DWORD          dwTypeIndex, // ,媒体流

  [out] DMO_MEDIA_TYPE *pmt

 /*

  typedef struct _DMOMediaType {

  GUID     majortype;

  GUID     subtype;

  BOOL     bFixedSizeSamples;

  BOOL     bTemporalCompression;

  ULONG    lSampleSize;

  GUID     formattype;

  IUnknown *pUnk;

  ULONG    cbFormat;

  BYTE     *pbFormat;

} DMO_MEDIA_TYPE;

 

*/

);

根据索引获得输入流的媒体信息

 

GetOutputCurrentType:

HRESULT GetOutputCurrentType(

        DWORD          dwOutputStreamIndex,

  [out] DMO_MEDIA_TYPE *pmt

);

得到输出流的当前格式

GetOutputSizeInfo:

HRESULT GetOutputSizeInfo(

        DWORD dwOutputStreamIndex, // 输出流索引

  [out] DWORD *pcbSize, // 输出流的缓冲区的最小大小

  [out] DWORD *pcbAlignment // 输出队列的缓冲区,如果没有输出队列,则为1

);

 

GetOutputStreamInfo:

HRESULT GetOutputStreamInfo(

        DWORD dwOutputStreamIndex,

  [out] DWORD *pdwFlags

/*

enum _DMO_OUTPUT_STREAM_INFO_FLAGS {  DMO_OUTPUT_STREAMF_WHOLE_SAMPLES             = 0x00000001,

  DMO_OUTPUT_STREAMF_SINGLE_SAMPLE_PER_BUFFER  = 0x00000002,

  DMO_OUTPUT_STREAMF_FIXED_SAMPLE_SIZE         = 0x00000004,

  DMO_OUTPUT_STREAMF_DISCARDABLE               = 0x00000008,

  DMO_OUTPUT_STREAMF_OPTIONAL                  = 0x00000010

 

};

 

*/

);

根据索引得到输出流的信息

 

GetOutputType:HRESULT GetOutputType(

        DWORD          dwOutputStreamIndex,

        DWORD          dwTypeIndex,

  [out] DMO_MEDIA_TYPE *pmt

);

得到输出类型

 

GetStreamCount:

HRESULT GetStreamCount(

  [out] DWORD *pcInputStreams,

  [out] DWORD *pcOutputStreams

);

得到输入输出流的数量

 

Lock:

HRESULT Lock(

   LONG bLock

);

Block非0则需要,0则释放这个锁

 

ProcessInput: // 对指定的输入流传递缓冲区

HRESULT ProcessInput(

   DWORD          dwInputStreamIndex,

   IMediaBuffer   *pBuffer,

   DWORD          dwFlags,

enum _DMO_INPUT_DATA_BUFFER_FLAGS {  DMO_INPUT_DATA_BUFFERF_SYNCPOINT   = 0x00000001,

  DMO_INPUT_DATA_BUFFERF_TIME        = 0x00000002,

  DMO_INPUT_DATA_BUFFERF_TIMELENGTH  = 0x00000004

 

};

 

   REFERENCE_TIME rtTimestamp,

   REFERENCE_TIME rtTimelength

);

将输入流和缓冲区相关联

 

ProcessOutput:

SetInputMaxLatency:

HRESULT SetInputMaxLatency(

   DWORD          dwInputStreamIndex,

   REFERENCE_TIME rtMaxLatency

);

设置输入的最大延迟

 

SetInputType:

HRESULT SetInputType(

             DWORD          dwInputStreamIndex,

  [inconst DMO_MEDIA_TYPE *pmt,

             DWORD          dwFlags

);

设置输入类型

SetOutputType:

HRESULT SetOutputType(

             DWORD          dwOutputStreamIndex,

  [inconst DMO_MEDIA_TYPE *pmt,

             DWORD          dwFlags

);

设置输出类型

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值