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) { switch (event) {
case CE_AMR_CMR_RECV: case CE_AMR_CMR_RECV:
// ignore locking and races for this // ignore locking and races for this
media->u.amr.cmr.cmr_in = GPOINTER_TO_UINT(ptr); media->encoder_callback.amr.cmr_in = GPOINTER_TO_UINT(ptr);
media->u.amr.cmr.cmr_in_ts = rtpe_now; media->encoder_callback.amr.cmr_in_ts = rtpe_now;
break; break;
case CE_AMR_SEND_CMR: case CE_AMR_SEND_CMR:
// ignore locking and races for this // ignore locking and races for this
media->u.amr.cmr.cmr_out = GPOINTER_TO_UINT(ptr); media->encoder_callback.amr.cmr_out = GPOINTER_TO_UINT(ptr);
media->u.amr.cmr.cmr_out_ts = rtpe_now; media->encoder_callback.amr.cmr_out_ts = rtpe_now;
default: default:
break; break;
} }
@ -3663,7 +3663,7 @@ static int packet_decoded_common(decoder_t *decoder, AVFrame *frame, void *u1, v
// locking deliberately ignored // locking deliberately ignored
if (mp->media_out) 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; uint32_t ts = frame->pts + ch->first_ts;
__buffer_delay_frame(h->input_handler ? h->input_handler->delay_buffer : h->delay_buffer, __buffer_delay_frame(h->input_handler ? h->input_handler->delay_buffer : h->delay_buffer,

@ -414,11 +414,7 @@ struct call_media {
GQueue dtmf_send; GQueue dtmf_send;
#ifdef WITH_TRANSCODING #ifdef WITH_TRANSCODING
union { encoder_callback_t encoder_callback;
struct {
struct amr_cmr cmr;
} amr;
} u;
#endif #endif
int ptime; // either from SDP or overridden 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; return next_mode;
} }
static void amr_encoder_mode_change(encoder_t *enc) { 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))) &enc->u.avc.u.amr.cmr_in_ts, sizeof(struct timeval)))
return; return;
// mode change requested: check if this is allowed right now // 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) if (enc->codec_options.amr.mode_change_period == 2 && (enc->u.avc.u.amr.pkt_seq & 1) != 0)
return; return;
unsigned int cmr = enc->codec_options.amr.cmr.cmr_in; unsigned int cmr = enc->callback.amr.cmr_in;
if (cmr == 0xffff) if (cmr == 0xffff)
cmr = amr_encoder_find_next_mode(enc); cmr = amr_encoder_find_next_mode(enc);
if (cmr >= AMR_FT_TYPES) 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; enc->u.avc.avcctx->bit_rate = req_br;
if (cmr_done) 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) { static void amr_encoder_got_packet(encoder_t *enc) {
amr_encoder_mode_change(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? // or do we have a CMR?
if (!enc->u.avc.u.amr.cmr_out_seq) { 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))) { sizeof(struct timeval))) {
enc->u.avc.u.amr.cmr_out_seq += 3; // make this configurable? 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) { if (enc->u.avc.u.amr.cmr_out_seq) {
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]) if (cmr < AMR_FT_TYPES && enc->codec_options.amr.bitrates[cmr])
s[0] = cmr << 4; s[0] = cmr << 4;
} }

@ -59,6 +59,7 @@ struct resample_s;
struct seq_packet_s; struct seq_packet_s;
struct rtp_payload_type; struct rtp_payload_type;
union codec_options_u; union codec_options_u;
struct encoder_callback_s;
struct dtx_method_s; struct dtx_method_s;
typedef struct codec_type_s codec_type_t; 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 resample_s resample_t;
typedef struct seq_packet_s seq_packet_t; typedef struct seq_packet_s seq_packet_t;
typedef union codec_options_u codec_options_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 struct dtx_method_s dtx_method_t;
typedef int packetizer_f(AVPacket *, GString *, str *, encoder_t *); typedef int packetizer_f(AVPacket *, GString *, str *, encoder_t *);
@ -91,12 +93,14 @@ struct codec_type_s {
void (*encoder_close)(encoder_t *); void (*encoder_close)(encoder_t *);
}; };
struct amr_cmr { struct encoder_callback_s {
struct timeval cmr_in_ts; struct {
unsigned int cmr_in; struct timeval cmr_in_ts;
unsigned int cmr_in;
struct timeval cmr_out_ts; struct timeval cmr_out_ts;
unsigned int cmr_out; unsigned int cmr_out;
} amr;
}; };
union codec_options_u { union codec_options_u {
@ -113,8 +117,6 @@ union codec_options_u {
const unsigned int *bits_per_frame; const unsigned int *bits_per_frame;
const unsigned int *bitrates; const unsigned int *bitrates;
struct amr_cmr cmr; // input from external calling code
int cmr_interval; int cmr_interval;
} amr; } amr;
}; };
@ -247,6 +249,7 @@ struct encoder_s {
const codec_def_t *def; const codec_def_t *def;
codec_options_t codec_options; codec_options_t codec_options;
encoder_callback_t callback;
union { union {
struct { struct {

Loading…
Cancel
Save