fix sdp_audio_codec_to_speech_codec_list() for multiple AMR
Instead of returning multiple occurences of AMR as duplicated gsm0808_speech_codec_type entries, combine their cfg bits to form a single entry listing all AMR rate combinations that are allowed. Prepare for AMR mode-set negotiation: soon we'll have multiple AMR variants in codec_mapping.c, and then these must produce correct gsm0808_speech_codec_list. Change-Id: Ibeffb6c1325abebb904a14f00e6a0818870b119e
This commit is contained in:
parent
efd374a03e
commit
e3059a74f7
|
@ -402,16 +402,43 @@ void sdp_audio_codecs_from_bearer_cap(struct sdp_audio_codecs *ac, const struct
|
||||||
* sdp_audio_codec, and -ENOSPC when scl is full and nothing could be added. */
|
* sdp_audio_codec, and -ENOSPC when scl is full and nothing could be added. */
|
||||||
int sdp_audio_codec_to_speech_codec_list(struct gsm0808_speech_codec_list *scl, const struct sdp_audio_codec *codec)
|
int sdp_audio_codec_to_speech_codec_list(struct gsm0808_speech_codec_list *scl, const struct sdp_audio_codec *codec)
|
||||||
{
|
{
|
||||||
const struct codec_mapping *m = codec_mapping_by_subtype_name(codec->subtype_name);
|
const struct codec_mapping *m;
|
||||||
if (!m)
|
int added = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
codec_mapping_foreach (m) {
|
||||||
|
if (sdp_audio_codec_cmp(&m->sdp, codec, true, false))
|
||||||
|
continue;
|
||||||
|
if (!m->has_gsm0808_speech_codec)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
/* If there already is an entry for this gsm0808_speech_codec_type, don't add another one. */
|
||||||
|
for (i = 0; i < scl->len; i++) {
|
||||||
|
if (scl->codec[i].type == m->gsm0808_speech_codec.type)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* If i is a valid index now, it means this gsm0808_speech_codec_type is already listed. */
|
||||||
|
if (i < scl->len) {
|
||||||
|
/* In case of FR3 and HR3 == AMR, bitwise-or the gsm0808_speech_codec.cfg to accumulate Sn.
|
||||||
|
* The cfg represents a bitmask of Sn bits. codec_mapping.c lists each of these bits separately,
|
||||||
|
* but on the A-interface, send a combined mask. */
|
||||||
|
if (m->gsm0808_speech_codec.type == GSM0808_SCT_FR3
|
||||||
|
|| m->gsm0808_speech_codec.type == GSM0808_SCT_HR3)
|
||||||
|
scl->codec[i].cfg |= m->gsm0808_speech_codec.cfg;
|
||||||
|
/* We found and possibly enriched an existing entry. Nothing left to do for this codec. */
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Not listed yet. Create a new entry. */
|
||||||
|
if (scl->len >= ARRAY_SIZE(scl->codec))
|
||||||
|
return -ENOSPC;
|
||||||
|
|
||||||
|
scl->codec[scl->len] = m->gsm0808_speech_codec;
|
||||||
|
scl->len++;
|
||||||
|
added++;
|
||||||
|
}
|
||||||
|
if (!added)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
if (!m->has_gsm0808_speech_codec)
|
|
||||||
return -ENOENT;
|
|
||||||
if (scl->len >= ARRAY_SIZE(scl->codec))
|
|
||||||
return -ENOSPC;
|
|
||||||
scl->codec[scl->len] = m->gsm0808_speech_codec;
|
|
||||||
/* FIXME: apply AMR configuration according to codec->fmtp */
|
|
||||||
scl->len++;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue