Re: VDR 1.7 FreeBSD segfault when cutting recordings

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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. 

> 
>  HTH, :)
> 	Juergen

Regards and TIA
        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


[Index of Archives]     [Linux Media]     [Asterisk]     [DCCP]     [Netdev]     [Xorg]     [Util Linux NG]     [Xfree86]     [Big List of Linux Books]     [Fedora Users]     [Fedora Women]     [ALSA Devel]     [Linux USB]

  Powered by Linux