/******************************************************************************
 *
 *  Copyright 2002-2012 Broadcom Corporation
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at:
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *
 ******************************************************************************/

/******************************************************************************
 *
 *  This interface file contains the interface to the Audio Video
 *  Distribution Transport Protocol (AVDTP).
 *
 ******************************************************************************/
#ifndef AVDT_API_H
#define AVDT_API_H

#include "bt_target.h"
#include "bt_types.h"

/*****************************************************************************
 *  Constants
 ****************************************************************************/
#define AVDT_VERSION_1_3 0x0103

#define AVDTP_VERSION_CONFIG_KEY "AvdtpVersion"

/* Maximum size in bytes of the codec capabilities information element. */
#define AVDT_CODEC_SIZE 20

/* API function return value result codes. */
#define AVDT_SUCCESS 0      /* Function successful */
#define AVDT_BAD_PARAMS 1   /* Invalid parameters */
#define AVDT_NO_RESOURCES 2 /* Not enough resources */
#define AVDT_BAD_HANDLE 3   /* Bad handle */
#define AVDT_BUSY 4         /* A procedure is already in progress */
#define AVDT_WRITE_FAIL 5   /* Write failed */

/* The index to access the codec type in codec_info[]. */
#define AVDT_CODEC_TYPE_INDEX 2

/* The size in bytes of a Adaptation Layer header. */
#define AVDT_AL_HDR_SIZE 3

/* The size in bytes of a media packet header. */
#define AVDT_MEDIA_HDR_SIZE 12

/* The handle is used when reporting MULTI_AV specific events */
#define AVDT_MULTI_AV_HANDLE 0xFF

/* The number of bytes needed by the protocol stack for the protocol headers
 * of a media packet.  This is the size of the media packet header, the
 * L2CAP packet header and HCI header.
*/
#define AVDT_MEDIA_OFFSET 23

/* The marker bit is used by the application to mark significant events such
 * as frame boundaries in the data stream.  This constant is used to check or
 * set the marker bit in the m_pt parameter of an AVDT_WriteReq()
 * or AVDT_DATA_IND_EVT.
*/
#define AVDT_MARKER_SET 0x80

/* SEP Type.  This indicates the stream endpoint type. */
#define AVDT_TSEP_SRC 0     /* Source SEP */
#define AVDT_TSEP_SNK 1     /* Sink SEP */
#define AVDT_TSEP_INVALID 3 /* Invalid SEP */

/* initiator/acceptor role for adaption */
#define AVDT_INT 0 /* initiator */
#define AVDT_ACP 1 /* acceptor */

/* Media Type of the stream endpoint */
/* The value does not include the reserved 4-bit LSBs field */
#define AVDT_MEDIA_TYPE_AUDIO 0 /* Audio SEP */
#define AVDT_MEDIA_TYPE_VIDEO 1 /* Video SEP */
#define AVDT_MEDIA_TYPE_MULTI 2 /* Multimedia SEP */

/* for reporting packets (packet types) */
#define AVDT_RTCP_PT_SR 200   /* SR (Sender Report) */
#define AVDT_RTCP_PT_RR 201   /* RR (Receiver Report) */
#define AVDT_RTCP_PT_SDES 202 /* SDES (Source Description) */
typedef uint8_t AVDT_REPORT_TYPE;

#define AVDT_RTCP_SDES_CNAME 1 /* SDES item CNAME */
#ifndef AVDT_MAX_CNAME_SIZE
#define AVDT_MAX_CNAME_SIZE 28
#endif

/* Protocol service capabilities.  This indicates the protocol service
 * capabilities of a stream endpoint.  This value is a mask.
 * Multiple values can be combined with a bitwise OR.
*/
#define AVDT_PSC_TRANS (1 << 1)     /* Media transport */
#define AVDT_PSC_REPORT (1 << 2)    /* Reporting */
#define AVDT_PSC_RECOV (1 << 3)     /* Recovery */
#define AVDT_PSC_HDRCMP (1 << 5)    /* Header compression */
#define AVDT_PSC_MUX (1 << 6)       /* Multiplexing */
#define AVDT_PSC_DELAY_RPT (1 << 8) /* Delay Report */

/* Recovery type.  This indicates the recovery type. */
#define AVDT_RECOV_RFC2733 1 /* RFC2733 recovery */

/* Header compression capabilities.  This indicates the header compression
 * capabilities.  This value is a mask.  Multiple values can be combined
 * with a bitwise OR.
*/
#define AVDT_HDRCMP_MEDIA (1 << 5)  /* Available for media packets */
#define AVDT_HDRCMP_RECOV (1 << 6)  /* Available for recovery packets */
#define AVDT_HDRCMP_BACKCH (1 << 7) /* Back channel supported */

