亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? encg723.c

?? G.711,G.723.1,G.726,G.729,GSM CODEC C/C++ code
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*/////////////////////////////////////////////////////////////////////////////
//
//                  INTEL CORPORATION PROPRIETARY INFORMATION
//     This software is supplied under the terms of a license agreement or
//     nondisclosure agreement with Intel Corporation and may not be copied
//     or disclosed except in accordance with the terms of that agreement.
//          Copyright(c) 2005 Intel Corporation. All Rights Reserved.
//
//     Intel(R) Integrated Performance Primitives
//     USC - Unified Speech Codec interface library
//
// By downloading and installing USC codec, you hereby agree that the
// accompanying Materials are being provided to you under the terms and
// conditions of the End User License Agreement for the Intel(R) Integrated
// Performance Primitives product previously accepted by you. Please refer
// to the file ipplic.htm located in the root directory of your Intel(R) IPP
// product installation for more information.
//
// A speech coding standards promoted by ITU, ETSI, 3GPP and other
// organizations. Implementations of these standards, or the standard enabled
// platforms may require licenses from various entities, including
// Intel Corporation.
//
//
// Purpose: G.723.1 speech codec: encode API functions.
//
*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "owng723.h"

/* Declaration of local functions */
static void PastAverageFilter_G723(G723Encoder_Obj* encoderObj);
static void GetReflectionCoeff_G723(short *pSrcLPC, short *pDstReflectCoeff, short *pDstReflectCoeffSFS);
static int ItakuraDist_G723(short *pSrcReflectCoeff, short ReflectCoeffSFS, short *pSrcAutoCorrs, short energy);

static int EncoderObjSize(void){
   int fltSize;
   int objSize = sizeof(G723Encoder_Obj);
   VoiceActivityDetectSize_G723(&fltSize);
   objSize += fltSize; /* VAD decision memory size*/
   return objSize;
}

G723_CODECFUN( APIG723_Status, apiG723Encoder_Alloc, (int *pCodecSize))
{
   *pCodecSize =  EncoderObjSize();
   return APIG723_StsNoErr;
}
G723_CODECFUN( APIG723_Status, apiG723Encoder_ControlMode,
         (G723Encoder_Obj* encoderObj, unsigned int mode))
{
   encoderObj->objPrm.mode = mode;

   return APIG723_StsNoErr;
}

G723_CODECFUN( APIG723_Status, apiG723Encoder_Mode,
         (G723Encoder_Obj* encoderObj, unsigned int mode))
{
   if (G723Encode_VAD_Enabled == mode)
      encoderObj->objPrm.mode |= G723Encode_VAD_Enabled;
   else{
      encoderObj->objPrm.mode |= G723Encode_VAD_Enabled;
      encoderObj->objPrm.mode ^= G723Encode_VAD_Enabled;
   }

   return APIG723_StsNoErr;
}

