From cbad0bb175a5a4d4a13f678a6d9ef98662f9270d Mon Sep 17 00:00:00 2001 From: Varun Patil Date: Fri, 17 Mar 2023 14:44:59 -0700 Subject: [PATCH] Trap exit code for ffmpeg --- stream.go | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/stream.go b/stream.go index 8053f5e9..76d02ec0 100644 --- a/stream.go +++ b/stream.go @@ -524,6 +524,7 @@ func (s *Stream) transcode(startId int) { go s.monitorTranscodeOutput(cmdStdOut, startAt) go s.monitorStderr(cmdStdErr) + go s.monitorExit() } func (s *Stream) checkGoal(id int) { @@ -617,9 +618,6 @@ func (s *Stream) monitorTranscodeOutput(cmdStdOut io.ReadCloser, startAt float64 }() } } - - // Join the process - coder.Wait() } func (s *Stream) monitorStderr(cmdStdErr io.ReadCloser) { @@ -640,3 +638,28 @@ func (s *Stream) monitorStderr(cmdStdErr io.ReadCloser) { log.Println("ffmpeg-error:", string(line)) } } + +func (s *Stream) monitorExit() { + // Join the process + coder := s.coder + err := coder.Wait() + + // Try to get exit status + if exitError, ok := err.(*exec.ExitError); ok { + exitcode := exitError.ExitCode() + log.Printf("%s-%s: ffmpeg exited with status: %d", s.m.id, s.quality, exitcode) + + s.mutex.Lock() + defer s.mutex.Unlock() + + // If error code is >0, there was an error in transcoding + if exitcode > 0 && s.coder == coder { + // Notify all outstanding chunks + for _, chunk := range s.chunks { + for _, n := range chunk.notifs { + n <- true + } + } + } + } +}