mbox series

[BlueZ,0/7] Add BIP for AVRCP covert art OBEX client

Message ID 20240904140421.283166-1-frederic.danis@collabora.com
Headers show
Series Add BIP for AVRCP covert art OBEX client | expand

Message

Frédéric Danis Sept. 4, 2024, 2:04 p.m. UTC
If AVRCP Target supports Cover Art download its SDP record contains an
additional access protocol for OBEX with an LCAP PSM on which the OBEX
client session should connect to, with the specific OBEX target header
7163DD54-4A7E-11E2-B47C-0050C2490048.

Once the OBEX session is connected, the AVRCP track metadata will contain
an Image Handle which can be used to get the associated image using
GetImageThumbnail or GetImage with one of the description property found
with GetImageProperties.

Frédéric Danis (7):
  obexd: Add PSM support to session create
  player: Add OBEX PSM port for cover art support
  player: Add image handle support property
  obexd: Add BIP client for AVRCP cover art download.
  obexd: Add GetImageProperties to bip-avrcp
  obexd: Add GetImage to bip-avrcp
  doc: Add description of org.bluez.obex.BipAvrcp

 Makefile.am                     |   9 +-
 Makefile.obexd                  |   2 +
 doc/org.bluez.MediaPlayer.rst   |  10 +
 doc/org.bluez.obex.BipAvrcp.rst |  72 +++
 doc/org.bluez.obex.Client.rst   |   5 +
 doc/org.bluez.obex.Session.rst  |   5 +
 monitor/avctp.c                 |   3 +
 obexd/client/bip-avrcp.c        | 421 +++++++++++++++++
 obexd/client/bip-avrcp.h        |  12 +
 obexd/client/bip-common.c       | 769 ++++++++++++++++++++++++++++++++
 obexd/client/bip-common.h       |  25 ++
 obexd/client/manager.c          |  16 +-
 obexd/client/session.c          |  27 +-
 obexd/client/session.h          |   1 +
 obexd/client/transfer.c         |  16 +
 obexd/client/transfer.h         |   2 +
 profiles/audio/avrcp.c          |  64 ++-
 profiles/audio/avrcp.h          |   3 +-
 profiles/audio/player.c         |  29 ++
 profiles/audio/player.h         |   1 +
 tools/parser/avrcp.c            |   3 +
 21 files changed, 1476 insertions(+), 19 deletions(-)
 create mode 100644 doc/org.bluez.obex.BipAvrcp.rst
 create mode 100644 obexd/client/bip-avrcp.c
 create mode 100644 obexd/client/bip-avrcp.h
 create mode 100644 obexd/client/bip-common.c
 create mode 100644 obexd/client/bip-common.h

Comments

Luiz Augusto von Dentz Sept. 4, 2024, 3:07 p.m. UTC | #1
Hi Frédéric,

On Wed, Sep 4, 2024 at 10:04 AM Frédéric Danis
<frederic.danis@collabora.com> wrote:
>
> This is part of the metadata when the AVRCP target supports covert
> art download and a OBEX BIP session is connected.
> The image handle references the cover art associated to the track,
> and is valid only during OBEX BIP session.
> ---
>  doc/org.bluez.MediaPlayer.rst | 4 ++++
>  monitor/avctp.c               | 3 +++
>  profiles/audio/avrcp.c        | 7 ++++++-
>  profiles/audio/avrcp.h        | 3 ++-
>  tools/parser/avrcp.c          | 3 +++
>  5 files changed, 18 insertions(+), 2 deletions(-)
>
> diff --git a/doc/org.bluez.MediaPlayer.rst b/doc/org.bluez.MediaPlayer.rst
> index f1e999bdf..5bb38e7c2 100644
> --- a/doc/org.bluez.MediaPlayer.rst
> +++ b/doc/org.bluez.MediaPlayer.rst
> @@ -237,6 +237,10 @@ dict Track [readonly]
>
>                 Track duration in milliseconds
>
> +       :string ImgHandle:
> +
> +               Track image handle

I guess we want something more descriptive here, as ThumbnailURL or
something .e.g obex://<handle>, that said I don't know if perhaps we
could load it automatically via plugin.

