On Mon, Mar 18, 2013 at 09:13:02AM +0100, Klaus Schmidinger wrote: > On 18.03.2013 08:41, Gerhard Brauer wrote: > > > > The cutting process now works without segfaulting or unbehavior exit > > of the vdr process itself - but during cutting i got A LOT of "frame > > larger than buffer" x greater then 8 (8 is fix in all messages). > > ----------- > > Mar 18 08:30:12 s01 vdr: [50364416] ERROR: frame larger than buffer (17392 > 8) > > Mar 18 08:30:12 s01 vdr: [50364416] ERROR: frame larger than buffer (17514 > 8) > > Mar 18 08:30:12 s01 vdr: [50364416] video cutting thread ended (pid=33513, tid=50364416) > > Mar 18 08:30:13 s01 vdr: [50361344] info: Schnitt beendet > > ----------- > > The cutting ends now always normally. > > I guess the problem is that Juergen has allocated the buffers on the > heap, but did not change the places where the buffer size is determined > using sizeof(buffer) and sizeof(buffer2). If you replace these with > MAXFRAMESIZE it should work. Yes, this works fine. I've had to add this to Juergen's patch: --------- @@ -108,7 +119,7 @@ CurrentFileNumber = FileNumber; } if (fromFile) { - int len = ReadFrame(fromFile, buffer, Length, sizeof(buffer)); + int len = ReadFrame(fromFile, buffer, Length, MAXFRAMESIZE); if (len < 0) { error = "ReadFrame"; break; @@ -193,7 +204,7 @@ if (FileNumber != CurrentFileNumber) fromFile = fromFileName->SetOffset(FileNumber, FileOffset); if (fromFile) { - int len = ReadFrame(fromFile, buffer2, Length2, sizeof(buffer2)); + int len = ReadFrame(fromFile, buffer2, Length2, MAXFRAMESIZE); if (len >= 0 && len == Length2) CheckForSeamlessStream = true; } --------------- First I'm (me.noob <g>!) tried it with sizeof(MAXFRAMESIZE), the result was not what i expected ;-) But i consulted K&R, both mean heap and stack were realy nice things... Hej, i'm a ruby guy, we have garbage collectors ;-) I think Juergen will make a "final patch", i don't know if above changes are well for all platforms, maybe a #ifdef __FreeBSD__ is needed. But for me: it works! Thanks for a wonderfull piece oft software! > > Klaus > Regards Gerhard > >> --- cutter.c.orig > >> +++ cutter.c > >> @@ -83,7 +83,18 @@ void cCuttingThread::Action(void) > >> int LastIFrame = 0; > >> toMarks.Add(0); > >> toMarks.Save(); > >> +#ifdef __FreeBSD__ > >> + // XXX save thread stack space > >> + uchar *buffer = MALLOC(uchar, MAXFRAMESIZE); > >> + uchar *buffer2 = MALLOC(uchar, MAXFRAMESIZE); > >> + if (buffer == NULL || buffer2 == NULL) { > >> + free(buffer); > >> + error = "malloc"; > >> + return; > >> + } > >> +#else > >> uchar buffer[MAXFRAMESIZE], buffer2[MAXFRAMESIZE]; > >> +#endif > >> int Length2; > >> bool CheckForSeamlessStream = false; > >> bool LastMark = false; > >> @@ -216,6 +227,10 @@ void cCuttingThread::Action(void) > >> } > >> } > >> Recordings.TouchUpdate(); > >> +#ifdef __FreeBSD__ > >> + free(buffer); > >> + free(buffer2); > >> +#endif > >> } > >> else > >> esyslog("no editing marks found!"); > >> --- thread.c.orig > >> +++ thread.c > >> @@ -242,7 +242,7 @@ void cThread::SetPriority(int Priority) > >> void cThread::SetIOPriority(int Priority) > >> { > >> #ifdef __FreeBSD__ > >> - esyslog("ERROR: syscall(SYS_ioprio_set ...) unsupported on FreeBSD"); > >> + // esyslog("ERROR: syscall(SYS_ioprio_set ...) unsupported on FreeBSD"); > >> #else > >> if (syscall(SYS_ioprio_set, 1, 0, (Priority & 0xff) | (2 << 13)) < 0) // best effort class > >> LOG_ERROR; > > _______________________________________________ > vdr mailing list > vdr@xxxxxxxxxxx > http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr _______________________________________________ vdr mailing list vdr@xxxxxxxxxxx http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr