[pulseaudio-discuss] About extra A2DP codecs support in bluetooth module
Arun Raghavan
arun at arunraghavan.net
Sat Jul 15 06:08:39 UTC 2017
On Sat, 15 Jul 2017, at 11:37 AM, Arun Raghavan wrote:
>
>
> On Fri, 14 Jul 2017, at 06:50 AM, Qu Wenruo wrote:
> >
> >
> > On 2017年07月12日 17:57, Arun Raghavan wrote:
> > > On Fri, 7 Jul 2017, at 08:35 PM, Tanu Kaskinen wrote:
> > >> On Fri, 2017-07-07 at 20:33 +0800, Qu Wenruo wrote:
> > >>> After a quick glance into the code (without much knowledge about
> > >>> pulseaudio), I found that pulseaudio is just using sbc library to do the
> > >>> encode.
> > >>>
> > >>> From a2dp_process_render():
> > >>> ---
> > >>> while (PA_LIKELY(to_encode > 0 && to_write > 0)) {
> > >>> ssize_t written;
> > >>> ssize_t encoded;
> > >>>
> > >>> encoded = sbc_encode(&sbc_info->sbc,
> > >>> p, to_encode,
> > >>> d, to_write,
> > >>> &written);
> > >>> ---
> > >>>
> > >>> So there is really nothing blocking us to implement other codec.
> > >>> For AAC codec, just (well, without tons of preparation and setup) call
> > >>> faacEncEncode() will be the core part.
> > >>> Copyright sh*t will only restrict the related library, not the PA module.
> > >>> (So if we could create a aptX codec library, then it will be possible to
> > >>> support)
> > >>>
> > >>> While the really hard part would be the preparation part, including
> > >>> creating a structure for faac encoder to contain a faacEncHandle and
> > >>> other needed info from sample rate to profile, just like sbc_info_t.
> > >>>
> > >>> Although I have a basic idea of what to do, I'm still figuring out how
> > >>> to handle all the details.
> > >>> Like how to create an endpoint for AAC codec (codec 0 is registered at
> > >>> register_endpoint, but shouldn't it be A2DP_CODEC_SBC instead of
> > >>> intermediate number 0?)
> > >>
> > >> I don't know bluetooth details enough to answer. I'll add Luiz to Cc in
> > >> case he knows. You could try asking on the bluez mailing list too.
> > >
> > > I would suggest just hiding away the entire RTP payloading and encoding
> > > using GStreamer here. That neatly sidesteps the issue of
> > > hardware/software codecs, IP-sensitive codec libraries, and so forth. We
> > > probably want to keep the SBC path available the way it is right now to
> > > avoid GStreamer as a hard-dep, but otherwise, I think that's the more
> > > sensible approach to this.
> >
> > I'm still fighting against dbus and bluez5 things, so GStreamer is not
> > my primary goal.
> > But the idea to let a framework to handle everything indeed looks neat
> > and clean.
> >
> > However I'm more concerned about how the final A2DP profile is
> > determined.
> >
> > From what I can see, pulseaudio bluetooth modules just register
> > endpoint for bluez, with Codec, UUID and codec specified capabilities.
> > However I didn't see how codec selection is done.
> >
> > Is it done by bluez5 or pulseaudio?
> >
> > My currect understanding to implement a new codec will need:
> > 1) Register a new codec in register_endpoint() of bluez5-util.c of PA.
> > Instead of codec 0 (shouldn't it be A2DP_CODEC_SBC?), we must also
> > register codec
> > A2DP_CODEC_MPEG24 with a2dp_aac_t as capability.
> >
> > Well, updated a2dp-codec.h header will be needed, as there is no
> > a2dp_aac_t in PA.
>
> Correct.
>
> > 2) Handle codec capabilities negotiation
> > endpoint_set_configuration() seems to be responsible to send out the
> > final
> > SetConfiguration AVDTP packet.
> > But which codec will bluez5 choose? Just highest codec number of
> > both SINK and SOURCE
> > device?
> >
> > endpoint_select_configuration() seems to be related to handle the
> > response from the SINK
> > device.
>
> Right again.
>
> Maybe get this working, and then we can worry about how to select
> codecs. It'll probably have to be based on some module configuration
> (which in turn will be guided by the h/w that this is running on).
> Default could be something we select based on order of quality.
>
> > But for multi-codec support, how do we distinguish one codec
> > capability from another?
> >
> > 3) Record final codec profile into some structure of userdata in
> > module-bluez5-devices.c
> >
> > 4) Call codec encode function in thread_func()
> >
> > Any comment is welcomed.
>
> With GStreamer, either you'd probably do something like appsrc !
> <encoder> ! <rtp payloader> ! appsink to run the encode, in
> a2dp_process_render().
The "either" was for a second option involving directly writing to an
fdsink, but I think we should keep that in PA so coexisting with the
current SBC code is easier.
-- Arun
More information about the pulseaudio-discuss
mailing list