15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 1999-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains constants and structures used by Encoder. 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SBC_ENCODER_H 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_ENCODER_H 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define ENCODER_VERSION "0025" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef BUILDCFG 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #include "bt_target.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*DEFINES*/ 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef FALSE 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define FALSE 0 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef TRUE 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define TRUE (!FALSE) 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_MAX_NUM_OF_SUBBANDS 8 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_MAX_NUM_OF_CHANNELS 2 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_MAX_NUM_OF_BLOCKS 16 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_LOUDNESS 0 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_SNR 1 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SUB_BANDS_8 8 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SUB_BANDS_4 4 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_sf16000 0 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_sf32000 1 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_sf44100 2 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_sf48000 3 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_MONO 0 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_DUAL 1 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_STEREO 2 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_JOINT_STEREO 3 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_BLOCK_0 4 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_BLOCK_1 8 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_BLOCK_2 12 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_BLOCK_3 16 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_NULL 0 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SBC_MAX_NUM_FRAME 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_MAX_NUM_FRAME 1 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SBC_DSP_OPT 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_DSP_OPT FALSE 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Set SBC_USE_ARM_PRAGMA to TRUE to use "#pragma arm section zidata" */ 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SBC_USE_ARM_PRAGMA 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_USE_ARM_PRAGMA FALSE 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Set SBC_ARM_ASM_OPT to TRUE in case the target is an ARM */ 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* this will replace all the 32 and 64 bit mult by in line assembly code */ 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SBC_ARM_ASM_OPT 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_ARM_ASM_OPT FALSE 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* green hill compiler option -> Used to distinguish the syntax for inline assembly code*/ 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SBC_GHS_COMPILER 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_GHS_COMPILER FALSE 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* ARM compiler option -> Used to distinguish the syntax for inline assembly code */ 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SBC_ARM_COMPILER 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_ARM_COMPILER TRUE 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Set SBC_IPAQ_OPT to TRUE in case the target is an ARM */ 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 32 and 64 bit mult will be performed using SINT64 ( usualy __int64 ) cast that usualy give optimal performance if supported */ 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SBC_IPAQ_OPT 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_IPAQ_OPT TRUE 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Debug only: set SBC_IS_64_MULT_IN_WINDOW_ACCU to TRUE to use 64 bit multiplication in the windowing */ 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* -> not recomended, more MIPS for the same restitution. */ 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SBC_IS_64_MULT_IN_WINDOW_ACCU 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_IS_64_MULT_IN_WINDOW_ACCU FALSE 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /*SBC_IS_64_MULT_IN_WINDOW_ACCU */ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Set SBC_IS_64_MULT_IN_IDCT to TRUE to use 64 bits multiplication in the DCT of Matrixing */ 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* -> more MIPS required for a better audio quality. comparasion with the SIG utilities shows a division by 10 of the RMS */ 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* CAUTION: It only apply in the if SBC_FAST_DCT is set to TRUE */ 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SBC_IS_64_MULT_IN_IDCT 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_IS_64_MULT_IN_IDCT FALSE 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /*SBC_IS_64_MULT_IN_IDCT */ 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* set SBC_IS_64_MULT_IN_QUANTIZER to TRUE to use 64 bits multiplication in the quantizer */ 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* setting this flag to FALSE add whistling noise at 5.5 and 11 KHz usualy not perceptible by human's hears. */ 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SBC_IS_64_MULT_IN_QUANTIZER 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_IS_64_MULT_IN_QUANTIZER TRUE 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /*SBC_IS_64_MULT_IN_IDCT */ 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Debug only: set this flag to FALSE to disable fast DCT algorithm */ 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SBC_FAST_DCT 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_FAST_DCT TRUE 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /*SBC_FAST_DCT */ 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* In case we do not use joint stereo mode the flag save some RAM and ROM in case it is set to FALSE */ 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SBC_JOINT_STE_INCLUDED 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_JOINT_STE_INCLUDED TRUE 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* TRUE -> application should provide PCM buffer, FALSE PCM buffer reside in SBC_ENC_PARAMS */ 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SBC_NO_PCM_CPY_OPTION 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_NO_PCM_CPY_OPTION FALSE 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define MINIMUM_ENC_VX_BUFFER_SIZE (8*10*2) 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef ENC_VX_BUFFER_SIZE 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define ENC_VX_BUFFER_SIZE (MINIMUM_ENC_VX_BUFFER_SIZE + 64) 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*#define ENC_VX_BUFFER_SIZE MINIMUM_ENC_VX_BUFFER_SIZE + 1024*/ 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef SBC_FOR_EMBEDDED_LINUX 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_FOR_EMBEDDED_LINUX FALSE 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*constants used for index calculation*/ 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define SBC_BLK (SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS) 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sbc_types.h" 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct SBC_ENC_PARAMS_TAG 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 s16SamplingFreq; /* 16k, 32k, 44.1k or 48k*/ 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 s16ChannelMode; /* mono, dual, streo or joint streo*/ 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 s16NumOfSubBands; /* 4 or 8 */ 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 s16NumOfChannels; 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 s16NumOfBlocks; /* 4, 8, 12 or 16*/ 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 s16AllocationMethod; /* loudness or SNR*/ 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 s16BitPool; /* 16*numOfSb for mono & dual; 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32*numOfSb for stereo & joint stereo */ 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 u16BitRate; 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 u8NumPacketToEncode; /* number of sbc frame to encode. Default is 1 */ 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SBC_JOINT_STE_INCLUDED == TRUE) 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 as16Join[SBC_MAX_NUM_OF_SUBBANDS]; /*1 if JS, 0 otherwise*/ 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 s16MaxBitNeed; 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 as16ScaleFactor[SBC_MAX_NUM_OF_CHANNELS*SBC_MAX_NUM_OF_SUBBANDS]; 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 *ps16NextPcmBuffer; 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (SBC_NO_PCM_CPY_OPTION == TRUE) 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 *ps16PcmBuffer; 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 as16PcmBuffer[SBC_MAX_NUM_FRAME*SBC_MAX_NUM_OF_BLOCKS * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS]; 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 s16ScartchMemForBitAlloc[16]; 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT32 s32SbBuffer[SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS * SBC_MAX_NUM_OF_BLOCKS]; 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 as16Bits[SBC_MAX_NUM_OF_CHANNELS*SBC_MAX_NUM_OF_SUBBANDS]; 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *pu8Packet; 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *pu8NextPacket; 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 FrameHeader; 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 u16PacketLength; 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}SBC_ENC_PARAMS; 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef __cplusplus 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern "C" 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectSBC_API extern void SBC_Encoder(SBC_ENC_PARAMS *strEncParams); 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectSBC_API extern void SBC_Encoder_Init(SBC_ENC_PARAMS *strEncParams); 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef __cplusplus 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 203