ffmpeg Reading Media Reading from an IStream in a IOContext


The API call avio_alloc_context, which sets up a custom IO context, takes in a pointer to a Read function. If you are reading from an IStream, you can use the following:

 * Reads from an IStream into FFmpeg.
 * @param ptr       A pointer to the user-defined IO data structure.
 * @param buf       A buffer to read into.
 * @param buf_size  The size of the buffer buff.
 * @return The number of bytes read into the buffer.
int FileStreamRead(void* ptr, uint8_t* buf, int buf_size)
    // This is your IStream
    IStream* stream = reinterpret_cast<IStream*>(ptr);

    ULONG bytesRead = 0;
    HRESULT hr = stream->Read(buf, buf_size, &bytesRead);
    if(hr == S_FALSE)
        return AVERROR_EOF;  // End of file

        return -1;
    return bytesRead;