[vdr] VDR 1.7 FreeBSD segfault when cutting recordings

Juergen Lock vdr-l at jelal.kn-bremen.de
Mon Mar 18 12:21:32 CET 2013


In article <5146CC8E.4070808 at tvdr.de> you write:
>On 18.03.2013 08:41, Gerhard Brauer wrote:
>> On Sun, Mar 17, 2013 at 09:52:46PM +0100, Juergen Lock wrote:
>>>>
>>> Ok I looked at cutter.c again and now I think I found the cause:
>>> Linux must default to bigger thread stacks than FreeBSD, FreeBSD's
>>> default seems to be 2 MB on amd64 and MAXFRAMESIZE is almost 1 MB...
>>> Try the patch below, you can put it in files/patch-z-cutter.c
>>> in the port dir. (the thread.c part is FreeBSD port specific, it
>>> caused a different crash with --edit.)
>>
>> Hello!
>> Thanks for the patch and your time, i think we're on the way ;-)
>>
>> 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.
>>
>> The cutted recording itself seems to be corrupted. When trying to
>> play it i got "incomplete PES packet":
>> -----------
>> Mar 18 08:23:05 s01 vdr: [54684672] receiver on device 1 thread ended (pid=33513, tid=54684672)
>> Mar 18 08:23:05 s01 vdr: [50363392] ERROR: incomplete PES packet!
>> Mar 18 08:23:11 s01 last message repeated 87971 times
>> -------------
>> until i stop playing the cutted video.
>>
>> Same errors when doing it without a frontend/OSD from Terminal with
>> --edit and -i1.
>
>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.
>
Oh haha I'm sorry, how could I have missed that...  I'll fix it tonight
and probably commit the working :) fix to ports.

 Thanx!
	Juergen

>Klaus
>
>>> --- 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 at linuxtv.org
>http://www.linuxtv.org/cgi-bin/mailman/listinfo/vdr
>





More information about the vdr mailing list