aboutsummaryrefslogtreecommitdiff
path: root/Src/Plugins/Input/in_wmvdrm/AllocLayer.h
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Plugins/Input/in_wmvdrm/AllocLayer.h')
-rw-r--r--Src/Plugins/Input/in_wmvdrm/AllocLayer.h80
1 files changed, 80 insertions, 0 deletions
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 <cassert>
+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