diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2013-03-18 09:54:00 +0100 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2013-03-18 09:54:00 +0100 |
commit | 5e805b5dfd368f1c59635b29e71cb752b9465819 (patch) | |
tree | 8a18448bfdec32fab616244117a425d12651faf8 | |
parent | b7f4536fe144da31cf1843dad5fa01c630c23bf5 (diff) | |
download | vdr-5e805b5dfd368f1c59635b29e71cb752b9465819.tar.gz vdr-5e805b5dfd368f1c59635b29e71cb752b9465819.tar.bz2 |
The cutter now allocates its buffers on the heap to avoid problems on systems with limited stack space
-rw-r--r-- | CONTRIBUTORS | 2 | ||||
-rw-r--r-- | HISTORY | 2 | ||||
-rw-r--r-- | cutter.c | 27 |
3 files changed, 26 insertions, 5 deletions
diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 3cec144e..0f49d10b 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -2919,6 +2919,8 @@ Juergen Lock <vdr-l@jelal.kn-bremen.de> in case, for instance, there is now a DVB-T device where there used to be a bonded DVB-S device for fixing a possible deadlock in handling the tuners of bonded devices + for suggesting to allocate the cutter's buffers on the heap to avoid problems on + systems with limited stack space Sergiu Dotenco <sergiu.dotenco@googlemail.com> for reporting a missing initialization in sDvbSpuRect @@ -7767,3 +7767,5 @@ Video Disk Recorder Revision History (thanks to Johann Friedrichs). - The "Resume" button in the main menu is now only active if the respective recording actually exists (reported by Johann Friedrichs). +- The cutter now allocates its buffers on the heap to avoid problems on systems with + limited stack space (suggested by Juergen Lock). @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: cutter.c 2.24 2013/02/17 14:11:03 kls Exp $ + * $Id: cutter.c 2.25 2013/03/18 09:40:49 kls Exp $ */ #include "cutter.h" @@ -362,11 +362,22 @@ bool cCuttingThread::SwitchFile(bool Force) return true; } +class cHeapBuffer { +private: + uchar *buffer; +public: + cHeapBuffer(int Size) { buffer = MALLOC(uchar, Size); } + ~cHeapBuffer() { free(buffer); } + operator uchar * () { return buffer; } + }; + bool cCuttingThread::FramesAreEqual(int Index1, int Index2) { + cHeapBuffer Buffer1(MAXFRAMESIZE); + cHeapBuffer Buffer2(MAXFRAMESIZE); + if (!Buffer1 || !Buffer2) + return false; bool Independent; - uchar Buffer1[MAXFRAMESIZE]; - uchar Buffer2[MAXFRAMESIZE]; int Length1; int Length2; if (LoadFrame(Index1, Buffer1, Independent, Length1) && LoadFrame(Index2, Buffer2, Independent, Length2)) { @@ -386,12 +397,14 @@ bool cCuttingThread::FramesAreEqual(int Index1, int Index2) void cCuttingThread::GetPendingPackets(uchar *Data, int &Length, int Index) { + cHeapBuffer Buffer(MAXFRAMESIZE); + if (!Buffer) + return; bool Processed[MAXPID] = { false }; cPacketStorage PacketStorage; int64_t LastPts = lastVidPts + delta;// adding one frame length to fully cover the very last frame Processed[patPmtParser.Vpid()] = true; // we only want non-video packets for (int NumIndependentFrames = 0; NumIndependentFrames < 2; Index++) { - uchar Buffer[MAXFRAMESIZE]; bool Independent; int len; if (LoadFrame(Index, Buffer, Independent, len)) { @@ -534,8 +547,12 @@ bool cCuttingThread::ProcessSequence(int LastEndIndex, int BeginIndex, int EndIn bool SeamlessBegin = LastEndIndex >= 0 && FramesAreEqual(LastEndIndex, BeginIndex); bool SeamlessEnd = NextBeginIndex >= 0 && FramesAreEqual(EndIndex, NextBeginIndex); // Process all frames from BeginIndex (included) to EndIndex (excluded): + cHeapBuffer Buffer(MAXFRAMESIZE); + if (!Buffer) { + error = "malloc"; + return false; + } for (int Index = BeginIndex; Running() && Index < EndIndex; Index++) { - uchar Buffer[MAXFRAMESIZE]; bool Independent; int Length; if (LoadFrame(Index, Buffer, Independent, Length)) { |