Win32 API 日本語リファレンス
ホームMedia.MediaFoundation › IMFByteStream

IMFByteStream

COM
IIDad4c1b00-4bf7-422f-9175-756693d9130d継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

ローカルファイル、ネットワークファイル、その他のソースなど、何らかのデータソースからのバイトストリームを表します。

解説(Remarks)

次の関数は、ローカルファイルに対する IMFByteStream ポインターを返します。

メディアソース用のバイトストリームは、読み取りアクセスで開くことができます。アーカイブメディアシンク用のバイトストリームは、読み取りと書き込みの両方のアクセスで開く必要があります。(アーカイブシンクは書き込み中にファイルの一部を読み取る必要がある場合があるため、読み取りアクセスが必要になることがあります。)

このインターフェイスの実装によっては、次のインターフェイスの一つ以上を公開するものもあります。

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

メソッド 15

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT GetCapabilities(DWORD* pdwCapabilities)

バイトストリームの特性を取得します。

pdwCapabilitiesDWORD*out

0 個以上のフラグのビットごとの OR を受け取ります。次のフラグが定義されています。

意味
MFBYTESTREAM_IS_READABLE
0x00000001
バイトストリームは読み取り可能です。
MFBYTESTREAM_IS_WRITABLE
0x00000002
バイトストリームは書き込み可能です。
MFBYTESTREAM_IS_SEEKABLE
0x00000004
バイトストリームはシーク可能です。
MFBYTESTREAM_IS_REMOTE
0x00000008
バイトストリームはネットワークなどのリモートソースから取得されています。
MFBYTESTREAM_IS_DIRECTORY
0x00000080
バイトストリームはファイルディレクトリを表します。
MFBYTESTREAM_HAS_SLOW_SEEK
0x00000100
このストリーム内でのシークが遅くなる可能性があります。たとえば、バイトストリームがネットワークからダウンロードしている場合などです。
MFBYTESTREAM_IS_PARTIALLY_DOWNLOADED
0x00000200
バイトストリームは現在、ローカルキャッシュにデータをダウンロードしています。 データが完全にダウンロードされるまで、バイトストリームに対する読み取り操作に時間がかかる場合があります。

このフラグは、すべてのデータがダウンロードされた後にクリアされます。

MFBYTESTREAM_HAS_SLOW_SEEK フラグも設定されている場合、バイトストリームはファイル全体を順番にダウンロードする必要があることを意味します。それ以外の場合、バイトストリームはストリーム内の新しい位置からダウンロードを再開することでシーク要求に応答できます。

MFBYTESTREAM_SHARE_WRITE
0x00000400
別のスレッドまたはプロセスが、このバイトストリームを書き込み用に開くことができます。このフラグが存在する場合、バイトストリームの読み取り中にその長さが変化する可能性があります。

このフラグは、バイトストリームハンドラーの動作に影響を与える場合があります。詳細については、MF_BYTESTREAMHANDLER_ACCEPTS_SHARE_WRITE を参照してください。

注意 Windows 7 以降が必要です。
MFBYTESTREAM_DOES_NOT_USE_NETWORK
0x00000800
バイトストリームは現在、コンテンツを受信するためにネットワークを使用していません。このビットが設定されている場合、ネットワークハードウェアが省電力状態に移行することがあります。
注意 Windows 8 以降が必要です。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

vtbl 4 HRESULT GetLength(ULONGLONG* pqwLength)

ストリームの長さを取得します。

pqwLengthULONGLONG*outストリームの長さをバイト単位で受け取ります。長さが不明な場合、この値は -1 になります。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

vtbl 5 HRESULT SetLength(ULONGLONG qwLength)

ストリームの長さを設定します。

qwLengthULONGLONGinストリームの長さ (バイト単位)。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

vtbl 6 HRESULT GetCurrentPosition(ULONGLONG* pqwPosition)

ストリーム内の現在の読み取りまたは書き込み位置を取得します。

pqwPositionULONGLONG*out現在の位置をバイト単位で受け取ります。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