/* Multiplexing capabilities mask. */
#define AVDT_MUX_FRAG (1 << 7) /* Allow Adaptation Layer Fragmentation */

/* Application service category. This indicates the application
 * service category.
*/
#define AVDT_ASC_PROTECT 4 /* Content protection */
#define AVDT_ASC_CODEC 7   /* Codec */

/* the content protection IDs assigned by BT SIG */
#define AVDT_CP_SCMS_T_ID 0x0002
#define AVDT_CP_DTCP_ID 0x0001

#define AVDT_CP_LOSC 2
#define AVDT_CP_INFO_LEN 3

#define AVDT_CP_SCMS_COPY_MASK 3
#define AVDT_CP_SCMS_COPY_FREE 2
#define AVDT_CP_SCMS_COPY_ONCE 1
#define AVDT_CP_SCMS_COPY_NEVER 0

/* Error codes.  The following are error codes defined in the AVDTP and GAVDP
 * specifications.  These error codes communicate protocol errors between
 * AVDTP and the application.  More detailed descriptions of the error codes
 * and their appropriate use can be found in the AVDTP and GAVDP specifications.
 * These error codes are unrelated to the result values returned by the
 * AVDTP API functions.
*/
/* Bad packet header format */
#define AVDT_ERR_HEADER 0x01
/* Bad packet length */
#define AVDT_ERR_LENGTH 0x11
/* Invalid SEID */
#define AVDT_ERR_SEID 0x12
/* The SEP is in use */
#define AVDT_ERR_IN_USE 0x13
/* The SEP is not in use */
#define AVDT_ERR_NOT_IN_USE 0x14
/* Bad service category */
#define AVDT_ERR_CATEGORY 0x17
/* Bad payload format */
#define AVDT_ERR_PAYLOAD 0x18
/* Requested command not supported */
#define AVDT_ERR_NSC 0x19
/* Reconfigure attempted invalid capabilities */
#define AVDT_ERR_INVALID_CAP 0x1A
/* Requested recovery type not defined */
#define AVDT_ERR_RECOV_TYPE 0x22
/* Media transport capability not correct */
#define AVDT_ERR_MEDIA_TRANS 0x23
/* Recovery service capability not correct */
#define AVDT_ERR_RECOV_FMT 0x25
/* Header compression service capability not correct */
#define AVDT_ERR_ROHC_FMT 0x26
/* Content protection service capability not correct */
#define AVDT_ERR_CP_FMT 0x27
/* Multiplexing service capability not correct */
#define AVDT_ERR_MUX_FMT 0x28
/* Configuration not supported */
#define AVDT_ERR_UNSUP_CFG 0x29
/* Message cannot be processed in this state */
#define AVDT_ERR_BAD_STATE 0x31
/* Report service capability not correct */
#define AVDT_ERR_REPORT_FMT 0x65
/* Invalid service category */
#define AVDT_ERR_SERVICE 0x80
/* Insufficient resources */
#define AVDT_ERR_RESOURCE 0x81
/* Invalid Media Codec Type */
#define AVDT_ERR_INVALID_MCT 0xC1
/* Unsupported Media Codec Type */
#define AVDT_ERR_UNSUP_MCT 0xC2
/* Invalid Level */
#define AVDT_ERR_INVALID_LEVEL 0xC3
/* Unsupported Level */
#define AVDT_ERR_UNSUP_LEVEL 0xC4
/* Invalid Content Protection Type */
#define AVDT_ERR_INVALID_CP 0xE0
/* Invalid Content Protection format */
#define AVDT_ERR_INVALID_FORMAT 0xE1

/* Additional error codes.  This indicates error codes used by AVDTP
 * in addition to the ones defined in the specifications.
*/
#define AVDT_ERR_CONNECT 0x07 /* Connection failed. */
#define AVDT_ERR_TIMEOUT 0x08 /* Response timeout. */

