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 if(FAILED(hr)) return -1; return bytesRead; }