現在の位置を更新するメソッドは、ReadBeginReadWriteBeginWriteSetCurrentPosition、および Seek です。

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

vtbl 7 HRESULT SetCurrentPosition(ULONGLONG qwPosition)

現在の読み取りまたは書き込み位置を設定します。

qwPositionULONGLONGinストリームの先頭からのバイトオフセットとして指定する、ストリーム内の新しい位置。

戻り値

このメソッドは HRESULT を返します。指定できる値には、次の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_INVALIDARG
引数が無効です。

解説(Remarks)

新しい位置がストリームの長さより大きい場合、このメソッドは E_INVALIDARG を返します。

実装に関する注意:このメソッドは、qwPosition パラメーターに渡された値に現在の位置を設定することで、ストリーム内の現在の位置を更新する必要があります。現在の位置を更新できるその他のメソッドは、ReadBeginReadWriteBeginWrite、および Seek です。

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

vtbl 8 HRESULT IsEndOfStream(BOOL* pfEndOfStream)

現在の位置がストリームの終端に達したかどうかを照会します。

pfEndOfStreamBOOL*outストリームの終端に達した場合は TRUE、それ以外の場合は FALSE を受け取ります。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

vtbl 9 HRESULT Read(BYTE* pb, DWORD cb, DWORD* pcbRead)

ストリームからデータを読み取ります。

pbBYTE*outデータを受け取るバッファーへのポインター。呼び出し元がバッファーを割り当てる必要があります。
cbDWORDinバッファーのサイズ (バイト単位)。
pcbReadDWORD*outバッファーにコピーされたバイト数を受け取ります。このパラメーターに NULL を指定することはできません。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

このメソッドは、ストリームの現在の位置から最大で cb バイトを読み取り、呼び出し元が提供するバッファーにコピーします。読み取られたバイト数は pcbRead パラメーターで返されます。このメソッドはファイルの終端に達してもエラーコードを返さないため、アプリケーションはメソッドが戻った後に pcbRead の値を確認する必要があります。

このメソッドは同期的です。読み取り操作が完了するまでブロックします。

実装に関する注意:このメソッドは、読み取られたバイト数 (pcbRead パラメーターで返される値で指定される) を現在の位置に加算することで、ストリーム内の現在の位置を更新する必要があります。現在の位置を更新できるその他のメソッドは、ReadWriteBeginWriteSeek、および SetCurrentPosition です。

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

次の例は、バイトストリームから呼び出し元が割り当てたメディアバッファーにデータを読み取ります。メディアバッファーの詳細については、Media Buffers を参照してください。

// Read data from a byte stream into a media buffer.
//
// This function reads a maximum of cbMax bytes, or up to the size of the 
// buffer, whichever is smaller. If the end of the byte stream is reached, the 
// actual amount of data read might be less than either of these values.
//
// To find out how much data was read, call IMFMediaBuffer::GetCurrentLength.

HRESULT ReadFromByteStream(
    IMFByteStream *pStream,     // Pointer to the byte stream.
    IMFMediaBuffer *pBuffer,    // Pointer to the media buffer.
    DWORD cbMax                 // Maximum amount to read.
    )
{
    DWORD cbBufferMax = 0;
    DWORD cbRead = 0;
    BYTE *pData= NULL;

    HRESULT hr = pBuffer->Lock(&pData, &cbBufferMax, NULL);

    // Do not exceed the maximum size of the buffer.
    if (SUCCEEDED(hr))
    {
        if (cbMax > cbBufferMax)
        {
            cbMax = cbBufferMax;
        }

        // Read up to cbMax bytes.
        hr = pStream->Read(pData, cbMax, &cbRead);
    }

    // Update the size of the valid data in the buffer.
    if (SUCCEEDED(hr))
    {
        hr = pBuffer->SetCurrentLength(cbRead);
    }
    if (pData)
    {
        pBuffer->Unlock();
    }
    return hr;
}