/* Control callback events. */
#define AVDT_DISCOVER_CFM_EVT 0      /* Discover confirm */
#define AVDT_GETCAP_CFM_EVT 1        /* Get capabilities confirm */
#define AVDT_OPEN_CFM_EVT 2          /* Open confirm */
#define AVDT_OPEN_IND_EVT 3          /* Open indication */
#define AVDT_CONFIG_IND_EVT 4        /* Configuration indication */
#define AVDT_START_CFM_EVT 5         /* Start confirm */
#define AVDT_START_IND_EVT 6         /* Start indication */
#define AVDT_SUSPEND_CFM_EVT 7       /* Suspend confirm */
#define AVDT_SUSPEND_IND_EVT 8       /* Suspend indication */
#define AVDT_CLOSE_CFM_EVT 9         /* Close confirm */
#define AVDT_CLOSE_IND_EVT 10        /* Close indication */
#define AVDT_RECONFIG_CFM_EVT 11     /* Reconfiguration confirm */
#define AVDT_RECONFIG_IND_EVT 12     /* Reconfiguration indication */
#define AVDT_SECURITY_CFM_EVT 13     /* Security confirm */
#define AVDT_SECURITY_IND_EVT 14     /* Security indication */
#define AVDT_WRITE_CFM_EVT 15        /* Write confirm */
#define AVDT_CONNECT_IND_EVT 16      /* Signaling channel connected */
#define AVDT_DISCONNECT_IND_EVT 17   /* Signaling channel disconnected */
#define AVDT_REPORT_CONN_EVT 18      /* Reporting channel connected */
#define AVDT_REPORT_DISCONN_EVT 19   /* Reporting channel disconnected */
#define AVDT_DELAY_REPORT_EVT 20     /* Delay report received */
#define AVDT_DELAY_REPORT_CFM_EVT 21 /* Delay report response received */

#define AVDT_MAX_EVT (AVDT_DELAY_REPORT_CFM_EVT)

/* PSM for AVDT */
#define AVDT_PSM 0x0019

/*****************************************************************************
 *  Type Definitions
 ****************************************************************************/

typedef struct {
  uint32_t ntp_sec; /* NTP time: seconds relative to 0h UTC on 1 January 1900 */
  uint32_t ntp_frac;    /* NTP time: the fractional part */
  uint32_t rtp_time;    /* timestamp in RTP header */
  uint32_t pkt_count;   /* sender's packet count: since starting transmission
                        * up until the time this SR packet was generated. */
  uint32_t octet_count; /* sender's octet count: same comment */
} tAVDT_SENDER_INFO;

typedef struct {
  uint8_t frag_lost; /* fraction lost since last RR */
  uint32_t
      packet_lost; /* cumulative number of packets lost since the beginning */
  uint32_t seq_num_rcvd; /* extended highest sequence number received */
  uint32_t jitter;       /* interarrival jitter */
  uint32_t lsr;          /* last SR timestamp */
  uint32_t dlsr;         /* delay since last SR */
} tAVDT_REPORT_BLK;

typedef union {
  tAVDT_SENDER_INFO sr;
  tAVDT_REPORT_BLK rr;
  uint8_t cname[AVDT_MAX_CNAME_SIZE + 1];
} tAVDT_REPORT_DATA;

/**
 * AVDTP Registration Control Block.
 */
class AvdtpRcb {
 public:
  AvdtpRcb()
      : ctrl_mtu(0),
        ret_tout(0),
        sig_tout(0),
        idle_tout(0),
        sec_mask(0),
        scb_index(0) {}
  AvdtpRcb& operator=(const AvdtpRcb&) = default;

  void Reset() {
    ctrl_mtu = 0;
    ret_tout = 0;
    sig_tout = 0;
    idle_tout = 0;
    sec_mask = 0;
    scb_index = 0;
  }

  uint16_t ctrl_mtu; /* L2CAP MTU of the AVDTP signaling channel */
  uint8_t ret_tout;  /* AVDTP signaling retransmission timeout */
  uint8_t sig_tout;  /* AVDTP signaling message timeout */
  uint8_t idle_tout; /* AVDTP idle signaling channel timeout */
  uint8_t sec_mask;  /* Security mask for BTM_SetSecurityLevel() */
  uint8_t scb_index; /* The Stream Control Block index */
};

/* This structure contains the SEP information.  This information is
 * transferred during the discovery procedure.
*/
typedef struct {
  bool in_use;        /* true if stream is currently in use */
  uint8_t seid;       /* Stream endpoint identifier */
  uint8_t media_type; /* Media type: AVDT_MEDIA_TYPE_* */
  uint8_t tsep;       /* SEP type */
} tAVDT_SEP_INFO;

/**
 * AVDTP SEP Configuration.
 */
class AvdtpSepConfig {
 public:
  AvdtpSepConfig()
      : codec_info{},
        protect_info{},
        num_codec(0),
        num_protect(0),
        psc_mask(0),
        recov_type(0),
        recov_mrws(0),
        recov_mnmp(0),
        hdrcmp_mask(0) {}
  AvdtpSepConfig& operator=(const AvdtpSepConfig&) = default;

