|
|
|
@ -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; |
|
|
|
} |