Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ IAsyncReader::SyncRead方法_C++_Windows_Directshow_Multimedia - Fatal编程技术网

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没有实际数据长度是一个设计缺陷。但由于它无论如何都不能用于设计良好的软件项目,因此该缺陷不是致命的。