  void Reset() {
    memset(codec_info, 0, sizeof(codec_info));
    memset(protect_info, 0, sizeof(protect_info));
    num_codec = 0;
    num_protect = 0;
    psc_mask = 0;
    recov_type = 0;
    recov_mrws = 0;
    recov_mnmp = 0;
    hdrcmp_mask = 0;
  }

  uint8_t codec_info[AVDT_CODEC_SIZE];     /* Codec capabilities array */
  uint8_t protect_info[AVDT_PROTECT_SIZE]; /* Content protection capabilities */
  uint8_t num_codec;   /* Number of media codec information elements */
  uint8_t num_protect; /* Number of content protection information elements */
  uint16_t psc_mask;   /* Protocol service capabilities mask */
  uint8_t recov_type;  /* Recovery type */
  uint8_t recov_mrws;  /* Maximum recovery window size */
  uint8_t recov_mnmp;  /* Recovery maximum number of media packets */
  uint8_t hdrcmp_mask; /* Header compression capabilities */
};

/* Header structure for callback event parameters. */
typedef struct {
  uint8_t
      err_code; /* Zero if operation succeeded; nonzero if operation failed */
  uint8_t err_param; /* Error parameter included for some events */
  uint8_t label;     /* Transaction label */
  uint8_t seid;      /* For internal use only */
  uint8_t sig_id;    /* For internal use only */
  uint8_t ccb_idx;   /* For internal use only */
} tAVDT_EVT_HDR;

/* This data structure is associated with the AVDT_GETCAP_CFM_EVT,
 * AVDT_RECONFIG_IND_EVT, and AVDT_RECONFIG_CFM_EVT.
*/
typedef struct {
  tAVDT_EVT_HDR hdr; /* Event header */
  AvdtpSepConfig* p_cfg; /* Pointer to configuration for this SEP */
} tAVDT_CONFIG;

/* This data structure is associated with the AVDT_CONFIG_IND_EVT. */
typedef struct {
  tAVDT_EVT_HDR hdr; /* Event header */
  AvdtpSepConfig* p_cfg; /* Pointer to configuration for this SEP */
  uint8_t int_seid;  /* Stream endpoint ID of stream initiating the operation */
} tAVDT_SETCONFIG;

/* This data structure is associated with the AVDT_OPEN_IND_EVT and
 * AVDT_OPEN_CFM_EVT. */
typedef struct {
  tAVDT_EVT_HDR hdr; /* Event header */
  uint16_t peer_mtu; /* Transport channel L2CAP MTU of the peer */
  uint16_t lcid;     /* L2CAP LCID for media channel */
} tAVDT_OPEN;

/* This data structure is associated with the AVDT_SECURITY_IND_EVT
 * and AVDT_SECURITY_CFM_EVT.
*/
typedef struct {
  tAVDT_EVT_HDR hdr; /* Event header */
  uint8_t* p_data;   /* Pointer to security data */
  uint16_t len;      /* Length in bytes of the security data */
} tAVDT_SECURITY;

/* This data structure is associated with the AVDT_DISCOVER_CFM_EVT. */
typedef struct {
  tAVDT_EVT_HDR hdr;          /* Event header */
  tAVDT_SEP_INFO* p_sep_info; /* Pointer to SEP information */
  uint8_t num_seps;           /* Number of stream endpoints */
} tAVDT_DISCOVER;

/* This data structure is associated with the AVDT_DELAY_REPORT_EVT. */
typedef struct {
  tAVDT_EVT_HDR hdr; /* Event header */
  uint16_t delay;    /* Delay value */
} tAVDT_DELAY_RPT;

/* Union of all control callback event data structures */
typedef union {
  tAVDT_EVT_HDR hdr;
  tAVDT_DISCOVER discover_cfm;
  tAVDT_CONFIG getcap_cfm;
  tAVDT_OPEN open_cfm;
  tAVDT_OPEN open_ind;
  tAVDT_SETCONFIG config_ind;
  tAVDT_EVT_HDR start_cfm;
  tAVDT_EVT_HDR suspend_cfm;
  tAVDT_EVT_HDR close_cfm;
  tAVDT_CONFIG reconfig_cfm;
  tAVDT_CONFIG reconfig_ind;
  tAVDT_SECURITY security_cfm;
  tAVDT_SECURITY security_ind;
  tAVDT_EVT_HDR connect_ind;
  tAVDT_EVT_HDR disconnect_ind;
  tAVDT_EVT_HDR report_conn;
  tAVDT_DELAY_RPT delay_rpt_cmd;
} tAVDT_CTRL;

/* This is the control callback function.  This function passes control events
 * to the application.  This function is required for all registered stream
 * endpoints and for the AVDT_DiscoverReq() and AVDT_GetCapReq() functions.
 *
*/
typedef void(tAVDT_CTRL_CBACK)(uint8_t handle, const RawAddress& bd_addr,
                               uint8_t event, tAVDT_CTRL* p_data,
                               uint8_t scb_index);

