From 17d5301c0fd6f93c5b9d4dd325e4303739d93ffb Mon Sep 17 00:00:00 2001 From: Romain Vimont Date: Sun, 19 Feb 2023 00:55:36 +0100 Subject: [PATCH] Record at least video packets on stop If the recorder is stopped while it has not received any audio packet yet, make sure the video stream is correctly recorded. PR #3757 --- app/src/recorder.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/app/src/recorder.c b/app/src/recorder.c index c694f022..9fc15dac 100644 --- a/app/src/recorder.c +++ b/app/src/recorder.c @@ -249,8 +249,10 @@ sc_recorder_process_header(struct sc_recorder *recorder) { sc_cond_wait(&recorder->queue_cond, &recorder->mutex); } - if (sc_recorder_has_empty_queues(recorder)) { + if (sc_queue_is_empty(&recorder->video_queue)) { assert(recorder->stopped); + // Don't process anything if there are not at least video packets (when + // the recorder is stopped) sc_mutex_unlock(&recorder->mutex); return false; } @@ -258,8 +260,9 @@ sc_recorder_process_header(struct sc_recorder *recorder) { struct sc_record_packet *video_pkt; sc_queue_take(&recorder->video_queue, next, &video_pkt); - struct sc_record_packet *audio_pkt; - if (recorder->audio) { + struct sc_record_packet *audio_pkt = NULL; + if (!sc_queue_is_empty(&recorder->audio_queue)) { + assert(recorder->audio); sc_queue_take(&recorder->audio_queue, next, &audio_pkt); } @@ -280,7 +283,7 @@ sc_recorder_process_header(struct sc_recorder *recorder) { goto end; } - if (recorder->audio) { + if (audio_pkt) { if (audio_pkt->packet->pts != AV_NOPTS_VALUE) { LOGE("The first audio packet is not a config packet"); goto end; @@ -305,7 +308,7 @@ sc_recorder_process_header(struct sc_recorder *recorder) { end: sc_record_packet_delete(video_pkt); - if (recorder->audio) { + if (audio_pkt) { sc_record_packet_delete(audio_pkt); } @@ -393,6 +396,16 @@ sc_recorder_process_packets(struct sc_recorder *recorder) { } else if (video_pkt && audio_pkt) { pts_origin = MIN(video_pkt->packet->pts, audio_pkt->packet->pts); + } else if (recorder->stopped) { + if (video_pkt) { + // The recorder is stopped without audio, record the video + // packets + pts_origin = video_pkt->packet->pts; + } else { + // Fail if there is no video + error = true; + goto end; + } } else { // We need both video and audio packets to initialize pts_origin continue;