次の例は同様ですが、データを保持するために新しいメディアバッファーを割り当てます。

注意 この例では、インターフェイスポインターを解放するために SafeRelease 関数を使用しています。
//-------------------------------------------------------------------
// AllocReadFromByteStream
//
// Reads data from a byte stream and returns a media buffer that
// contains the data.
//-------------------------------------------------------------------

HRESULT AllocReadFromByteStream(
    IMFByteStream *pStream,         // Pointer to the byte stream.
    DWORD cbToRead,                 // Number of bytes to read.
    IMFMediaBuffer **ppBuffer       // Receives a pointer to the media buffer. 
    )
{
    HRESULT hr = S_OK;
    BYTE *pData = NULL;
    DWORD cbRead = 0;   // Actual amount of data read.

    IMFMediaBuffer *pBuffer = NULL;

    // Create the media buffer. 
    // This function allocates the memory for the buffer.
    hr = MFCreateMemoryBuffer(cbToRead, &pBuffer);

    // Get a pointer to the memory buffer.
    if (SUCCEEDED(hr))
    {
        hr = pBuffer->Lock(&pData, NULL, NULL);
    }

    // Read the data from the byte stream.
    if (SUCCEEDED(hr))
    {
        hr = pStream->Read(pData, cbToRead, &cbRead);
    }

    // Update the size of the valid data in the buffer.
    if (SUCCEEDED(hr))
    {
        hr = pBuffer->SetCurrentLength(cbRead);
    }

    // Return the pointer to the caller.
    if (SUCCEEDED(hr))
    {
        *ppBuffer = pBuffer;
        (*ppBuffer)->AddRef();
    }

    if (pData)
    {
        pBuffer->Unlock();
    }
    SafeRelease(&pBuffer);
    return hr;
}
vtbl 10 HRESULT BeginRead(BYTE* pb, DWORD cb, IMFAsyncCallback* pCallback, IUnknown* punkState)

ストリームからの非同期読み取り操作を開始します。

pbBYTE*outデータを受け取るバッファーへのポインター。呼び出し元がバッファーを割り当てる必要があります。
cbDWORDinバッファーのサイズ (バイト単位)。
pCallbackIMFAsyncCallback*inコールバックオブジェクトの IMFAsyncCallback インターフェイスへのポインター。呼び出し元がこのインターフェイスを実装する必要があります。
punkStateIUnknown*in呼び出し元が定義する状態オブジェクトの IUnknown インターフェイスへのポインター。このパラメーターは NULL にすることができます。このオブジェクトを使用して状態情報を保持できます。コールバックが呼び出されるときに、このオブジェクトが呼び出し元に返されます。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

すべてのデータがバッファーに読み取られると、コールバックオブジェクトの IMFAsyncCallback::Invoke メソッドが呼び出されます。その時点で、アプリケーションは IMFByteStream::EndRead を呼び出して非同期要求を完了する必要があります。

非同期読み取りが保留中の間は、バッファーの読み取り、書き込み、解放、または再割り当てを行わないでください。

実装に関する注意:このメソッドは、読み取られるバイト数 (pcbRead パラメーターで返される値で指定される) を現在の位置に加算することで、ストリーム内の現在の位置を更新する必要があります。現在の位置を更新できるその他のメソッドは、BeginReadWriteBeginWriteSeek、および SetCurrentPosition です。

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

vtbl 11 HRESULT EndRead(IMFAsyncResult* pResult, DWORD* pcbRead)

非同期読み取り操作を完了します。

pResultIMFAsyncResult*inIMFAsyncResult インターフェイスへのポインター。コールバックオブジェクトが IMFAsyncCallback::Invoke メソッドで受け取ったものと同じポインターを渡します。
pcbReadDWORD*out読み取られたバイト数を受け取ります。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

IMFByteStream::BeginRead メソッドが非同期に完了した後に、このメソッドを呼び出します。

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

vtbl 12 HRESULT Write(BYTE* pb, DWORD cb, DWORD* pcbWritten)

