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
是同步读取的快捷方式,无需考虑数据对齐。优化良好的过滤器通常执行 Request
和 WaitForNext
异步读取,使用媒体样本传输数据,实际数据长度附加到这些样本。在这种快捷方法中,他们似乎使事情变得更容易,但只是丢失了输出参数。
好消息是您可以获取 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;
好像失败了,那么它可以读取的字节数仅受总大小的限制。
如何解释 "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
是同步读取的快捷方式,无需考虑数据对齐。优化良好的过滤器通常执行 Request
和 WaitForNext
异步读取,使用媒体样本传输数据,实际数据长度附加到这些样本。在这种快捷方法中,他们似乎使事情变得更容易,但只是丢失了输出参数。
好消息是您可以获取 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;
好像失败了,那么它可以读取的字节数仅受总大小的限制。