diff --git a/samples/videoDecodeMem/videodecodemem.cpp b/samples/videoDecodeMem/videodecodemem.cpp index 7064133cae..5d7ea242a8 100644 --- a/samples/videoDecodeMem/videodecodemem.cpp +++ b/samples/videoDecodeMem/videodecodemem.cpp @@ -49,11 +49,7 @@ public: fp_in_.seekg (0, fp_in_.end); int length = fp_in_.tellg(); fp_in_.seekg (0, fp_in_.beg); - if (length > (100 * 1024 * 1024)) { // avioc_buffer_size = 100 * 1024 * 1024 in video_demuxer.h - std::cerr << "This app supports only file sizes upto 100MB! Please use a smaller file." << std::endl; - exit(-1); - } - + io_buffer_size_ = length; } ~FileStreamProvider() { fp_in_.close(); @@ -63,9 +59,11 @@ public: // We read a file for this example. You may get your data from network or somewhere else return static_cast(fp_in_.read(reinterpret_cast(p_buf), n_buf).gcount()); } + size_t GetBufferSize() { return io_buffer_size_; }; private: std::ifstream fp_in_; + size_t io_buffer_size_; }; void ShowHelpAndExit(const char *option = NULL) { diff --git a/utils/video_demuxer.h b/utils/video_demuxer.h index 4c5e438c43..2ede135701 100644 --- a/utils/video_demuxer.h +++ b/utils/video_demuxer.h @@ -32,6 +32,7 @@ extern "C" { } #include "rocdecode.h" + /*! * \file * \brief The AMD Video Demuxer for rocDecode Library. @@ -125,6 +126,7 @@ class VideoDemuxer { public: virtual ~StreamProvider() {} virtual int GetData(uint8_t *buf, int buf_size) = 0; + virtual size_t GetBufferSize() = 0; }; AVCodecID GetCodecID() { return av_video_codec_id_; }; VideoDemuxer(const char *input_file_path) : VideoDemuxer(CreateFmtContextUtil(input_file_path)) {} @@ -503,14 +505,14 @@ class VideoDemuxer { return nullptr; } uint8_t *avioc_buffer = nullptr; - int avioc_buffer_size = 100 * 1024 * 1024; + int avioc_buffer_size = stream_provider->GetBufferSize(); avioc_buffer = (uint8_t *)av_malloc(avioc_buffer_size); if (!avioc_buffer) { std::cerr << "ERROR: av_malloc failed!" << std::endl; return nullptr; } av_io_ctx_ = avio_alloc_context(avioc_buffer, avioc_buffer_size, - 0, stream_provider, &ReadPacket, nullptr, nullptr); + 0, stream_provider, &ReadPacket, nullptr, nullptr); if (!av_io_ctx_) { std::cerr << "ERROR: avio_alloc_context failed!" << std::endl; return nullptr;