/* This is the data callback function.  It is executed when AVDTP has a media
 * packet ready for the application.  This function is required for SNK
 * endpoints and not applicable for SRC endpoints.
*/
typedef void(tAVDT_SINK_DATA_CBACK)(uint8_t handle, BT_HDR* p_pkt,
                                    uint32_t time_stamp, uint8_t m_pt);

/* This is the report callback function.  It is executed when AVDTP has a
 * reporting packet ready for the application.  This function is required for
 * streams created with AVDT_PSC_REPORT.
*/
typedef void(tAVDT_REPORT_CBACK)(uint8_t handle, AVDT_REPORT_TYPE type,
                                 tAVDT_REPORT_DATA* p_data);

/**
 * AVDTP Stream Configuration.
 * The information is used when a stream is created.
 */
class AvdtpStreamConfig {
 public:
  //
  // Non-supported protocol command messages
  //
  // Suspend command not supported
  static constexpr int AVDT_NSC_SUSPEND = 0x01;
  // Reconfigure command not supported
  static constexpr int AVDT_NSC_RECONFIG = 0x02;
  // Security command not supported
  static constexpr int AVDT_NSC_SECURITY = 0x04;

  AvdtpStreamConfig()
      : p_avdt_ctrl_cback(nullptr),
        scb_index(0),
        p_sink_data_cback(nullptr),
        p_report_cback(nullptr),
        mtu(0),
        flush_to(0),
        tsep(0),
        media_type(0),
        nsc_mask(0) {}

  void Reset() {
    cfg.Reset();
    p_avdt_ctrl_cback = nullptr;
    scb_index = 0;
    p_sink_data_cback = nullptr;
    p_report_cback = nullptr;
    mtu = 0;
    flush_to = 0;
    tsep = 0;
    media_type = 0;
    nsc_mask = 0;
  }

  AvdtpSepConfig cfg;                   // SEP configuration
  tAVDT_CTRL_CBACK* p_avdt_ctrl_cback;  // Control callback function
  uint8_t scb_index;  // The index to the bta_av_cb.p_scb[] entry
  tAVDT_SINK_DATA_CBACK* p_sink_data_cback;  // Sink data callback function
  tAVDT_REPORT_CBACK* p_report_cback;        // Report callback function
  uint16_t mtu;        // The L2CAP MTU of the transport channel
  uint16_t flush_to;   // The L2CAP flush timeout of the transport channel
  uint8_t tsep;        // SEP type
  uint8_t media_type;  // Media type: AVDT_MEDIA_TYPE_*
  uint16_t nsc_mask;   // Nonsupported protocol command messages
};

/* AVDT data option mask is used in the write request */
#define AVDT_DATA_OPT_NONE 0x00          /* No option still add RTP header */
#define AVDT_DATA_OPT_NO_RTP (0x01 << 0) /* Skip adding RTP header */

typedef uint8_t tAVDT_DATA_OPT_MASK;

/*****************************************************************************
 *  External Function Declarations
 ****************************************************************************/

/*******************************************************************************
 *
 * Function         AVDT_Register
 *
 * Description      This is the system level registration function for the
 *                  AVDTP protocol.  This function initializes AVDTP and
 *                  prepares the protocol stack for its use.  This function
 *                  must be called once by the system or platform using AVDTP
 *                  before the other functions of the API an be used.
 *
 *
 * Returns          void
 *
 ******************************************************************************/
extern void AVDT_Register(AvdtpRcb* p_reg, tAVDT_CTRL_CBACK* p_cback);

/*******************************************************************************
 *
 * Function         AVDT_Deregister
 *
 * Description      This function is called to deregister use AVDTP protocol.
 *                  It is called when AVDTP is no longer being used by any
 *                  application in the system.  Before this function can be
 *                  called, all streams must be removed with AVDT_RemoveStream.
 *
 * Returns          void
 *
 ******************************************************************************/
extern void AVDT_Deregister(void);

/*******************************************************************************
 *
 * Function         AVDT_AbortReq
 *
 * Description      Trigger Abort request to pass AVDTP Abort related mandatory
 *                  PTS Test case.
 *
 * Returns          void.
 *
 ******************************************************************************/
extern void AVDT_AbortReq(uint8_t handle);

