android_mt6572_jiabo/system/bt/stack/a2dp/a2d_aac.c
2025-09-05 16:56:03 +08:00

175 lines
6.7 KiB
C

/******************************************************************************
*
* Copyright (c) 2016, The Linux Foundation. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
* * Neither the name of The Linux Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************/
/******************************************************************************
*
* Utility functions to help build and parse AAC Codec Information
*
******************************************************************************/
#include "bt_target.h"
#include <string.h>
#include "a2d_api.h"
#include "a2d_int.h"
#include "a2d_aac.h"
#include "bt_utils.h"
#if (A2D_M24_INCLUDED == TRUE)
static UINT8 A2D_UINT32_BitsSet(UINT32 num);
/******************************************************************************
**
** Function A2D_BldAacInfo
**
** Description This function builds byte sequence for
** Aac Codec Capabilities.
** Input : media_type: Audio or MultiMedia.
** p_ie: AAC Codec Information Element
**
** Output : p_result: codec info.
**
** Returns A2D_SUCCESS if successful.
** Error otherwise.
******************************************************************************/
tA2D_STATUS A2D_BldAacInfo(UINT8 media_type, tA2D_AAC_CIE *p_ie, UINT8 *p_result)
{
tA2D_STATUS status;
if( p_ie == NULL || p_result == NULL ||
(p_ie->object_type & ~A2D_AAC_IE_OBJ_TYPE_MSK) ||
(p_ie->samp_freq & ~A2D_AAC_IE_SAMP_FREQ_MSK) ||
(p_ie->channels & ~A2D_AAC_IE_CHANNELS_MSK) ||
(p_ie->bit_rate & ~A2D_AAC_IE_BIT_RATE_MSK) ||
(p_ie->vbr & ~A2D_AAC_IE_VBR_MSK) )
{
/* return invalid params if invalid bit is set */
status = A2D_INVALID_PARAMS;
}
else
{
status = A2D_SUCCESS;
*p_result++ = A2D_AAC_INFO_LEN;
*p_result++ = media_type;
*p_result++ = A2D_MEDIA_CT_M24;
/* Codec information */
*p_result++ = p_ie->object_type; // object type
*p_result++ = (UINT8)(p_ie->samp_freq >> 8);
*p_result++ = (p_ie->samp_freq & 0x00F0)|p_ie->channels;
*p_result++ = p_ie->vbr | ((p_ie->bit_rate >> 16)& 0x007F);
*p_result++ = (p_ie->bit_rate >> 8)& 0x00FF;
*p_result = p_ie->bit_rate & 0x000000FF;
}
return status;
}
/******************************************************************************
**
** Function A2D_ParsAacInfo
**
** Description This function parse byte sequence for
** Aac Codec Capabilities.
** Input : p_info: input byte sequence.
** for_caps: True for getcap, false otherwise
**
** Output : p_ie: Aac codec information.
**
** Returns A2D_SUCCESS if successful.
** Error otherwise.
******************************************************************************/
tA2D_STATUS A2D_ParsAacInfo(tA2D_AAC_CIE *p_ie, UINT8 *p_info, BOOLEAN for_caps)
{
tA2D_STATUS status;
UINT8 losc;
UINT8 media_type;
if( p_ie == NULL || p_info == NULL)
status = A2D_INVALID_PARAMS;
else
{
losc = *p_info++;
media_type = *p_info++;
/* Check for wrong length, media type */
if(losc != A2D_AAC_INFO_LEN || *p_info != A2D_MEDIA_CT_M24)
status = A2D_WRONG_CODEC;
else
{
p_info++;
/* obj type */
p_ie->object_type = *p_info & A2D_AAC_IE_OBJ_TYPE_MSK; p_info++;
/* samping freq */
p_ie->samp_freq = *p_info; p_info++;
p_ie->samp_freq = p_ie->samp_freq << 8;
p_ie->samp_freq |= (*p_info & 0xF0);
/* channels */
p_ie->channels = *p_info & A2D_AAC_IE_CHANNELS_MSK; p_info++;
/* variable bit rate */
p_ie->vbr = *p_info & A2D_AAC_IE_VBR_MSK;
/* bit rate */
p_ie->bit_rate = *p_info & 0x7F;p_ie->bit_rate = p_ie->bit_rate << 8; p_info++;
p_ie->bit_rate |= *p_info;p_ie->bit_rate = p_ie->bit_rate << 8; p_info++;
p_ie->bit_rate |= *p_info;
status = A2D_SUCCESS;
if(for_caps == FALSE)
{
if(A2D_UINT32_BitsSet(p_ie->object_type) != A2D_SET_ONE_BIT)
status = A2D_BAD_OBJ_TYPE;
if(A2D_UINT32_BitsSet(p_ie->samp_freq) != A2D_SET_ONE_BIT)
status = A2D_BAD_SAMP_FREQ;
if(A2D_UINT32_BitsSet(p_ie->channels) != A2D_SET_ONE_BIT)
status = A2D_BAD_CHANNEL;
}
}
}
return status;
}
/******************************************************************************
** Function A2D_UINT32_BitsSet
**
** Description Check the given number of 32bit for the number of bits set
** Returns A2D_SET_ONE_BIT, if one and only one bit is set
** A2D_SET_ZERO_BIT, if all bits clear
** A2D_SET_MULTL_BIT, if multiple bits are set
******************************************************************************/
static UINT8 A2D_UINT32_BitsSet(UINT32 num)
{
UINT8 count;
BOOLEAN res;
if(num == 0)
res = A2D_SET_ZERO_BIT;
else
{
count = (num & (num - 1));
res = ((count==0)?A2D_SET_ONE_BIT:A2D_SET_MULTL_BIT);
}
return res;
}
#endif /* A2D_M24_INCLUDED == TRUE */