>  object Device [readonly]
>  ````````````````````````
>
> diff --git a/monitor/avctp.c b/monitor/avctp.c
> index c59e93b20..4da448750 100644
> --- a/monitor/avctp.c
> +++ b/monitor/avctp.c
> @@ -156,6 +156,7 @@
>  #define AVRCP_MEDIA_ATTRIBUTE_TOTAL    0x05
>  #define AVRCP_MEDIA_ATTRIBUTE_GENRE    0x06
>  #define AVRCP_MEDIA_ATTRIBUTE_DURATION 0x07
> +#define AVRCP_MEDIA_ATTRIBUTE_IMG_HANDLE       0x08
>
>  /* play status */
>  #define AVRCP_PLAY_STATUS_STOPPED      0x00
> @@ -582,6 +583,8 @@ static const char *mediattr2str(uint32_t attr)
>                 return "Genre";
>         case AVRCP_MEDIA_ATTRIBUTE_DURATION:
>                 return "Track duration";
> +       case AVRCP_MEDIA_ATTRIBUTE_IMG_HANDLE:
> +               return "Imaging handle";
>         default:
>                 return "Reserved";
>         }
> diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
> index 61558e492..fe24b5a92 100644
> --- a/profiles/audio/avrcp.c
> +++ b/profiles/audio/avrcp.c
> @@ -417,7 +417,8 @@ static sdp_record_t *avrcp_ct_record(bool browsing)
>         uint16_t feat = ( AVRCP_FEATURE_CATEGORY_1 |
>                                                 AVRCP_FEATURE_CATEGORY_2 |
>                                                 AVRCP_FEATURE_CATEGORY_3 |
> -                                               AVRCP_FEATURE_CATEGORY_4);
> +                                               AVRCP_FEATURE_CATEGORY_4 |
> +                                               AVRCP_FEATURE_CT_GET_THUMBNAIL);
>
>         record = sdp_record_alloc();
>         if (!record)
> @@ -883,6 +884,8 @@ static const char *metadata_to_str(uint32_t id)
>                 return "NumberOfTracks";
>         case AVRCP_MEDIA_ATTRIBUTE_DURATION:
>                 return "Duration";
> +       case AVRCP_MEDIA_ATTRIBUTE_IMG_HANDLE:
> +               return "ImgHandle";
>         }
>
>         return NULL;
> @@ -1197,6 +1200,8 @@ static uint32_t str_to_metadata(const char *str)
>                 return AVRCP_MEDIA_ATTRIBUTE_N_TRACKS;
>         else if (strcasecmp(str, "Duration") == 0)
>                 return AVRCP_MEDIA_ATTRIBUTE_DURATION;
> +       else if (strcasecmp(str, "ImgHandle") == 0)
> +               return AVRCP_MEDIA_ATTRIBUTE_IMG_HANDLE;
>
>         return 0;
>  }
> diff --git a/profiles/audio/avrcp.h b/profiles/audio/avrcp.h
> index dcc580e37..59117e946 100644
> --- a/profiles/audio/avrcp.h
> +++ b/profiles/audio/avrcp.h
> @@ -46,7 +46,8 @@
>  #define AVRCP_MEDIA_ATTRIBUTE_N_TRACKS 0x05
>  #define AVRCP_MEDIA_ATTRIBUTE_GENRE    0x06
>  #define AVRCP_MEDIA_ATTRIBUTE_DURATION 0x07
> -#define AVRCP_MEDIA_ATTRIBUTE_LAST     AVRCP_MEDIA_ATTRIBUTE_DURATION
> +#define AVRCP_MEDIA_ATTRIBUTE_IMG_HANDLE       0x08
> +#define AVRCP_MEDIA_ATTRIBUTE_LAST     AVRCP_MEDIA_ATTRIBUTE_IMG_HANDLE
>
>  /* play status */
>  #define AVRCP_PLAY_STATUS_STOPPED      0x00
> diff --git a/tools/parser/avrcp.c b/tools/parser/avrcp.c
> index e73a6317e..d574c7ee3 100644
> --- a/tools/parser/avrcp.c
> +++ b/tools/parser/avrcp.c
> @@ -160,6 +160,7 @@
>  #define AVRCP_MEDIA_ATTRIBUTE_TOTAL    0x5
>  #define AVRCP_MEDIA_ATTRIBUTE_GENRE    0x6
>  #define AVRCP_MEDIA_ATTRIBUTE_DURATION 0x7
> +#define AVRCP_MEDIA_ATTRIBUTE_IMG_HANDLE       0x08
>
>  /* play status */
>  #define AVRCP_PLAY_STATUS_STOPPED      0x00
> @@ -933,6 +934,8 @@ static const char *mediattr2str(uint32_t attr)
>                 return "Genre";
>         case AVRCP_MEDIA_ATTRIBUTE_DURATION:
>                 return "Track duration";
> +       case AVRCP_MEDIA_ATTRIBUTE_IMG_HANDLE:
> +               return "Imaging handle";
>         default:
>                 return "Reserved";
>         }
> --
> 2.34.1
>
>