私の質問を見てくれた皆さんに感謝します。
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;
}