diff --git a/daemon/codec.c b/daemon/codec.c index e4e44ee35..cfb6eba11 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -3110,17 +3110,17 @@ static int codec_decoder_event(enum codec_event event, void *ptr, void *data) { case CE_AMR_CMR_RECV: // ignore locking and races for this media->encoder_callback.amr.cmr_in = GPOINTER_TO_UINT(ptr); - media->encoder_callback.amr.cmr_in_ts = timeval_from_us(rtpe_now); + media->encoder_callback.amr.cmr_in_ts = rtpe_now; break; case CE_AMR_SEND_CMR: // ignore locking and races for this media->encoder_callback.amr.cmr_out = GPOINTER_TO_UINT(ptr); - media->encoder_callback.amr.cmr_out_ts = timeval_from_us(rtpe_now); + media->encoder_callback.amr.cmr_out_ts = rtpe_now; break; case CE_EVS_CMR_RECV: // ignore locking and races for this media->encoder_callback.evs.cmr_in = GPOINTER_TO_UINT(ptr); - media->encoder_callback.evs.cmr_in_ts = timeval_from_us(rtpe_now); + media->encoder_callback.evs.cmr_in_ts = rtpe_now; break; default: break; diff --git a/lib/codeclib.c b/lib/codeclib.c index a6c71d4fd..83dba03e6 100644 --- a/lib/codeclib.c +++ b/lib/codeclib.c @@ -2931,8 +2931,8 @@ static void amr_bitrate_tracker(decoder_t *dec, unsigned int ft) { if (dec->codec_options.amr.cmr_interval <= 0) return; - if (dec->avc.amr.tracker_end.tv_sec - && timeval_cmp(dec->avc.amr.tracker_end, timeval_from_us(rtpe_now)) >= 0) { + if (dec->avc.amr.tracker_end + && timeval_cmp(timeval_from_us(dec->avc.amr.tracker_end), timeval_from_us(rtpe_now)) >= 0) { // analyse the data we gathered int next_highest = -1; int lowest_used = -1; @@ -2970,11 +2970,11 @@ static void amr_bitrate_tracker(decoder_t *dec, unsigned int ft) { ZERO(dec->avc.amr.tracker_end); } - if (!dec->avc.amr.tracker_end.tv_sec) { + if (!dec->avc.amr.tracker_end) { // init ZERO(dec->avc.amr.bitrate_tracker); - dec->avc.amr.tracker_end = timeval_from_us(rtpe_now); - dec->avc.amr.tracker_end = timeval_add_usec(dec->avc.amr.tracker_end, dec->codec_options.amr.cmr_interval * 1000); + dec->avc.amr.tracker_end = rtpe_now; + dec->avc.amr.tracker_end += dec->codec_options.amr.cmr_interval * 1000; // XXX scale to micro } dec->avc.amr.bitrate_tracker[ft]++; @@ -3000,17 +3000,17 @@ static int amr_decoder_input(decoder_t *dec, const str *data, GQueue *out) { unsigned int cmr_int = cmr_chr[0] >> 4; if (cmr_int != 15) { decoder_event(dec, CE_AMR_CMR_RECV, GUINT_TO_POINTER(cmr_int)); - dec->avc.amr.last_cmr = timeval_from_us(rtpe_now); + dec->avc.amr.last_cmr = rtpe_now; } else if (dec->codec_options.amr.mode_change_interval) { // no CMR, check if we're due to do our own mode change - if (!dec->avc.amr.last_cmr.tv_sec) // start tracking now - dec->avc.amr.last_cmr = timeval_from_us(rtpe_now); - else if (timeval_diff(timeval_from_us(rtpe_now), dec->avc.amr.last_cmr) - >= (long long) dec->codec_options.amr.mode_change_interval * 1000) { + if (!dec->avc.amr.last_cmr) // start tracking now + dec->avc.amr.last_cmr = rtpe_now; + else if (rtpe_now - dec->avc.amr.last_cmr + >= dec->codec_options.amr.mode_change_interval * 1000LL) { // XXX scale to micro // switch up if we can decoder_event(dec, CE_AMR_CMR_RECV, GUINT_TO_POINTER(0xffff)); - dec->avc.amr.last_cmr = timeval_from_us(rtpe_now); + dec->avc.amr.last_cmr = rtpe_now; } } @@ -3165,8 +3165,7 @@ 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->callback.amr.cmr_in_ts, - &enc->avc.amr.cmr_in_ts, sizeof(struct timeval))) + if (enc->callback.amr.cmr_in_ts == enc->avc.amr.cmr_in_ts) return; // mode change requested: check if this is allowed right now if (enc->format_options.amr.mode_change_period == 2 && (enc->avc.amr.pkt_seq & 1) != 0) @@ -3253,8 +3252,7 @@ static int packetizer_amr(AVPacket *pkt, GString *buf, str *output, encoder_t *e // or do we have a CMR? if (!enc->avc.amr.cmr_out_seq) { - if (memcmp(&enc->avc.amr.cmr_out_ts, &enc->callback.amr.cmr_out_ts, - sizeof(struct timeval))) { + if (enc->avc.amr.cmr_out_ts != enc->callback.amr.cmr_out_ts) { enc->avc.amr.cmr_out_seq += 3; // make this configurable? enc->avc.amr.cmr_out_ts = enc->callback.amr.cmr_out_ts; } @@ -4416,8 +4414,7 @@ static void evs_encoder_close(encoder_t *enc) { static void evs_handle_cmr(encoder_t *enc) { if ((enc->callback.evs.cmr_in & 0x80) == 0) return; - if (!memcmp(&enc->callback.evs.cmr_in_ts, - &enc->evs.cmr_in_ts, sizeof(struct timeval))) + if (enc->callback.evs.cmr_in_ts == enc->evs.cmr_in_ts) return; enc->evs.cmr_in_ts = enc->callback.evs.cmr_in_ts; // XXX should use a queue or something instead diff --git a/lib/codeclib.h b/lib/codeclib.h index aacbaa248..dd1d46b24 100644 --- a/lib/codeclib.h +++ b/lib/codeclib.h @@ -131,15 +131,15 @@ struct codec_type_s { struct encoder_callback_s { struct { - struct timeval cmr_in_ts; + int64_t cmr_in_ts; unsigned int cmr_in; - struct timeval cmr_out_ts; + int64_t cmr_out_ts; unsigned int cmr_out; } amr; struct { - struct timeval cmr_in_ts; + int64_t cmr_in_ts; unsigned int cmr_in; } evs; }; @@ -292,8 +292,8 @@ struct decoder_s { union { struct { uint16_t bitrate_tracker[AMR_FT_TYPES]; - struct timeval tracker_end; - struct timeval last_cmr; + int64_t tracker_end; + int64_t last_cmr; } amr; }; } avc; @@ -338,8 +338,8 @@ struct encoder_s { union { struct { - struct timeval cmr_in_ts; - struct timeval cmr_out_ts; + int64_t cmr_in_ts; + int64_t cmr_out_ts; unsigned int cmr_out_seq; uint64_t pkt_seq; } amr; @@ -351,7 +351,7 @@ struct encoder_s { struct { void *ctx; void *ind_list; - struct timeval cmr_in_ts; + int64_t cmr_in_ts; } evs; OpusEncoder *opus; };