[MPlayer-users] Latest SVN mplayer unable to play Apple's keynote speech

Tom D. dtom77 at gmail.com
Wed Jun 16 16:26:26 CEST 2010


On Tue, Jun 15, 2010 at 07:59:31PM +0000, Carl Eugen Hoyos wrote:
> Tom D. <dtom77 <at> gmail.com> writes:
>
> > I still get the error.
>
> Which error?
>
>>Reimar Döffinger wrote:
>>The SIGPIPE at the end of the stream.
>>I think this should maybe be fixed in the live555 library (and maybe even
>>is in a newer version), though it maybe would also be better to make
>>MPlayer ignore SIGPIPE.
>>You could try this:
>>Index: mplayer.c
>>===================================================================
>>--- mplayer.c   (revision 31425)
>>+++ mplayer.c   (working copy)
>>@@ -3030,7 +3030,7 @@
>>   signal(SIGINT,exit_sighandler);  // Interrupt from keyboard
>>
>>   signal(SIGQUIT,exit_sighandler); // Quit from keyboard
>>-  signal(SIGPIPE,exit_sighandler); // Some window managers cause this
>>+  signal(SIGPIPE,SIG_IGN); // Some window managers cause this
>> #ifdef CONFIG_SIGHANDLER
>>   // fatal errors:
>>   signal(SIGBUS,exit_sighandler);  // bus error



I applied the patch. Now mplayer just doesn't quit when I want to exit
mplayer. mplayer app just hangs. I've to press cntl+c from keyboard
twice. I'm not expert but can you kindly look at the exit_sighandler()
function whether SIGPIPE being properly handled or not. Now the
function looks like:

static void exit_sighandler(int x){
  static int sig_count=0;
#ifdef CONFIG_CRASH_DEBUG
  if (!crash_debug || x != SIGTRAP)
#endif
  ++sig_count;
  if(initialized_flags==0 && sig_count>1) exit(1);
  if(sig_count==5)
    {
      /* We're crashing bad and can't uninit cleanly :(
       * by popular request, we make one last (dirty)
       * effort to restore the user's
       * terminal. */
      getch2_disable();
      exit(1);
    }
  if(sig_count==6) exit(1);
  if(sig_count>6){
    // can't stop :(
#ifndef __MINGW32__
    kill(getpid(),SIGKILL);
#endif
  }
  mp_msg(MSGT_CPLAYER,MSGL_FATAL,"\n" MSGTR_IntBySignal,x,
      current_module?current_module:"unknown"
  );
  mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SIGNAL=%d\n", x);
  if(sig_count<=1)
  switch(x){
  case SIGINT:
  case SIGQUIT:
  case SIGTERM:
  case SIGKILL:
      async_quit_request = 1;
      return;  // killed from keyboard (^C) or killed [-9]
  case SIGILL:
#if CONFIG_RUNTIME_CPUDETECT
      mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_Exit_SIGILL_RTCpuSel);
#else
      mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_Exit_SIGILL);
#endif
  case SIGFPE:
  case SIGSEGV:
      mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_Exit_SIGSEGV_SIGFPE);
  default:
      mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_Exit_SIGCRASH);
#ifdef CONFIG_CRASH_DEBUG
      if (crash_debug) {
        int gdb_pid;
        mp_msg(MSGT_CPLAYER, MSGL_INFO, "Forking...\n");
        gdb_pid = fork();
        mp_msg(MSGT_CPLAYER, MSGL_INFO, "Forked...\n");
        if (gdb_pid == 0) { // We are the child
          char spid[20];
          snprintf(spid, sizeof(spid), "%i", getppid());
          getch2_disable(); // allow terminal to work properly with gdb
          if (execlp("gdb", "gdb", prog_path, spid, "-ex", "bt", NULL) == -1)
            mp_msg(MSGT_CPLAYER, MSGL_ERR, "Couldn't start gdb\n");
        } else if (gdb_pid < 0)
          mp_msg(MSGT_CPLAYER, MSGL_ERR, "Couldn't fork\n");
        else {
          waitpid(gdb_pid, NULL, 0);
        }
        if (x == SIGTRAP) return;
      }
#endif
  }
  getch2_disable();
  exit(1);
}


More information about the MPlayer-users mailing list