/*******************************************************************************
 *
 * Function         AVDT_CreateStream
 *
 * Description      Create a stream endpoint.  After a stream endpoint is
 *                  created an application can initiate a connection between
 *                  this endpoint and an endpoint on a peer device.  In
 *                  addition, a peer device can discover, get the capabilities,
 *                  and connect to this endpoint.
 *
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_CreateStream(uint8_t peer_id, uint8_t* p_handle,
                                  const AvdtpStreamConfig& avdtp_stream_config);

/*******************************************************************************
 *
 * Function         AVDT_RemoveStream
 *
 * Description      Remove a stream endpoint.  This function is called when
 *                  the application is no longer using a stream endpoint.
 *                  If this function is called when the endpoint is connected
 *                  the connection is closed and then the stream endpoint
 *                  is removed.
 *
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_RemoveStream(uint8_t handle);

/*******************************************************************************
 *
 * Function         AVDT_DiscoverReq
 *
 * Description      This function initiates a connection to the AVDTP service
 *                  on the peer device, if not already present, and discovers
 *                  the stream endpoints on the peer device.  (Please note
 *                  that AVDTP discovery is unrelated to SDP discovery).
 *                  This function can be called at any time regardless of
 *                  whether there is an AVDTP connection to the peer device.
 *
 *                  When discovery is complete, an AVDT_DISCOVER_CFM_EVT
 *                  is sent to the application via its callback function.
 *                  The application must not call AVDT_GetCapReq() or
 *                  AVDT_DiscoverReq() again to the same device until
 *                  discovery is complete.
 *
 *                  The memory addressed by sep_info is allocated by the
 *                  application.  This memory is written to by AVDTP as part
 *                  of the discovery procedure.  This memory must remain
 *                  accessible until the application receives the
 *                  AVDT_DISCOVER_CFM_EVT.
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_DiscoverReq(const RawAddress& bd_addr,
                                 uint8_t channel_index,
                                 tAVDT_SEP_INFO* p_sep_info, uint8_t max_seps,
                                 tAVDT_CTRL_CBACK* p_cback);

/*******************************************************************************
 *
 * Function         AVDT_GetCapReq
 *
 * Description      This function initiates a connection to the AVDTP service
 *                  on the peer device, if not already present, and gets the
 *                  capabilities of a stream endpoint on the peer device.
 *                  This function can be called at any time regardless of
 *                  whether there is an AVDTP connection to the peer device.
 *
 *                  When the procedure is complete, an AVDT_GETCAP_CFM_EVT is
 *                  sent to the application via its callback function.  The
 *                  application must not call AVDT_GetCapReq() or
 *                  AVDT_DiscoverReq() again until the procedure is complete.
 *
 *                  The memory pointed to by p_cfg is allocated by the
 *                  application.  This memory is written to by AVDTP as part
 *                  of the get capabilities procedure.  This memory must
 *                  remain accessible until the application receives
 *                  the AVDT_GETCAP_CFM_EVT.
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_GetCapReq(const RawAddress& bd_addr, uint8_t channel_index,
                               uint8_t seid, AvdtpSepConfig* p_cfg,
                               tAVDT_CTRL_CBACK* p_cback, bool get_all_cap);

/*******************************************************************************
 *
 * Function         AVDT_DelayReport
 *
 * Description      This functions sends a Delay Report to the peer device
 *                  that is associated with a particular SEID.
 *                  This function is called by SNK device.
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_DelayReport(uint8_t handle, uint8_t seid, uint16_t delay);

/*******************************************************************************
 *
 * Function         AVDT_OpenReq
 *
 * Description      This function initiates a connection to the AVDTP service
 *                  on the peer device, if not already present, and connects
 *                  to a stream endpoint on a peer device.  When the connection
 *                  is completed, an AVDT_OPEN_CFM_EVT is sent to the
 *                  application via the control callback function for this
 *                  handle.
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_OpenReq(uint8_t handle, const RawAddress& bd_addr,
                             uint8_t channel_index, uint8_t seid,
                             AvdtpSepConfig* p_cfg);

/*******************************************************************************
 *
 * Function         AVDT_ConfigRsp
 *
 * Description      Respond to a configure request from the peer device.  This
 *                  function must be called if the application receives an
 *                  AVDT_CONFIG_IND_EVT through its control callback.
 *
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_ConfigRsp(uint8_t handle, uint8_t label,
                               uint8_t error_code, uint8_t category);

/*******************************************************************************
 *
 * Function         AVDT_StartReq
 *
 * Description      Start one or more stream endpoints.  This initiates the
 *                  transfer of media packets for the streams.  All stream
 *                  endpoints must previously be opened.  When the streams
 *                  are started, an AVDT_START_CFM_EVT is sent to the
 *                  application via the control callback function for each
 *                  stream.
 *
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_StartReq(uint8_t* p_handles, uint8_t num_handles);

/*******************************************************************************
 *
 * Function         AVDT_SuspendReq
 *
 * Description      Suspend one or more stream endpoints. This suspends the
 *                  transfer of media packets for the streams.  All stream
 *                  endpoints must previously be open and started.  When the
 *                  streams are suspended, an AVDT_SUSPEND_CFM_EVT is sent to
 *                  the application via the control callback function for
 *                  each stream.
 *
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_SuspendReq(uint8_t* p_handles, uint8_t num_handles);

/*******************************************************************************
 *
 * Function         AVDT_CloseReq
 *
 * Description      Close a stream endpoint.  This stops the transfer of media
 *                  packets and closes the transport channel associated with
 *                  this stream endpoint.  When the stream is closed, an
 *                  AVDT_CLOSE_CFM_EVT is sent to the application via the
 *                  control callback function for this handle.
 *
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_CloseReq(uint8_t handle);

/*******************************************************************************
 *
 * Function         AVDT_ReconfigReq
 *
 * Description      Reconfigure a stream endpoint.  This allows the application
 *                  to change the codec or content protection capabilities of
 *                  a stream endpoint after it has been opened.  This function
 *                  can only be called if the stream is opened but not started
 *                  or if the stream has been suspended.  When the procedure
 *                  is completed, an AVDT_RECONFIG_CFM_EVT is sent to the
 *                  application via the control callback function for this
 *                  handle.
 *
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_ReconfigReq(uint8_t handle, AvdtpSepConfig* p_cfg);

/*******************************************************************************
 *
 * Function         AVDT_ReconfigRsp
 *
 * Description      Respond to a reconfigure request from the peer device.
 *                  This function must be called if the application receives
 *                  an AVDT_RECONFIG_IND_EVT through its control callback.
 *
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_ReconfigRsp(uint8_t handle, uint8_t label,
                                 uint8_t error_code, uint8_t category);

/*******************************************************************************
 *
 * Function         AVDT_SecurityReq
 *
 * Description      Send a security request to the peer device.  When the
 *                  security procedure is completed, an AVDT_SECURITY_CFM_EVT
 *                  is sent to the application via the control callback function
 *                  for this handle.  (Please note that AVDTP security
 *                  procedures are unrelated to Bluetooth link level security.)
 *
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_SecurityReq(uint8_t handle, uint8_t* p_data, uint16_t len);

/*******************************************************************************
 *
 * Function         AVDT_SecurityRsp
 *
 * Description      Respond to a security request from the peer device.
 *                  This function must be called if the application receives
 *                  an AVDT_SECURITY_IND_EVT through its control callback.
 *                  (Please note that AVDTP security procedures are unrelated
 *                  to Bluetooth link level security.)
 *
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_SecurityRsp(uint8_t handle, uint8_t label,
                                 uint8_t error_code, uint8_t* p_data,
                                 uint16_t len);

/*******************************************************************************
 *
 * Function         AVDT_WriteReq
 *
 * Description      Send a media packet to the peer device.  The stream must
 *                  be started before this function is called.  Also, this
 *                  function can only be called if the stream is a SRC.
 *
 *                  When AVDTP has sent the media packet and is ready for the
 *                  next packet, an AVDT_WRITE_CFM_EVT is sent to the
 *                  application via the control callback.  The application must
 *                  wait for the AVDT_WRITE_CFM_EVT before it makes the next
 *                  call to AVDT_WriteReq().  If the applications calls
 *                  AVDT_WriteReq() before it receives the event the packet
 *                  will not be sent.  The application may make its first call
 *                  to AVDT_WriteReq() after it receives an AVDT_START_CFM_EVT
 *                  or AVDT_START_IND_EVT.
 *
 *                  The application passes the packet using the BT_HDR
 *                  structure.
 *                  This structure is described in section 2.1.  The offset
 *                  field must be equal to or greater than AVDT_MEDIA_OFFSET.
 *                  This allows enough space in the buffer for the L2CAP and
 *                  AVDTP headers.
 *
 *                  The memory pointed to by p_pkt must be a GKI buffer
 *                  allocated by the application.  This buffer will be freed
 *                  by the protocol stack; the application must not free
 *                  this buffer.
 *
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_WriteReq(uint8_t handle, BT_HDR* p_pkt,
                              uint32_t time_stamp, uint8_t m_pt);
/*******************************************************************************
 *
 * Function         AVDT_WriteReqOpt
 *
 * Description      Send a media packet to the peer device.  The stream must
 *                  be started before this function is called.  Also, this
 *                  function can only be called if the stream is a SRC
 *
 *                  When AVDTP has sent the media packet and is ready for the
 *                  next packet, an AVDT_WRITE_CFM_EVT is sent to the
 *                  application via the control callback.  The application must
 *                  wait for the AVDT_WRITE_CFM_EVT before it makes the next
 *                  call to AVDT_WriteReq().  If the applications calls
 *                  AVDT_WriteReq() before it receives the event the packet
 *                  will not be sent.  The application may make its first call
 *                  to AVDT_WriteReq() after it receives an AVDT_START_CFM_EVT
 *                  or AVDT_START_IND_EVT.
 *
 *                  The application passes the packet using the BT_HDR structure
 *                  This structure is described in section 2.1.  The offset
 *                  field must be equal to or greater than AVDT_MEDIA_OFFSET
 *                  (if NO_RTP is specified, L2CAP_MIN_OFFSET can be used)
 *                  This allows enough space in the buffer for the L2CAP and
 *                  AVDTP headers.
 *
 *                  The memory pointed to by p_pkt must be a GKI buffer
 *                  allocated by the application.  This buffer will be freed
 *                  by the protocol stack; the application must not free
 *                  this buffer.
 *
 *                  The opt parameter allows passing specific options like:
 *                  - NO_RTP : do not add the RTP header to buffer
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_WriteReqOpt(uint8_t handle, BT_HDR* p_pkt,
                                 uint32_t time_stamp, uint8_t m_pt,
                                 tAVDT_DATA_OPT_MASK opt);

/*******************************************************************************
 *
 * Function         AVDT_ConnectReq
 *
 * Description      This function initiates an AVDTP signaling connection
 *                  to the peer device.  When the connection is completed, an
 *                  AVDT_CONNECT_IND_EVT is sent to the application via its
 *                  control callback function.  If the connection attempt fails
 *                  an AVDT_DISCONNECT_IND_EVT is sent.  The security mask
 *                  parameter overrides the outgoing security mask set in
 *                  AVDT_Register().
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_ConnectReq(const RawAddress& bd_addr,
                                uint8_t channel_index, uint8_t sec_mask,
                                tAVDT_CTRL_CBACK* p_cback);

/*******************************************************************************
 *
 * Function         AVDT_DisconnectReq
 *
 * Description      This function disconnect an AVDTP signaling connection
 *                  to the peer device.  When disconnected an
 *                  AVDT_DISCONNECT_IND_EVT is sent to the application via its
 *                  control callback function.
 *
 * Returns          AVDT_SUCCESS if successful, otherwise error.
 *
 ******************************************************************************/
