]> git.sesse.net Git - nageru/blobdiff - nageru/mixer.cpp
Fix a segfault that could happen with FFmpeg inputs and slow startup.
[nageru] / nageru / mixer.cpp
index 9e28d4c25c5abfd3ef622646bcc8dbfe0606cf67..d1b52ef2dc54b4a9db8ad84e755bbadc4ac76411 100644 (file)
@@ -779,12 +779,12 @@ void Mixer::bm_frame(unsigned card_index, uint16_t timecode,
 
                bool success;
                do {
-                       success = audio_mixer->add_silence(device, silence_samples, dropped_frames, frame_length);
+                       success = audio_mixer->add_silence(device, silence_samples, dropped_frames);
                } while (!success);
        }
 
        if (num_samples > 0) {
-               audio_mixer->add_audio(device, audio_frame.data + audio_offset, num_samples, audio_format, frame_length, audio_frame.received_timestamp);
+               audio_mixer->add_audio(device, audio_frame.data + audio_offset, num_samples, audio_format, audio_frame.received_timestamp);
        }
 
        // Done with the audio, so release it.
@@ -795,7 +795,7 @@ void Mixer::bm_frame(unsigned card_index, uint16_t timecode,
        card->last_timecode = timecode;
 
        PBOFrameAllocator::Userdata *userdata = (PBOFrameAllocator::Userdata *)video_frame.userdata;
-       if (card->type == CardType::FFMPEG_INPUT) {
+       if (card->type == CardType::FFMPEG_INPUT && userdata != nullptr) {
                FFmpegCapture *ffmpeg_capture = static_cast<FFmpegCapture *>(card->capture.get());
                userdata->has_last_subtitle = ffmpeg_capture->get_has_last_subtitle();
                userdata->last_subtitle = ffmpeg_capture->get_last_subtitle();
@@ -865,6 +865,7 @@ void Mixer::bm_frame(unsigned card_index, uint16_t timecode,
                }
                frame_upload_start = steady_clock::now();
        }
+       assert(userdata != nullptr);
        userdata->last_interlaced = video_format.interlaced;
        userdata->last_has_signal = video_format.has_signal;
        userdata->last_is_connected = video_format.is_connected;
@@ -1081,7 +1082,7 @@ void Mixer::thread_func()
                        }
 
                        // Only bother doing MJPEG encoding if there are any connected clients
-                       // that want the stream.
+                       // that want the stream. FIXME: We should also stop memcpy-ing if there are none!
                        if (httpd.get_num_connected_multicam_clients() > 0) {
                                auto stream_it = global_flags.card_to_mjpeg_stream_export.find(card_index);
                                if (stream_it != global_flags.card_to_mjpeg_stream_export.end()) {