MT#55447 refactor encoder callback struct

Use a single dedicated struct to hold data used as callback from decoder
to encoder.

Change-Id: I747cd495bc98a33629d0acd77909023f8f0e89ff
pull/1558/head
Richard Fuchs 3 years ago
parent ced1467cd2
commit a65954bbbb

@ -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,

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

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

@ -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 {

Loading…
Cancel
Save