Browse Source

MT#62571 turn mix output into sink

Change-Id: I59140d641679b84ce3831ba1dcad07e38deda46f
pull/1967/head
Richard Fuchs 6 months ago
parent
commit
06c89206c1
4 changed files with 47 additions and 29 deletions
  1. +1
    -24
      recording-daemon/decoder.c
  2. +38
    -2
      recording-daemon/mix.c
  3. +3
    -3
      recording-daemon/mix.h
  4. +5
    -0
      recording-daemon/packet.c

+ 1
- 24
recording-daemon/decoder.c View File

@ -108,30 +108,7 @@ static int decoder_got_frame(decoder_t *dec, AVFrame *frame, void *sp, void *dp)
if (!metafile->recording_on)
goto no_recording;
// handle mix output
pthread_mutex_lock(&metafile->mix_lock);
if (metafile->mix_out) {
dbg("adding packet from stream #%lu to mix output", stream->id);
if (G_UNLIKELY(deco->mix_sink.mixer_idx == (unsigned int) -1))
deco->mix_sink.mixer_idx = mix_get_index(metafile->mix, ssrc, stream->media_sdp_id, stream->channel_slot);
format_t actual_format;
if (output_config(metafile->mix_out, &dec->dest_format, &actual_format))
goto no_mix_out;
mix_config(metafile->mix, &actual_format);
// XXX might be a second resampling to same format
AVFrame *copy_frame = av_frame_clone(frame);
AVFrame *dec_frame = resample_frame(&deco->mix_sink.resampler, copy_frame, &actual_format);
if (!dec_frame) {
pthread_mutex_unlock(&metafile->mix_lock);
goto err;
}
if (mix_add(metafile->mix, dec_frame, deco->mix_sink.mixer_idx, ssrc, metafile->mix_out))
ilog(LOG_ERR, "Failed to add decoded packet to mixed output");
if (dec_frame != copy_frame)
av_frame_free(&copy_frame);
}
no_mix_out:
pthread_mutex_unlock(&metafile->mix_lock);
sink_add(&deco->mix_sink, frame, &dec->dest_format);
if (output) {
dbg("SSRC %lx of stream #%lu has single output", ssrc->ssrc, stream->id);


+ 38
- 2
recording-daemon/mix.c View File

@ -138,7 +138,7 @@ unsigned int mix_get_index(mix_t *mix, void *ptr, unsigned int media_sdp_id, uns
}
int mix_config(mix_t *mix, const format_t *format) {
static int mix_config_(mix_t *mix, const format_t *format) {
const char *err;
char args[512];
@ -323,7 +323,7 @@ static void mix_silence_fill(mix_t *mix) {
}
int mix_add(mix_t *mix, AVFrame *frame, unsigned int idx, void *ptr, output_t *output) {
static int mix_add_(mix_t *mix, AVFrame *frame, unsigned int idx, void *ptr, output_t *output) {
const char *err;
err = "index out of range";
@ -403,3 +403,39 @@ err:
av_frame_free(&frame);
return -1;
}
bool mix_add(sink_t *sink, AVFrame *frame) {
ssrc_t *ssrc = sink->ssrc;
metafile_t *metafile = ssrc->metafile;
LOCK(&metafile->mix_lock);
if (!metafile->mix_out)
return true;
if (mix_add_(metafile->mix, frame, sink->mixer_idx, ssrc, metafile->mix_out))
ilog(LOG_ERR, "Failed to add decoded packet to mixed output");
return true;
}
bool mix_config(sink_t *sink, const format_t *requested_format, format_t *actual_format) {
ssrc_t *ssrc = sink->ssrc;
metafile_t *metafile = ssrc->metafile;
LOCK(&metafile->mix_lock);
if (!metafile->mix_out)
return true;
stream_t *stream = ssrc->stream;
if (G_UNLIKELY(sink->mixer_idx == (unsigned int) -1))
sink->mixer_idx = mix_get_index(metafile->mix, ssrc, stream->media_sdp_id, stream->channel_slot);
if (output_config(metafile->mix_out, requested_format, actual_format))
return true;
mix_config_(metafile->mix, actual_format);
return true;
}

+ 3
- 3
recording-daemon/mix.h View File

@ -9,8 +9,8 @@
mix_t *mix_new(void);
void mix_destroy(mix_t *mix);
void mix_set_channel_slots(mix_t *mix, unsigned int);
int mix_config(mix_t *, const format_t *format);
int mix_add(mix_t *mix, AVFrame *frame, unsigned int idx, void *, output_t *output);
bool mix_config(sink_t *, const format_t *requested_format, format_t *actual_format);
bool mix_add(sink_t *, AVFrame *frame);
unsigned int mix_get_index(mix_t *, void *, unsigned int, unsigned int);
#endif
#endif

+ 5
- 0
recording-daemon/packet.c View File

@ -19,6 +19,7 @@
#include "tag.h"
#include "fix_frame_channel_layout.h"
#include "tls_send.h"
#include "mix.h"
static void packet_free(void *p) {
@ -120,8 +121,12 @@ static void packet_decode(ssrc_t *ssrc, packet_t *packet) {
else if (ssrc->output)
dec_format = ssrc->output->requested_format;
ssrc->decoders[payload_type] = decoder_new(payload_str, format, ptime, &dec_format);
sink_init(&ssrc->decoders[payload_type]->mix_sink);
ssrc->decoders[payload_type]->mix_sink.ssrc = ssrc;
ssrc->decoders[payload_type]->mix_sink.add = mix_add;
ssrc->decoders[payload_type]->mix_sink.config = mix_config;
pthread_mutex_unlock(&mf->mix_lock);
if (!ssrc->decoders[payload_type]) {
ilog(LOG_WARN, "Cannot decode RTP payload type %u (%s)",


Loading…
Cancel
Save