Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add pause/resume recording functionality to Record&Play and SIP plugins #2724

Merged
merged 7 commits into from
Oct 1, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 10 additions & 12 deletions plugins/janus_recordplay.c
Original file line number Diff line number Diff line change
Expand Up @@ -2014,17 +2014,17 @@ static void *janus_recordplay_handler(void *data) {
JANUS_LOG(LOG_VERB, "Record&Play: Got pause/resume request\n");
if(session->recording) {
gboolean pause = !strcasecmp(request_text, "pause");
isnumanagic marked this conversation as resolved.
Show resolved Hide resolved
result = json_object();
json_object_set_new(result, "status", json_string(pause ? "paused" : "resumed"));
json_object_set_new(result, "id", json_integer(session->recording->id));
/* Also notify event handlers */
if(notify_events && gateway->events_is_enabled()) {
json_t *info = json_object();
json_object_set_new(info, "event", json_string(pause ? "paused" : "resumed"));
json_object_set_new(info, "id", json_integer(session->recording->id));
gateway->notify_event(&janus_recordplay_plugin, session->handle, info);
isnumanagic marked this conversation as resolved.
Show resolved Hide resolved
}
if (g_atomic_int_compare_and_exchange(&session->recording->paused, !pause, pause)) {
result = json_object();
json_object_set_new(result, "status", json_string(pause ? "paused" : "resumed"));
json_object_set_new(result, "id", json_integer(session->recording->id));
/* Also notify event handlers */
if(notify_events && gateway->events_is_enabled()) {
json_t *info = json_object();
json_object_set_new(info, "event", json_string(pause ? "paused" : "resumed"));
json_object_set_new(info, "id", json_integer(session->recording->id));
gateway->notify_event(&janus_recordplay_plugin, session->handle, info);
}
if(pause) {
janus_recorder_pause(session->arc);
janus_recorder_pause(session->vrc);
Expand All @@ -2035,8 +2035,6 @@ static void *janus_recordplay_handler(void *data) {
janus_recorder_resume(session->drc);
gateway->send_pli(session->handle);
}
} else {
JANUS_LOG(LOG_VERB, "Record&Play: Tried to pause/resume recording of same state, ignoring\n");
}
} else {
JANUS_LOG(LOG_VERB, "Record&Play: Not recording, ignoring pause/resume request\n");
Expand Down
44 changes: 13 additions & 31 deletions plugins/janus_sip.c
Original file line number Diff line number Diff line change
Expand Up @@ -4374,29 +4374,12 @@ static void *janus_sip_handler(void *data) {
record_peer_audio = peer_audio ? json_is_true(peer_audio) : FALSE;
json_t *peer_video = json_object_get(root, "peer_video");
record_peer_video = peer_video ? json_is_true(peer_video) : FALSE;
gint update_bitmap =
record_audio |
record_video << 1 |
record_peer_audio << 2 |
record_peer_video << 3;
if(!update_bitmap) {
if(!record_audio && !record_video && !record_peer_audio && !record_peer_video) {
JANUS_LOG(LOG_ERR, "Invalid request (at least one of audio, video, peer_audio and peer_video should be true)\n");
error_code = JANUS_SIP_ERROR_RECORDING_ERROR;
g_snprintf(error_cause, 512, "Invalid request (at least one of audio, video, peer_audio and peer_video should be true)");
goto error;
}
gint recorder_bitmap =
g_atomic_int_get(&session->arc->paused) |
g_atomic_int_get(&session->vrc->paused) << 1 |
g_atomic_int_get(&session->arc_peer->paused) << 2 |
g_atomic_int_get(&session->vrc_peer->paused) << 3;
if ((!strcasecmp(action_text, "pause") && !(~recorder_bitmap & update_bitmap)) ||
(!strcasecmp(action_text, "resume") && !(recorder_bitmap & update_bitmap))) {
JANUS_LOG(LOG_ERR, "Invalid pause/resume request (at least one of audio, video, peer_audio and peer_video should change recorder state)\n");
error_code = JANUS_SIP_ERROR_RECORDING_ERROR;
g_snprintf(error_cause, 512, "Invalid pause/resume request (at least one of audio, video, peer_audio and peer_video should change recorder state)");
goto error;
}
json_t *recfile = json_object_get(root, "filename");
const char *recording_base = json_string_value(recfile);
janus_mutex_lock(&session->rec_mutex);
Expand Down Expand Up @@ -4521,26 +4504,25 @@ static void *janus_sip_handler(void *data) {
}
}
} else if(!strcasecmp(action_text, "pause")) {
gint pause_bitmap = ~recorder_bitmap & update_bitmap;
if(pause_bitmap & 1)
if(record_audio)
janus_recorder_pause(session->arc);
if(pause_bitmap & 2)
if(record_video)
janus_recorder_pause(session->vrc);
if(pause_bitmap & 4)
if(record_peer_audio)
janus_recorder_pause(session->arc_peer);
if(pause_bitmap & 8)
if(record_peer_video)
janus_recorder_pause(session->vrc_peer);
} else if(!strcasecmp(action_text, "resume")) {
gint resume_bitmap = recorder_bitmap & update_bitmap;
if(resume_bitmap & 1)
gboolean send_pli = FALSE;
if(record_audio)
janus_recorder_resume(session->arc);
if(resume_bitmap & 2)
janus_recorder_resume(session->vrc);
if(resume_bitmap & 4)
if(record_video && !janus_recorder_resume(session->vrc))
send_pli = TRUE;
if(record_peer_audio)
janus_recorder_resume(session->arc_peer);
if(resume_bitmap & 8)
janus_recorder_resume(session->vrc_peer);
if(resume_bitmap & 10)
if(record_peer_video && !janus_recorder_resume(session->vrc_peer))
send_pli = TRUE;
isnumanagic marked this conversation as resolved.
Show resolved Hide resolved
if(send_pli)
gateway->send_pli(session->handle);
isnumanagic marked this conversation as resolved.
Show resolved Hide resolved
} else {
/* Stop recording something: notice that this never returns an error, even when we were not recording anything */
Expand Down