G723_CODECFUN( APIG723_Status, apiG723Encoder_Init,
              (G723Encoder_Obj* encoderObj, unsigned int mode))
{
   int i;

   ippsZero_16s((short*)encoderObj,sizeof(G723Encoder_Obj)>>1) ;

   encoderObj->objPrm.objSize = EncoderObjSize();
   encoderObj->objPrm.mode = mode;
   encoderObj->objPrm.key = G723_ENC_KEY;
   encoderObj->objPrm.rat = 0; /* default 6.3 KBit/s*/

   encoderObj->vadMem  = (char*)encoderObj + sizeof(G723Encoder_Obj);

   /* Initialize encoder data structure with zeros */
   ippsZero_16s(encoderObj->ZeroSignal, G723_SBFR_LEN);
   ippsZero_16s(encoderObj->UnitImpulseSignal, G723_SBFR_LEN); encoderObj->UnitImpulseSignal[0] = 0x2000 ; /* unit impulse */

   /* Initialize the previously decoded LSP vector to the DC vector */
   ippsCopy_16s(LPCDCTbl,encoderObj->PrevLPC,G723_LPC_ORDER);

   /* Initialize the taming procedure */
   for(i=0; i<5; i++) encoderObj->ExcitationError[i] = 4;
   encoderObj->sSearchTime = 120; /* reset max time */
   /* Initialize the VAD */
   //if(encoderObj->objPrm.mode & G723Encode_VAD_Enabled){
     VoiceActivityDetectInit_G723(encoderObj->vadMem);
     /* Initialize the CNG */
     encoderObj->CurrGain = 0;
     ippsZero_16s(encoderObj->AutoCorrs,AUOTOCORRS_BUFF_SIZE);

     for(i=0; i <= N_AUTOCORRS_BLOCKS; i++) encoderObj->AutoCorrsSFS[i] = 40;
     encoderObj->PrevOpenLoopLags[0] = G723_SBFR_LEN;
     encoderObj->PrevOpenLoopLags[1] = G723_SBFR_LEN;

     ippsZero_16s(encoderObj->LPCSID,G723_LPC_ORDER);
     ippsZero_16s(encoderObj->SIDLSP,G723_LPC_ORDER);
     ippsZero_16s(encoderObj->prevSidLpc,G723_LPC_ORDERP1);
     encoderObj->prevSidLpc[0] = 0x2000;
     ippsZero_16s(encoderObj->ReflectionCoeff,G723_LPC_ORDER+1);
     ippsZero_16s(encoderObj->GainAverEnergies,N_GAIN_AVER_FRMS);

     encoderObj->PastFrameType = G723_ActiveFrm;

     encoderObj->CNGSeed = 12345;
     encoderObj->CasheCounter = 0;
     encoderObj->ReflectionCoeffSFS = 0;
     encoderObj->AverEnerCounter = 0;
     encoderObj->PrevQGain = 0;
     encoderObj->sSidGain = 0;
   //}

   return APIG723_StsNoErr;
}

G723_CODECFUN( APIG723_Status, apiG723Encoder_InitBuff,
         (G723Encoder_Obj* encoderObj, char *buff))
{

#if !defined (NO_SCRATCH_MEMORY_USED)

   if(NULL==encoderObj)
      return APIG723_StsBadArgErr;

   if(buff)   encoderObj->Mem.base = buff; // otherwise reinit
   else if (encoderObj->Mem.base == NULL) return APIG723_StsNotInitialized;
   encoderObj->Mem.CurPtr = encoderObj->Mem.base;
   encoderObj->Mem.VecPtr = (int *)(encoderObj->Mem.base+G723_ENCODER_SCRATCH_MEMORY_SIZE);

#endif

   return APIG723_StsNoErr;
}

