From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/Plugins/Input/in_wmvdrm/AllocLayer.h | 80 ++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 Src/Plugins/Input/in_wmvdrm/AllocLayer.h (limited to 'Src/Plugins/Input/in_wmvdrm/AllocLayer.h') diff --git a/Src/Plugins/Input/in_wmvdrm/AllocLayer.h b/Src/Plugins/Input/in_wmvdrm/AllocLayer.h new file mode 100644 index 00000000..ed07a3bd --- /dev/null +++ b/Src/Plugins/Input/in_wmvdrm/AllocLayer.h @@ -0,0 +1,80 @@ +#ifndef NULLSOFT_ALLOCLAYERH +#define NULLSOFT_ALLOCLAYERH + +#include "WMHandler.h" +#include "BufferPool.h" +#include +class AllocLayer : public WMHandler +{ +public: + AllocLayer(IWMReader *reader) + : readerAdvanced(0), + listenOutput( -1), + maxSize(0) + + { + reader->QueryInterface(&readerAdvanced); + + } + ~AllocLayer() + { + if (readerAdvanced) + { + readerAdvanced->Release(); + readerAdvanced = 0; + } + } + + void Listen(long output) + { + listenOutput = output; + if (output != -1) + { + readerAdvanced->SetAllocateForOutput(listenOutput, TRUE); + readerAdvanced->GetMaxOutputSampleSize(listenOutput, &maxSize); + assert(maxSize>0); + pool.SetAllocSize(maxSize); + } + } + + void Listen(long output, long numBuffers) + { + listenOutput = output; + if (output != -1) + { + readerAdvanced->SetAllocateForOutput(listenOutput, TRUE); + readerAdvanced->GetMaxOutputSampleSize(listenOutput, &maxSize); + assert(maxSize>0); + pool.SetAllocSize(maxSize); + pool.PreAllocate(numBuffers); + pool.limit=numBuffers; + + } + } + + void FreeBuffers() + { + pool.FreeBuffers(); + } + + + BufferPool pool; +private: + + void AllocateOutput(long outputNum, long bufferSize, INSSBuffer *&buffer) + { + if (outputNum == listenOutput) + { + assert(maxSize >= bufferSize); + buffer = pool.GetBuffer(bufferSize); + } + else + WMHandler::AllocateOutput(outputNum, bufferSize, buffer); // let other handlers have a shot at it first. + } + + // WMHandler + long listenOutput; + DWORD maxSize; + IWMReaderAdvanced *readerAdvanced; +}; +#endif -- cgit