IAsyncReader::SyncRead 方法

IAsyncReader::SyncRead method

如何解释 "fill my buffer request" 即 returns S_FALSE ("I could read some but not all of the data you requested"),给定签名是:

HRESULT SyncRead(LONGLONG llPosition, LONG     lLength, BYTE     *pBuffer);

具体来说,当接口returnsS_FALSE时缓冲区有多少字节有效?

我需要知道,对吧?可能是我看傻了,我没看出来

IAsyncReader::SyncRead 是同步读取的快捷方式,无需考虑数据对齐。优化良好的过滤器通常执行 RequestWaitForNext 异步读取,使用媒体样本传输数据,实际数据长度附加到这些样本。在这种快捷方法中,他们似乎使事情变得更容易,但只是丢失了输出参数。

好消息是您可以获取 source code of the filter(或其近亲,因为自从源代码作为示例发布以来股票过滤器可能发生了一些变化)并通过添加例如扩展过滤器IAsyncReader2::SyncReadEx 在需要时 return 丢失的值。

微软自己this file的这段代码git:

// sync read. works in stopped state as well as run state.
// need not be aligned. Will fail if read is beyond actual total
// length.
STDMETHODIMP SyncRead(
                  LONGLONG llPosition,  // absolute file position
                  LONG lLength,         // nr bytes required
                  BYTE* pBuffer);       // write data here

// return total length of stream, and currently available length.
// reads for beyond the available length but within the total length will
// normally succeed but may block for a long period.
STDMETHODIMP Length(
                  LONGLONG* pTotal,
                  LONGLONG* pAvailable);

根据这两个记录在案的声明,我认为按以下方式推断读取的字节数是非常安全的。假设您想从位置 800 读取 70 个字节:

LONGLONG total, available;
pReader->Length(&total, &available);

LONG bytesRead = 70;
LONGLONG position = 800; 
if (S_FALSE == readerPtr->SyncRead(800, bytesRead, bufferPtr))
    bytesRead = total - position;

好像失败了,那么它可以读取的字节数仅受总大小的限制。