mirror of
https://github.com/Genymobile/scrcpy.git
synced 2025-08-03 22:58:51 +00:00
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 <https://github.com/Genymobile/scrcpy/pull/3757>
This commit is contained in:
parent
2fda50851c
commit
fd019753fb
1 changed files with 23 additions and 5 deletions
|
@ -249,7 +249,9 @@ sc_recorder_process_header(struct sc_recorder *recorder) {
|
||||||
sc_cond_wait(&recorder->queue_cond, &recorder->mutex);
|
sc_cond_wait(&recorder->queue_cond, &recorder->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (recorder->stopped && sc_recorder_has_empty_queues(recorder)) {
|
if (recorder->stopped && sc_queue_is_empty(&recorder->video_queue)) {
|
||||||
|
// If the recorder is stopped, don't process anything if there are not
|
||||||
|
// at least video packets
|
||||||
sc_mutex_unlock(&recorder->mutex);
|
sc_mutex_unlock(&recorder->mutex);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -257,8 +259,9 @@ sc_recorder_process_header(struct sc_recorder *recorder) {
|
||||||
struct sc_record_packet *video_pkt;
|
struct sc_record_packet *video_pkt;
|
||||||
sc_queue_take(&recorder->video_queue, next, &video_pkt);
|
sc_queue_take(&recorder->video_queue, next, &video_pkt);
|
||||||
|
|
||||||
struct sc_record_packet *audio_pkt;
|
struct sc_record_packet *audio_pkt = NULL;
|
||||||
if (recorder->audio) {
|
if (!sc_queue_is_empty(&recorder->audio_queue)) {
|
||||||
|
assert(recorder->audio);
|
||||||
sc_queue_take(&recorder->audio_queue, next, &audio_pkt);
|
sc_queue_take(&recorder->audio_queue, next, &audio_pkt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -279,7 +282,7 @@ sc_recorder_process_header(struct sc_recorder *recorder) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (recorder->audio) {
|
if (audio_pkt) {
|
||||||
if (audio_pkt->packet->pts != AV_NOPTS_VALUE) {
|
if (audio_pkt->packet->pts != AV_NOPTS_VALUE) {
|
||||||
LOGE("The first audio packet is not a config packet");
|
LOGE("The first audio packet is not a config packet");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -304,7 +307,7 @@ sc_recorder_process_header(struct sc_recorder *recorder) {
|
||||||
|
|
||||||
end:
|
end:
|
||||||
sc_record_packet_delete(video_pkt);
|
sc_record_packet_delete(video_pkt);
|
||||||
if (recorder->audio) {
|
if (audio_pkt) {
|
||||||
sc_record_packet_delete(audio_pkt);
|
sc_record_packet_delete(audio_pkt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -392,6 +395,21 @@ sc_recorder_process_packets(struct sc_recorder *recorder) {
|
||||||
} else if (video_pkt && audio_pkt) {
|
} else if (video_pkt && audio_pkt) {
|
||||||
pts_origin =
|
pts_origin =
|
||||||
MIN(video_pkt->packet->pts, audio_pkt->packet->pts);
|
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;
|
||||||
|
}
|
||||||
|
// If the recorder is stopped while one of the streams has no
|
||||||
|
// packets, then we must avoid a live-loop and correctly record
|
||||||
|
// the stream having packets.
|
||||||
|
pts_origin = video_pkt ? video_pkt->packet->pts
|
||||||
|
: audio_pkt->packet->pts;
|
||||||
} else {
|
} else {
|
||||||
// We need both video and audio packets to initialize pts_origin
|
// We need both video and audio packets to initialize pts_origin
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue