diff --git a/daemon/codec.c b/daemon/codec.c index 5548d95b8..a7b495683 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -2328,13 +2328,13 @@ static int codec_decoder_event(enum codec_event event, void *ptr, void *data) { switch (event) { case CE_AMR_CMR_RECV: // ignore locking and races for this - media->u.amr.cmr.cmr_in = GPOINTER_TO_UINT(ptr); - media->u.amr.cmr.cmr_in_ts = rtpe_now; + media->encoder_callback.amr.cmr_in = GPOINTER_TO_UINT(ptr); + media->encoder_callback.amr.cmr_in_ts = rtpe_now; break; case CE_AMR_SEND_CMR: // ignore locking and races for this - media->u.amr.cmr.cmr_out = GPOINTER_TO_UINT(ptr); - media->u.amr.cmr.cmr_out_ts = rtpe_now; + media->encoder_callback.amr.cmr_out = GPOINTER_TO_UINT(ptr); + media->encoder_callback.amr.cmr_out_ts = rtpe_now; default: break; } @@ -3663,7 +3663,7 @@ static int packet_decoded_common(decoder_t *decoder, AVFrame *frame, void *u1, v // locking deliberately ignored if (mp->media_out) - ch->encoder->codec_options.amr.cmr = mp->media_out->u.amr.cmr; + ch->encoder->callback = mp->media_out->encoder_callback; uint32_t ts = frame->pts + ch->first_ts; __buffer_delay_frame(h->input_handler ? h->input_handler->delay_buffer : h->delay_buffer, diff --git a/include/call.h b/include/call.h index d869a4be9..74c62f71d 100644 --- a/include/call.h +++ b/include/call.h @@ -414,11 +414,7 @@ struct call_media { GQueue dtmf_send; #ifdef WITH_TRANSCODING - union { - struct { - struct amr_cmr cmr; - } amr; - } u; + encoder_callback_t encoder_callback; #endif int ptime; // either from SDP or overridden diff --git a/lib/codeclib.c b/lib/codeclib.c index 591c1b802..fb905fdbb 100644 --- a/lib/codeclib.c +++ b/lib/codeclib.c @@ -2199,13 +2199,13 @@ static unsigned int amr_encoder_find_next_mode(encoder_t *enc) { return next_mode; } static void amr_encoder_mode_change(encoder_t *enc) { - if (!memcmp(&enc->codec_options.amr.cmr.cmr_in_ts, + if (!memcmp(&enc->callback.amr.cmr_in_ts, &enc->u.avc.u.amr.cmr_in_ts, sizeof(struct timeval))) return; // mode change requested: check if this is allowed right now if (enc->codec_options.amr.mode_change_period == 2 && (enc->u.avc.u.amr.pkt_seq & 1) != 0) return; - unsigned int cmr = enc->codec_options.amr.cmr.cmr_in; + unsigned int cmr = enc->callback.amr.cmr_in; if (cmr == 0xffff) cmr = amr_encoder_find_next_mode(enc); if (cmr >= AMR_FT_TYPES) @@ -2248,7 +2248,7 @@ static void amr_encoder_mode_change(encoder_t *enc) { } enc->u.avc.avcctx->bit_rate = req_br; if (cmr_done) - enc->u.avc.u.amr.cmr_in_ts = enc->codec_options.amr.cmr.cmr_in_ts; + enc->u.avc.u.amr.cmr_in_ts = enc->callback.amr.cmr_in_ts; } static void amr_encoder_got_packet(encoder_t *enc) { amr_encoder_mode_change(enc); @@ -2283,15 +2283,15 @@ static int packetizer_amr(AVPacket *pkt, GString *buf, str *output, encoder_t *e // or do we have a CMR? if (!enc->u.avc.u.amr.cmr_out_seq) { - if (memcmp(&enc->u.avc.u.amr.cmr_out_ts, &enc->codec_options.amr.cmr.cmr_out_ts, + if (memcmp(&enc->u.avc.u.amr.cmr_out_ts, &enc->callback.amr.cmr_out_ts, sizeof(struct timeval))) { enc->u.avc.u.amr.cmr_out_seq += 3; // make this configurable? - enc->u.avc.u.amr.cmr_out_ts = enc->codec_options.amr.cmr.cmr_out_ts; + enc->u.avc.u.amr.cmr_out_ts = enc->callback.amr.cmr_out_ts; } } if (enc->u.avc.u.amr.cmr_out_seq) { enc->u.avc.u.amr.cmr_out_seq--; - unsigned int cmr = enc->codec_options.amr.cmr.cmr_out; + unsigned int cmr = enc->callback.amr.cmr_out; if (cmr < AMR_FT_TYPES && enc->codec_options.amr.bitrates[cmr]) s[0] = cmr << 4; } diff --git a/lib/codeclib.h b/lib/codeclib.h index e2f98614a..ec9d2f055 100644 --- a/lib/codeclib.h +++ b/lib/codeclib.h @@ -59,6 +59,7 @@ struct resample_s; struct seq_packet_s; struct rtp_payload_type; union codec_options_u; +struct encoder_callback_s; struct dtx_method_s; typedef struct codec_type_s codec_type_t; @@ -68,6 +69,7 @@ typedef struct format_s format_t; typedef struct resample_s resample_t; typedef struct seq_packet_s seq_packet_t; typedef union codec_options_u codec_options_t; +typedef struct encoder_callback_s encoder_callback_t; typedef struct dtx_method_s dtx_method_t; typedef int packetizer_f(AVPacket *, GString *, str *, encoder_t *); @@ -91,12 +93,14 @@ struct codec_type_s { void (*encoder_close)(encoder_t *); }; -struct amr_cmr { - struct timeval cmr_in_ts; - unsigned int cmr_in; +struct encoder_callback_s { + struct { + struct timeval cmr_in_ts; + unsigned int cmr_in; - struct timeval cmr_out_ts; - unsigned int cmr_out; + struct timeval cmr_out_ts; + unsigned int cmr_out; + } amr; }; union codec_options_u { @@ -113,8 +117,6 @@ union codec_options_u { const unsigned int *bits_per_frame; const unsigned int *bitrates; - struct amr_cmr cmr; // input from external calling code - int cmr_interval; } amr; }; @@ -247,6 +249,7 @@ struct encoder_s { const codec_def_t *def; codec_options_t codec_options; + encoder_callback_t callback; union { struct {