void EncoderCNG_G723(G723Encoder_Obj* encoderObj, ParamStream_G723 *Params, short *pExcitation, short *pDstLPC)
{
   short sQuantGain, sTmp;
   int i;

   LOCAL_ARRAY(short, curCoeff,G723_LPC_ORDER,encoderObj) ;

   for(i=N_GAIN_AVER_FRMS-1;i>=1;i--) encoderObj->GainAverEnergies[i]=encoderObj->GainAverEnergies[i-1];

   /* Calculate the LPC filter */
   ippsLevinsonDurbin_G723_16s( encoderObj->AutoCorrs, &sTmp, encoderObj->GainAverEnergies, curCoeff);

   /* if the first frame of silence => SID frame */
   if(encoderObj->PastFrameType == G723_ActiveFrm) {
      Params->FrameType = G723_SIDFrm;
      encoderObj->AverEnerCounter = 1;
      QuantSIDGain_G723_16s(encoderObj->GainAverEnergies, encoderObj->AutoCorrsSFS, encoderObj->AverEnerCounter,&i);
      sQuantGain=i;
   } else {
      encoderObj->AverEnerCounter++;
      if(encoderObj->AverEnerCounter > N_GAIN_AVER_FRMS) encoderObj->AverEnerCounter = N_GAIN_AVER_FRMS;
      QuantSIDGain_G723_16s(encoderObj->GainAverEnergies, encoderObj->AutoCorrsSFS, encoderObj->AverEnerCounter,&i);
      sQuantGain=i;

      /* Compute stationarity of current filter versus reference filter */
      if(ItakuraDist_G723(encoderObj->ReflectionCoeff, encoderObj->ReflectionCoeffSFS, encoderObj->AutoCorrs, *encoderObj->GainAverEnergies) == 0) {
         Params->FrameType = G723_SIDFrm; /* SID frame */
      } else {
         sTmp = abs(sQuantGain-encoderObj->PrevQGain);
         if(sTmp > 3) {
            Params->FrameType = G723_SIDFrm;/* SID frame */
         } else {
            Params->FrameType = G723_UntransmittedFrm;/* untransmitted */
         }
      }
   }

   if(Params->FrameType == G723_SIDFrm) { /* Compute SID filter */

      LOCAL_ARRAY(short, qIndex,3,encoderObj) ;

      /* Check stationarity */

      PastAverageFilter_G723(encoderObj);


      if(!encoderObj->AdaptEnableFlag) /* adaptation enabled */
         for(i=0;i<G723_LPC_ORDER;i++)
            encoderObj->prevSidLpc[i+1] = -encoderObj->LPCSID[i];

      GetReflectionCoeff_G723(encoderObj->LPCSID , encoderObj->ReflectionCoeff, &encoderObj->ReflectionCoeffSFS);

      if(ItakuraDist_G723(encoderObj->ReflectionCoeff, encoderObj->ReflectionCoeffSFS, encoderObj->AutoCorrs, *encoderObj->GainAverEnergies) == 0){
         ippsCopy_16s(curCoeff,encoderObj->LPCSID,G723_LPC_ORDER);
         GetReflectionCoeff_G723(curCoeff, encoderObj->ReflectionCoeff, &encoderObj->ReflectionCoeffSFS);
      }

      /* Compute SID frame codes */
      ippsLPCToLSF_G723_16s(encoderObj->LPCSID,encoderObj->PrevLPC,encoderObj->SIDLSP);

      ippsLSFQuant_G723_16s32s(encoderObj->SIDLSP, encoderObj->PrevLPC, &Params->lLSPIdx);
      qIndex[2] =  Params->lLSPIdx & 0xff;
      qIndex[1] =  (Params->lLSPIdx>>8) & 0xff;
      qIndex[0] =  (Params->lLSPIdx>>16) & 0xff;
      if(ippsLSFDecode_G723_16s(qIndex, encoderObj->PrevLPC,  0, encoderObj->SIDLSP) != ippStsNoErr)
         ippsCopy_16s(encoderObj->PrevLPC,encoderObj->SIDLSP,G723_LPC_ORDER);

      Params->sAmpIndex[0] = sQuantGain;
      encoderObj->PrevQGain = sQuantGain;
      DecodeSIDGain_G723_16s(encoderObj->PrevQGain,&encoderObj->sSidGain);

      LOCAL_ARRAY_FREE(short, qIndex,3,encoderObj) ;
   }

   /* Compute new excitation */
   if(encoderObj->PastFrameType == G723_ActiveFrm) {
      encoderObj->CurrGain = encoderObj->sSidGain;
   } else {
      encoderObj->CurrGain = ( (encoderObj->CurrGain*0xE000)+
                              (encoderObj->sSidGain*0x2000) )>>16 ;
   }
   {

      LOCAL_ARRAY(char, buff,ComfortNoiseExcitation_G723_16s_Buff_Size,encoderObj) ;

      ComfortNoiseExcitation_G723_16s(encoderObj->CurrGain, encoderObj->PrevExcitation, pExcitation,
                    &encoderObj->CNGSeed, Params->PitchLag,Params->AdCdbkLag,(Ipp16s*)Params->AdCdbkGain, Params->currRate, buff, &encoderObj->CasheCounter);

      LOCAL_ARRAY_FREE(char, buff,ComfortNoiseExcitation_G723_16s_Buff_Size,encoderObj) ;
   }

   LSPInterpolation(encoderObj->SIDLSP, encoderObj->PrevLPC, pDstLPC);/* Interpolate LSPs */
   ippsCopy_16s(encoderObj->SIDLSP,encoderObj->PrevLPC,G723_LPC_ORDER); /* update prev SID LPC */

   encoderObj->PastFrameType = Params->FrameType;
   LOCAL_ARRAY_FREE(short, curCoeff,G723_LPC_ORDER,encoderObj) ;
   return;
}

