[pulseaudio-discuss] [PATCH v11 02/11] bluetooth: Fix usage of RTP structures in SBC codec

Pali Rohár pali.rohar at gmail.com
Sun Jun 16 16:37:37 UTC 2019


On Sunday 16 June 2019 12:06:18 Tanu Kaskinen wrote:
> On Sun, 2019-06-02 at 17:25 +0200, Pali Rohár wrote:
> > Rename struct rtp_payload to rtp_sbc_payload as it is specific for SBC
> > codec. Add proper checks for endianity in rtp.h header and use uint8_t type
> > where appropriated. And because rtp_sbc_payload structure is not parsed by
> > decoder there is no support for fragmented SBC frames. Add warning for it.
> > ---
> >  src/modules/bluetooth/a2dp-codec-sbc.c | 16 ++++++----
> >  src/modules/bluetooth/rtp.h            | 58 +++++++++++++++++++---------------
> >  2 files changed, 42 insertions(+), 32 deletions(-)
> > 
> > diff --git a/src/modules/bluetooth/a2dp-codec-sbc.c b/src/modules/bluetooth/a2dp-codec-sbc.c
> > index f339b570d..6ab0b46cd 100644
> > --- a/src/modules/bluetooth/a2dp-codec-sbc.c
> > +++ b/src/modules/bluetooth/a2dp-codec-sbc.c
> > @@ -480,7 +480,7 @@ static void reset(void *codec_info) {
> >  
> >  static void get_buffer_size(void *codec_info, size_t link_mtu, size_t *decoded_buffer_size, size_t *encoded_buffer_size) {
> >      struct sbc_info *sbc_info = (struct sbc_info *) codec_info;
> > -    size_t rtp_size = sizeof(struct rtp_header) + sizeof(struct rtp_payload);
> > +    size_t rtp_size = sizeof(struct rtp_header) + sizeof(struct rtp_sbc_payload);
> >      size_t num_of_frames = (link_mtu - rtp_size) / sbc_info->frame_length;
> >  
> >      *decoded_buffer_size = num_of_frames * sbc_info->codesize;
> > @@ -510,14 +510,14 @@ static int reduce_encoder_bitrate(void *codec_info) {
> >  static size_t encode_buffer(void *codec_info, uint32_t timestamp, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed) {
> >      struct sbc_info *sbc_info = (struct sbc_info *) codec_info;
> >      struct rtp_header *header;
> > -    struct rtp_payload *payload;
> > +    struct rtp_sbc_payload *payload;
> >      uint8_t *d;
> >      const uint8_t *p;
> >      size_t to_write, to_encode;
> >      unsigned frame_count;
> >  
> >      header = (struct rtp_header*) output_buffer;
> > -    payload = (struct rtp_payload*) (output_buffer + sizeof(*header));
> > +    payload = (struct rtp_sbc_payload*) (output_buffer + sizeof(*header));
> >  
> >      frame_count = 0;
> >  
> > @@ -562,7 +562,7 @@ static size_t encode_buffer(void *codec_info, uint32_t timestamp, const uint8_t
> >      } PA_ONCE_END;
> >  
> >      /* write it to the fifo */
> > -    memset(output_buffer, 0, sizeof(*header) + sizeof(*payload));
> > +    pa_memzero(output_buffer, sizeof(*header) + sizeof(*payload));
> >      header->v = 2;
> >  
> >      /* A2DP spec: "A payload type in the RTP dynamic range shall be chosen".
> > @@ -583,13 +583,17 @@ static size_t decode_buffer(void *codec_info, const uint8_t *input_buffer, size_
> >      struct sbc_info *sbc_info = (struct sbc_info *) codec_info;
> >  
> >      struct rtp_header *header;
> > -    struct rtp_payload *payload;
> > +    struct rtp_sbc_payload *payload;
> >      const uint8_t *p;
> >      uint8_t *d;
> >      size_t to_write, to_decode;
> >  
> >      header = (struct rtp_header *) input_buffer;
> > -    payload = (struct rtp_payload*) (input_buffer + sizeof(*header));
> > +    payload = (struct rtp_sbc_payload*) (input_buffer + sizeof(*header));
> > +
> > +    /* TODO: Add support for decoding fragmented SBC frames */
> > +    if (payload->is_fragmented)
> > +        pa_log_warn("SBC frame is fragmented, decoding may fail");
> 
> If we don't currently support fragmented frames, I think it would be
> better to just flat out fail here.

Ok, that sounds better. Throw an error and stop decoding.

> I imagine we'll hit a fatal error
> soon anyway, but if by some miracle PulseAudio managed to decode the
> stream anyway (maybe the frames aren't fragmented after all), the
> syslog would potentially get flooded with these warnings.
> 

-- 
Pali Rohár
pali.rohar at gmail.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 195 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/pulseaudio-discuss/attachments/20190616/e018271f/attachment.sig>


More information about the pulseaudio-discuss mailing list