Здравствуйте, romson, Вы писали:
R>Здравствуйте, bolivar, Вы писали:
B>>кто-нибудь может подсказать ,где в файле формата AVI находятся REFERENCE_TIME данные самплов ?
R>Насколько я знаю, REFERENCE_TIME данные в AVI не хранятся. В заголовке каждого потока есть данные о его продолжительности и количестве сэмплов. Исходя из этого, можно вычислить время каждого сэмпла по его номеру.
R>Хотя, может быть, какие-нибудь кодеки и помещают свои REFERENCE_TIME в закодированные сэмплы, но к формату AVI это уже не имеет никакого отношения.
R>ЗЫ. Про формат AVI можно почитать здесь.
спасибо за информацию.
как понять кусок из filesink.c (quartz — проект wine):
static HRESULT CFileWriterPinImpl_Receive( CPinBaseImpl* pImpl, IMediaSample* pSample )
{
CFileWriterPinImpl_THIS(pImpl,pin);
BYTE* pData = NULL;
LONG lLength;
ULONG cbWritten;
HRESULT hr;
REFERENCE_TIME rtStart;
REFERENCE_TIME rtEnd;
LARGE_INTEGER dlibMove;
TRACE( "(%p,%p)\n",This,pSample );
if ( This->pRender->m_fInFlush )
return S_FALSE;
if ( pSample == NULL )
return E_POINTER;
hr = IMediaSample_GetPointer(pSample,&pData);
if ( FAILED(hr) )
return hr;
lLength = (LONG)IMediaSample_GetActualDataLength(pSample);
if ( lLength == 0 )
return S_OK;
if ( lLength < 0 )
{
ERR( "invalid length: %ld\n", lLength );
return S_OK;
}
hr = IMediaSample_GetTime( pSample, &rtStart, &rtEnd );
if ( FAILED(hr) )
return hr;
dlibMove.QuadPart = rtStart;
hr = IStream_Seek(CFileWriterPinImpl_IStream(This),dlibMove,STREAM_SEEK_SET,NULL);
if ( FAILED(hr) )
return hr;
hr = IStream_Write(CFileWriterPinImpl_IStream(This),pData,lLength,&cbWritten);
return hr;
}