void UpdateAutoCorrs_G723(G723Encoder_Obj* encoderObj, const short *pSrcAutoCorrs, const short *pSrcAutoCorrsSFS)
{

   int i, lNsbfr;
   short sMinSFS, sTmp;
   short m1, m2;

   LOCAL_ARRAY(int, lSumAutoCorrs,G723_LPC_ORDER+1,encoderObj) ;

   /* Update Acf and ShAcf */
   for(i=0; i<AUOTOCORRS_BUFF_SIZE-G723_LPC_ORDER-1; i++) encoderObj->AutoCorrs[AUOTOCORRS_BUFF_SIZE-1-i] = encoderObj->AutoCorrs[AUOTOCORRS_BUFF_SIZE-G723_LPC_ORDER-2-i];

   for(i=N_AUTOCORRS_BLOCKS; i>=1; i--) encoderObj->AutoCorrsSFS[i] = encoderObj->AutoCorrsSFS[i-1];

   /* Search the min of pSrcAutoCorrsSFS */
   m1 = IPP_MIN(pSrcAutoCorrsSFS[0],pSrcAutoCorrsSFS[1]);
   m2 = IPP_MIN(pSrcAutoCorrsSFS[2],pSrcAutoCorrsSFS[3]);
   sMinSFS = (IPP_MIN(m1,m2))+14;

   /* Calculate the acfs sum */
   ippsZero_16s((short*)lSumAutoCorrs,2*G723_LPC_ORDERP1);

   for(lNsbfr=0; lNsbfr<4; lNsbfr++) {
      sTmp = sMinSFS - pSrcAutoCorrsSFS[lNsbfr];
      if(sTmp < 0) {
         sTmp = -sTmp;
         for(i=0; i <= G723_LPC_ORDER; i++) {
            lSumAutoCorrs[i] += (pSrcAutoCorrs[lNsbfr*G723_LPC_ORDERP1+i]>>sTmp);
         }
      } else {
         for(i=0; i <= G723_LPC_ORDER; i++) {
            lSumAutoCorrs[i] += (pSrcAutoCorrs[lNsbfr*G723_LPC_ORDERP1+i]<<sTmp);
         }
      }
   }
   /* Normalize */
   sTmp = Exp_32s_Pos(lSumAutoCorrs[0]);
   sTmp = 16 - sTmp; if(sTmp < 0) sTmp = 0;

   for(i=0;i<=G723_LPC_ORDER;i++) encoderObj->AutoCorrs[i]=(short)(lSumAutoCorrs[i]>>sTmp);
   encoderObj->AutoCorrsSFS[0] = sMinSFS - sTmp;

   LOCAL_ARRAY_FREE(int, lSumAutoCorrs,G723_LPC_ORDER+1,encoderObj) ;

   return;
}

void PastAverageFilter_G723(G723Encoder_Obj* encoderObj)
{
   int i, j;
   short sMinSFS, sTmp;

   LOCAL_ARRAY(int, lSumAutoCorrs,G723_LPC_ORDER+1,encoderObj) ;
   LOCAL_ARRAY(short, pCorr,G723_LPC_ORDER+1,encoderObj) ;

   /* Search ShAcf min */
   sMinSFS = IPP_MIN(encoderObj->AutoCorrsSFS[1],encoderObj->AutoCorrsSFS[2]);
   sMinSFS = (IPP_MIN(sMinSFS,encoderObj->AutoCorrsSFS[3]))+14;

   ippsZero_16s((short*)lSumAutoCorrs,2*G723_LPC_ORDERP1);

   for(i=1; i <= N_AUTOCORRS_BLOCKS; i ++) {
      sTmp = sMinSFS - encoderObj->AutoCorrsSFS[i];
      if(sTmp < 0) {
         sTmp=-sTmp;
         for(j=0; j <= G723_LPC_ORDER; j++) {
            lSumAutoCorrs[j] += (encoderObj->AutoCorrs[i*G723_LPC_ORDERP1+j]>>sTmp);
         }
      } else {
         for(j=0; j <= G723_LPC_ORDER; j++) {
            lSumAutoCorrs[j] += (encoderObj->AutoCorrs[i*G723_LPC_ORDERP1+j]<<sTmp);
         }
      }
   }

   /* Normalize */
   sTmp = Exp_32s_Pos(lSumAutoCorrs[0]);
   sTmp = 16 - sTmp;
   if(sTmp < 0) sTmp = 0;

   for(i=0; i<G723_LPC_ORDER+1; i++) {
      pCorr[i] = (short)(lSumAutoCorrs[i]>>sTmp);
   }

   ippsLevinsonDurbin_G723_16s(pCorr, &sTmp, &sTmp, encoderObj->LPCSID);

   LOCAL_ARRAY_FREE(short, pCorr,G723_LPC_ORDER+1,encoderObj) ;
   LOCAL_ARRAY_FREE(int, lSumAutoCorrs,G723_LPC_ORDER+1,encoderObj) ;

   return;
}