ストリームにデータを書き込みます。

pbBYTE*in書き込むデータを格納するバッファーへのポインター。
cbDWORDinバッファーのサイズ (バイト単位)。
pcbWrittenDWORD*out書き込まれたバイト数を受け取ります。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

このメソッドは、ストリームの現在の位置から開始して、pb バッファーの内容をストリームに書き込みます。書き込まれたバイト数は pcbWritten パラメーターで返されます。

このメソッドは同期的です。書き込み操作が完了するまでブロックします。

実装に関する注意:このメソッドは、ストリームに書き込まれたバイト数 (pcbWritten で返される値で指定される) を現在の位置オフセットに加算することで、ストリーム内の現在の位置を更新する必要があります。

現在の位置を更新できるその他のメソッドは、ReadBeginReadBeginWriteSeek、および SetCurrentPosition です。

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

次の例は、メディアバッファーからバイトストリームにデータを書き込みます。メディアバッファーの詳細については、Media Buffers を参照してください。

//-------------------------------------------------------------------
// WriteBufferToByteStream
//
// Writes data from a media buffer to a byte stream.
//-------------------------------------------------------------------

HRESULT WriteBufferToByteStream(
    IMFByteStream *pStream,   // Pointer to the byte stream.
    IMFMediaBuffer *pBuffer,  // Pointer to the media buffer.
    DWORD *pcbWritten         // Receives the number of bytes written.
    )
{
    HRESULT hr = S_OK;
    DWORD cbData = 0;
    DWORD cbWritten = 0;
    BYTE *pMem = NULL;

    hr = pBuffer->Lock(&pMem, NULL, &cbData);

    if (SUCCEEDED(hr))
    {
        hr = pStream->Write(pMem, cbData, &cbWritten);
    }

    if (SUCCEEDED(hr))
    {
        if (pcbWritten)
        {
            *pcbWritten = cbWritten;
        }
    }

    if (pMem)
    {
        pBuffer->Unlock();
    }
    return hr;
}

次の関数テンプレートは、型指定された変数をバイトストリームに書き込みます。

template <class T>
HRESULT WriteToStream(
    IMFByteStream *pStream, // Pointer to the byte stream.
    const T* p,             // Data to write to the stream.
    ULONG cb = sizeof(T)    // Size of the data in bytes.
)
{
    ULONG cbWritten = 0;
    HRESULT hr = S_OK;

    hr = pStream->Write((const BYTE*)p, cb, &cbWritten);
    if (SUCCEEDED(hr) && (cbWritten != cb))
    {
        hr = E_FAIL;
    }
    return hr;
}
vtbl 13 HRESULT BeginWrite(BYTE* pb, DWORD cb, IMFAsyncCallback* pCallback, IUnknown* punkState)

ストリームへの非同期書き込み操作を開始します。

pbBYTE*in書き込むデータを格納するバッファーへのポインター。
cbDWORDinバッファーのサイズ (バイト単位)。
pCallbackIMFAsyncCallback*inコールバックオブジェクトの IMFAsyncCallback インターフェイスへのポインター。呼び出し元がこのインターフェイスを実装する必要があります。
punkStateIUnknown*in呼び出し元が定義する状態オブジェクトの IUnknown インターフェイスへのポインター。このパラメーターは NULL にすることができます。このオブジェクトを使用して状態情報を保持できます。コールバックが呼び出されるときに、このオブジェクトが呼び出し元に返されます。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

すべてのデータがストリームに書き込まれると、コールバックオブジェクトの IMFAsyncCallback::Invoke メソッドが呼び出されます。その時点で、アプリケーションは IMFByteStream::EndWrite を呼び出して非同期要求を完了する必要があります。

非同期書き込みがまだ保留中の間は、バッファーの再割り当て、解放、または書き込みを行わないでください。

実装に関する注意:このメソッドは、ストリームに書き込まれるバイト数 (pcbWritten で返される値で指定される) を現在の位置に加算することで、ストリーム内の現在の位置を更新する必要があります。現在の位置を更新できるその他のメソッドは、ReadBeginReadWriteSeek、および SetCurrentPosition です。

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

