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