C++ IAsyncReader::SyncRead方法
如果签名是:C++ IAsyncReader::SyncRead方法,c++,windows,directshow,multimedia,C++,Windows,Directshow,Multimedia,如果签名是: HRESULT SyncRead(LONGLONG llPosition, LONG lLength, BYTE *pBuffer); 具体来说,当接口返回S_FALSE时,缓冲区的有效字节数是多少 我需要知道,对吗?也许我有点傻,但我看不出来。IAsyncReader::SyncRead是一种同步读取的快捷方式,无需考虑数据对齐。优化良好的过滤器通常进行Request和WaitForNext异步读取,使用附加到这些样本的实际数据长度的媒体样本传输数据。在这种快捷
HRESULT SyncRead(LONGLONG llPosition, LONG lLength, BYTE *pBuffer);
具体来说,当接口返回S_FALSE
时,缓冲区的有效字节数是多少
我需要知道,对吗?也许我有点傻,但我看不出来。
IAsyncReader::SyncRead
是一种同步读取的快捷方式,无需考虑数据对齐。优化良好的过滤器通常进行Request
和WaitForNext
异步读取,使用附加到这些样本的实际数据长度的媒体样本传输数据。在这种快捷方式中,它们似乎使事情变得更简单,但只是丢失了输出参数
好消息是,您可以抓取(或者是它的近亲,因为股票过滤器可能在源代码作为示例发布后发生了一些变化)并通过添加例如
iasyncreder2::SyncReadEx来扩展过滤器,在需要时在其中返回丢失的值。查看Microsoft自己的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;
如果它失败了,那么它可以读取的字节数只受总大小的限制。我不是DirectX开发人员,但可能只是从流中减去请求的llPosition
,以获得可用的字节。似乎没有任何输出来说明读取了多少字节。否则,您可能必须使用和。在这种情况下,您是否可以将total-position
替换为available
?@RemyLebeau不这样认为,根据读取数据,超出可用长度,但在总长度内通常会succeed@RemyLebeau:总计不必存在。API的设计方式是,数据可以在不知道确切媒体资产大小的情况下进行流式传输。因此,SyncRead没有实际数据长度是一个设计缺陷。但由于它无论如何都不能用于设计良好的软件项目,因此该缺陷不是致命的。