vtbl 14 HRESULT EndWrite(IMFAsyncResult* pResult, DWORD* pcbWritten)

非同期書き込み操作を完了します。

pResultIMFAsyncResult*inIMFAsyncResult インターフェイスへのポインター。コールバックオブジェクトが IMFAsyncCallback::Invoke メソッドで受け取ったものと同じポインターを渡します。
pcbWrittenDWORD*out書き込まれたバイト数を受け取ります。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

IMFByteStream::BeginWrite メソッドが非同期に完了したときに、このメソッドを呼び出します。

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

vtbl 15 HRESULT Seek(MFBYTESTREAM_SEEK_ORIGIN SeekOrigin, LONGLONG llSeekOffset, DWORD dwSeekFlags, ULONGLONG* pqwCurrentPosition)

指定されたオフセットだけストリーム内の現在の位置を移動します。

SeekOriginMFBYTESTREAM_SEEK_ORIGINinMFBYTESTREAM_SEEK_ORIGIN 列挙体のメンバーとして、シークの起点を指定します。オフセットはこの位置を基準に計算されます。
llSeekOffsetLONGLONGinシークの起点からのバイトオフセットとして、新しい位置を指定します。
dwSeekFlagsDWORDin

0 個以上のフラグを指定します。次のフラグが定義されています。

意味
MFBYTESTREAM_SEEK_FLAG_CANCEL_PENDING_IO
シーク要求が正常に完了した後、保留中のすべての I/O 要求がキャンセルされます。
pqwCurrentPositionULONGLONG*outシーク後の新しい位置を受け取ります。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

実装に関する注意: このメソッドは、qwSeekOffset をシークの SeekOrigin 位置に加算することで、ストリーム内の現在の位置を更新する必要があります。これは pqwCurrentPosition パラメーターで返される値と同じである必要があります。 現在の位置を更新できるその他のメソッドは、ReadBeginReadWriteBeginWrite、および SetCurrentPosition です。
vtbl 16 HRESULT Flush()

ストリームが使用する内部バッファーをすべてクリアします。ストリームに書き込んでいる場合、バッファーされたデータは、基になるファイルまたはデバイスに書き込まれます。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

バイトストリームが読み取り専用の場合、このメソッドは何も行いません。

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

vtbl 17 HRESULT Close()

ストリームを閉じ、ソケットやファイルハンドルなど、ストリームに関連付けられたリソースをすべて解放します。このメソッドは、保留中の非同期 I/O 要求もすべてキャンセルします。

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

Windows Media Format 11 SDK の再頒布可能コンポーネントがインストールされている場合、このインターフェイスは次のプラットフォームで利用できます。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IMFByteStream "{AD4C1B00-4BF7-422F-9175-756693D9130D}"
#usecom global IMFByteStream IID_IMFByteStream "{}"
#comfunc global IMFByteStream_GetCapabilities     3 var
#comfunc global IMFByteStream_GetLength           4 var
#comfunc global IMFByteStream_SetLength           5 int64
#comfunc global IMFByteStream_GetCurrentPosition  6 var
#comfunc global IMFByteStream_SetCurrentPosition  7 int64
#comfunc global IMFByteStream_IsEndOfStream       8 var
#comfunc global IMFByteStream_Read                9 var,int,var
#comfunc global IMFByteStream_BeginRead           10 var,int,sptr,sptr
#comfunc global IMFByteStream_EndRead             11 sptr,var
#comfunc global IMFByteStream_Write               12 var,int,var
#comfunc global IMFByteStream_BeginWrite          13 var,int,sptr,sptr
#comfunc global IMFByteStream_EndWrite            14 sptr,var
#comfunc global IMFByteStream_Seek                15 int,int64,int,var
#comfunc global IMFByteStream_Flush               16
#comfunc global IMFByteStream_Close               17
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。