extern uint16_t AVDT_DisconnectReq(const RawAddress& bd_addr,
                                   tAVDT_CTRL_CBACK* p_cback);

/*******************************************************************************
 *
 * Function         AVDT_GetL2CapChannel
 *
 * Description      Get the L2CAP CID used by the handle.
 *
 * Returns          CID if successful, otherwise 0.
 *
 ******************************************************************************/
extern uint16_t AVDT_GetL2CapChannel(uint8_t handle);

/*******************************************************************************
 *
 * Function         AVDT_GetSignalChannel
 *
 * Description      Get the L2CAP CID used by the signal channel of the given
 *                  handle.
 *
 * Returns          CID if successful, otherwise 0.
 *
 ******************************************************************************/
extern uint16_t AVDT_GetSignalChannel(uint8_t handle,
                                      const RawAddress& bd_addr);

/*******************************************************************************
 *
 * Function         AVDT_SendReport
 *
 * Description
 *
 *
 *
 * Returns
 *
 ******************************************************************************/
extern uint16_t AVDT_SendReport(uint8_t handle, AVDT_REPORT_TYPE type,
                                tAVDT_REPORT_DATA* p_data);

/******************************************************************************
 *
 * Function         AVDT_SetTraceLevel
 *
 * Description      Sets the trace level for AVDT. If 0xff is passed, the
 *                  current trace level is returned.
 *
 *                  Input Parameters:
 *                      new_level:  The level to set the AVDT tracing to:
 *                      0xff-returns the current setting.
 *                      0-turns off tracing.
 *                      >= 1-Errors.
 *                      >= 2-Warnings.
 *                      >= 3-APIs.
 *                      >= 4-Events.
 *                      >= 5-Debug.
 *
 * Returns          The new trace level or current trace level if
 *                  the input parameter is 0xff.
 *
 *****************************************************************************/
extern uint8_t AVDT_SetTraceLevel(uint8_t new_level);

/**
 * Dump debug-related information for the Stack AVDTP module.
 *
 * @param fd the file descriptor to use for writing the ASCII formatted
 * information
 */
void stack_debug_avdtp_api_dump(int fd);

#endif /* AVDT_API_H */
