diff options
author | Andrzej Kaczmarek <andrzej.kaczmarek@tieto.com> | 2014-05-26 15:16:30 +0200 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2014-06-01 10:17:16 +0300 |
commit | 8f14d896d1b1b252b601313bffdb55408736df2b (patch) | |
tree | 9868126f40a141441c148f0e65cdb784bfea7e41 /android/hal-audio-sbc.c | |
parent | 323e9c14ddc25bf79d42bf4564c7a74ebf5ec7ea (diff) | |
download | bluez-8f14d896d1b1b252b601313bffdb55408736df2b.tar.gz |
android/hal-audio: Fix media_packet definition
rtp_payload field in media_packet is specific for SBC codec thus it
should be moved to SBC codec implementation and removed from generic
structs.
Diffstat (limited to 'android/hal-audio-sbc.c')
-rw-r--r-- | android/hal-audio-sbc.c | 40 |
1 files changed, 37 insertions, 3 deletions
diff --git a/android/hal-audio-sbc.c b/android/hal-audio-sbc.c index a16cf7344..8366978bf 100644 --- a/android/hal-audio-sbc.c +++ b/android/hal-audio-sbc.c @@ -30,6 +30,37 @@ #define SBC_QUALITY_MIN_BITPOOL 33 #define SBC_QUALITY_STEP 5 + +#if __BYTE_ORDER == __LITTLE_ENDIAN + +struct rtp_payload { + unsigned frame_count:4; + unsigned rfa0:1; + unsigned is_last_fragment:1; + unsigned is_first_fragment:1; + unsigned is_fragmented:1; +} __attribute__ ((packed)); + +#elif __BYTE_ORDER == __BIG_ENDIAN + +struct rtp_payload { + unsigned is_fragmented:1; + unsigned is_first_fragment:1; + unsigned is_last_fragment:1; + unsigned rfa0:1; + unsigned frame_count:4; +} __attribute__ ((packed)); + +#else +#error "Unknown byte order" +#endif + +struct media_packet_sbc { + struct media_packet hdr; + struct rtp_payload payload; + uint8_t data[0]; +}; + struct sbc_data { a2dp_sbc_t sbc; @@ -306,10 +337,13 @@ static ssize_t sbc_encode_mediapacket(void *codec_data, const uint8_t *buffer, size_t mp_data_len, size_t *written) { struct sbc_data *sbc_data = (struct sbc_data *) codec_data; + struct media_packet_sbc *mp_sbc = (struct media_packet_sbc *) mp; size_t consumed = 0; size_t encoded = 0; uint8_t frame_count = 0; + mp_data_len -= sizeof(mp_sbc->payload); + while (len - consumed >= sbc_data->in_frame_len && mp_data_len - encoded >= sbc_data->out_frame_len && frame_count < MAX_FRAMES_IN_PAYLOAD) { @@ -317,7 +351,7 @@ static ssize_t sbc_encode_mediapacket(void *codec_data, const uint8_t *buffer, ssize_t written = 0; read = sbc_encode(&sbc_data->enc, buffer + consumed, - sbc_data->in_frame_len, mp->data + encoded, + sbc_data->in_frame_len, mp_sbc->data + encoded, mp_data_len - encoded, &written); if (read < 0) { @@ -331,8 +365,8 @@ static ssize_t sbc_encode_mediapacket(void *codec_data, const uint8_t *buffer, encoded += written; } - *written = encoded; - mp->payload.frame_count = frame_count; + *written = encoded + sizeof(mp_sbc->payload); + mp_sbc->payload.frame_count = frame_count; return consumed; } |