void GetReflectionCoeff_G723(short *pSrcLPC, short *pDstReflectCoeff, short *pDstReflectCoeffSFS)
{
   int i, j;
   short SFS;
   int lCorr;

   ippsDotProd_16s32s_Sfs(pSrcLPC,pSrcLPC,G723_LPC_ORDER,&lCorr,-1);
   lCorr = lCorr >> 1;
   lCorr = lCorr + 0x04000000;
   SFS = Exp_32s_Pos(lCorr) - 2;
   *pDstReflectCoeffSFS = SFS;
   if(SFS > 0) {
      lCorr = ShiftL_32s(lCorr, SFS);
      pDstReflectCoeff[0] = Cnvrt_NR_32s16s(lCorr);

      for(i=1; i<=G723_LPC_ORDER; i++) {
         lCorr = -(pSrcLPC[i-1]<<13);
         for(j=0; j<G723_LPC_ORDER-i; j++) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲高清一区二区三区不卡| 国产91精品一区二区麻豆网站 | 亚洲制服欧美中文字幕中文字幕| 国产精品理论在线观看| 国产精品每日更新在线播放网址| 亚洲国产高清不卡| 综合久久久久久久| 亚洲综合另类小说| 久久国产三级精品| 在线视频你懂得一区| 欧美一卡2卡3卡4卡| 亚洲图片另类小说| 麻豆精品在线播放| 91精品1区2区| 26uuu色噜噜精品一区| 亚洲一区二区三区中文字幕| 免费高清在线视频一区·| 成人福利视频网站| 欧美不卡在线视频| 国产精品视频一二三区 | 99精品在线免费| 久久亚洲精品国产精品紫薇| 亚洲成人777| 91片在线免费观看| 国产日韩精品一区二区三区| 免费成人在线观看视频| 色婷婷综合视频在线观看| 国产精品视频一二| 国产真实乱子伦精品视频| 91精品国产91综合久久蜜臀| 国产精品毛片无遮挡高清| 国产精品综合在线视频| 精品福利在线导航| 免费一区二区视频| 欧美xxxxx牲另类人与| 日韩精品一区第一页| 欧美老年两性高潮| 亚洲成人av一区二区三区| 欧美亚洲图片小说| 天天操天天干天天综合网| 欧美色网站导航| 日韩电影在线免费看| 欧美人动与zoxxxx乱| 日本中文字幕不卡| 日韩欧美成人午夜| 国产成人自拍高清视频在线免费播放| 欧美成人video| 波多野结衣中文一区| 亚洲一区精品在线| 久久无码av三级| 91碰在线视频| 老司机精品视频导航| 国产精品大尺度| 欧美丝袜自拍制服另类| 亚洲国产一区二区在线播放| 精品少妇一区二区三区视频免付费| 韩国三级电影一区二区| 一区二区三区蜜桃| 久久蜜桃一区二区| 欧美色图一区二区三区| 国产成人av资源| 青青青伊人色综合久久| 久久久久久电影| 欧美日韩三级一区| 国产91在线观看丝袜| 香蕉影视欧美成人| 日韩毛片在线免费观看| 精品国产一区二区三区av性色| 一本大道久久a久久综合| 国产麻豆视频一区二区| 日韩va亚洲va欧美va久久| 中文字幕综合网| 中文字幕成人av| 欧美国产综合一区二区| 欧美变态tickle挠乳网站| 欧美日韩国产在线观看| 精品视频资源站| 在线免费观看日本欧美| 91麻豆国产在线观看| 成人一级片在线观看| 国产伦精品一区二区三区免费迷 | 91女厕偷拍女厕偷拍高清| 日本欧美加勒比视频| 亚洲国产乱码最新视频| 伊人婷婷欧美激情| 一区二区三区视频在线看| 亚洲精品欧美在线| 亚洲不卡一区二区三区| 亚洲欧洲精品成人久久奇米网 | 国内国产精品久久| 国产精品亚洲成人| 99视频热这里只有精品免费| 成人一区二区视频| 色视频一区二区| 欧美视频一区二| 欧美一区二区精品久久911| 91精品在线免费观看| 欧美一级欧美三级| 国产色一区二区| 亚洲精品欧美激情| 蜜桃视频一区二区三区| 国产mv日韩mv欧美| 欧美性xxxxx极品少妇| 日韩一二三区不卡| 亚洲欧洲一区二区在线播放| 亚洲高清免费视频| 国产在线精品一区二区不卡了| 波多野结衣精品在线| 欧美精品九九99久久| 国产情人综合久久777777| 一区二区三区在线播| 国产在线精品不卡| 欧美日韩国产精品自在自线| 日本一区二区综合亚洲| 日韩高清一级片| 91福利在线观看| 国产精品国产三级国产aⅴ无密码| 日韩av在线发布| 色就色 综合激情| 亚洲人快播电影网| 国产精品性做久久久久久| 日韩一级完整毛片| 亚洲国产日韩精品| 精品1区2区3区| 亚洲综合在线电影| 色综合久久中文综合久久牛| 日本一区二区免费在线| 丁香激情综合五月| 欧美国产日韩一二三区| 岛国av在线一区| 国产精品色婷婷久久58| 不卡的av在线| 依依成人综合视频| 欧美二区三区91| 免费观看一级欧美片| 亚洲精品一线二线三线| 国产高清久久久久| 精品福利一二区| 99久久精品国产一区| 亚洲综合999| 精品黑人一区二区三区久久| 久久精品99久久久| 欧美国产亚洲另类动漫| www.av亚洲| 青青草国产精品97视觉盛宴 | 国产在线不卡一区| 中文字幕亚洲综合久久菠萝蜜| 99re热这里只有精品视频| 亚洲va在线va天堂| 国产欧美日韩亚州综合| 欧美午夜精品久久久久久孕妇 | 自拍av一区二区三区| 欧美日韩一区二区在线观看视频| 另类小说一区二区三区| 亚洲人成7777| 久久精品日产第一区二区三区高清版| av成人老司机| 国产一区二区三区国产| 亚洲另类一区二区| 欧美国产禁国产网站cc| 日韩一级高清毛片| 欧美日韩电影在线| 懂色av一区二区在线播放| 午夜欧美视频在线观看| 中文av字幕一区| 精品处破学生在线二十三| 精品视频在线免费看| 99精品久久久久久| 成人aa视频在线观看| 狠狠色丁香九九婷婷综合五月| 亚洲一区二区欧美激情| 亚洲蜜臀av乱码久久精品| 国产精品卡一卡二卡三| 国产人成一区二区三区影院| 精品乱人伦小说| 久久久亚洲精华液精华液精华液 | 免费精品视频最新在线| 亚洲动漫第一页| 亚洲第一av色| 国产精品久久久久影视| 欧美国产日本韩| 亚洲欧洲色图综合| 亚洲精品国久久99热| 亚洲成a人v欧美综合天堂| 亚洲18女电影在线观看| 蜜桃av一区二区三区电影| 久久国产精品99久久人人澡| 精品一区二区三区免费| eeuss鲁片一区二区三区在线观看| 国产成a人亚洲精品| 欧美在线综合视频| 日韩精品一区二区三区三区免费| 国产亚洲一区二区三区在线观看| 久久综合色一综合色88| 亚洲女厕所小便bbb| 亚洲成人午夜影院| 国产最新精品精品你懂的| 99国产精品久久久久久久久久| 在线一区二区三区四区五区| 日韩欧美卡一卡二|