CBasePin :: GetMediaType(int iPosition,...)方法的参数含义

时间:2012-08-28 03:35:59

标签: directshow

感谢所有观看我问题的人。

http://msdn.microsoft.com/en-us/library/windows/desktop/dd368709(v=vs.85).aspx

有关

iPosition参数的文档中不是很清楚
virtual HRESULT GetMediaType(
  int iPosition,
  CMediaType *pMediaType
);

据说" 从零开始的索引值。",但它是什么样的索引?样本指数?

我有一个发送H.264 NALU流的源过滤器(MEDIASUBTYPE_AVC1),除了在视频播放一段时间后可能会更改SPS / PPS外,它的效果非常好。

SPS和PPS附加到MPEG2VIDEOINFO结构,在调用CMediaType::SetFormat方法时以GetMediaType方法传递。

还有另一个GetMediaType版本,它接受iPosition参数。我似乎可以使用这种方法来更新SPS / PPS。

我的问题是: iPosition参数意味着什么,以及解码器过滤器如何知道为每个NALU样本分配了哪个SPS / PPS。

HRESULT GetMediaType(int iPosition, CMediaType *pMediaType)
{
    ATLTRACE( "\nGetMediaType( iPosition = %d ) ", iPosition);
    CheckPointer(pMediaType,E_POINTER);  
    CAutoLock lock(m_pFilter->pStateLock());

    if (iPosition < 0)
    {
        return E_INVALIDARG;
    }
    if (iPosition == 0)
    {
        pMediaType->InitMediaType();
        pMediaType->SetType(&MEDIATYPE_Video); 
        pMediaType->SetFormatType(&FORMAT_MPEG2Video);  
        pMediaType->SetSubtype(&MEDIASUBTYPE_AVC1);
        pMediaType->SetVariableSize();

    }

    int nCurrentSampleID;
    DWORD dwSize = m_pFlvFile->GetVideoFormatBufferSize(nCurrentSampleID);
    LPBYTE pBuffer = pMediaType->ReallocFormatBuffer(dwSize);
    memcpy( pBuffer, m_pFlvFile->GetVideoFormatBuffer(nCurrentSampleID), dwSize);

    pMediaType->SetFormat(pBuffer, dwSize);


    return S_OK;
}

1 个答案:

答案 0 :(得分:3)

iPosition用于提供不同的介质类型,如其他分辨率或不同的编码,或者在您的示例中可能是原始h246。如果您只提供一种类型,那没关系,但如果iPosition为高,请不要忘记发送VFW_S_NO_MORE_ITEMS

使用mediasamples发送sps / pps更改。您只需add your new mediatype FillBuffer中的当前示例。有些解码器甚至不需要它,它们只是从数据流中读取sps / pps。