📄 mbdecoder.cpp
字号:
//===== chroma =====
Int iScaleU = g_aaiDequantCoef[cCQp.rem()][0] << cCQp.per();
Int iScaleV = g_aaiDequantCoef[cCQp.rem()][0] << cCQp.per();
/* HS: old scaling modified:
(I did not work for scaling matrices, when QpPer became less than 5 in an FGS enhancement) */
for( CIdx cIdx; cIdx.isLegal(); cIdx++ )
{
RNOK( xScale4x4Block( rcTCoeffs.get( cIdx ), ( cIdx.plane() ? pucScaleV : pucScaleU ), 1, cCQp ) );
}
UInt uiDCIdx;
TCoeff* piCoeff = rcTCoeffs.get( CIdx(0) );
for( uiDCIdx = 0; uiDCIdx < 4; uiDCIdx++ )
{
piCoeff[16*uiDCIdx] *= iScaleU;
}
piCoeff = rcTCoeffs.get( CIdx(4) );
for( uiDCIdx = 0; uiDCIdx < 4; uiDCIdx++ )
{
piCoeff[16*uiDCIdx] *= iScaleV;
}
return Err::m_nOK;
}
#if JMVM_ONLY // JVT-W081
ErrVal MbDecoder::xCopyNeighborMotion( MbDataAccess& rcMbDataAccess,
GDV* disparityL0,
GDV* disparityL1 )
{
class MBMotion *pcFoundNeighborMotion;
Int ac;
const Frame* pcVRefPicL0[4];
const Frame* pcVRefPicL1[4];
class MBMotion cMbMotionTmp; //JVT-Z021
if (rcMbDataAccess.getSH().getSPS().getSpsMVC()->getSingleLoopDecoding() ) // JVT-Y042
{
//JVT-Z021
GDV accGdvL0, accGdvL1;
Mv centerL0, centerL1;
Mv adjOffsetL0, adjOffsetL1;
class MBMotion FMb_new[4];
if(rcMbDataAccess.getMbData().m_pcMbImsm->m_iListXFlag == LIST_0)
{
rcMbDataAccess.GDVtoOrg(disparityL0[0], centerL0);
adjOffsetL0.set(rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset.getHor()-centerL0.getHor(),
rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset.getVer()-centerL0.getVer());
accGdvL0.setHor(disparityL0[0].getHor() + adjOffsetL0.getHor());
accGdvL0.setVer(disparityL0[0].getVer() + adjOffsetL0.getVer());
Int iRefId = (Int)rcMbDataAccess.getSH().getSPS().SpsMVC->m_non_anchor_ref_list0[rcMbDataAccess.getSH().getViewId()][0];
Int iMbInFrame = Int(rcMbDataAccess.getSH().getSPS().getMbInFrame());
Int iFrameWidthInMbs = rcMbDataAccess.getSH().getSPS().getFrameWidthInMbs();
Int iMode = (abs(accGdvL0.getVer()) % 2) * 2 + (abs(accGdvL0.getHor()) % 2);
switch(iMode)
{
case 0: //aligned
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId * iMbInFrame + iFrameWidthInMbs * (accGdvL0.getVer()/2) + (accGdvL0.getHor()/2)], FMb_new[0]);
rcMbDataAccess.getCombinedMotionInfo(0,FMb_new,cMbMotionTmp);
}
break;
case 1: //LR
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2)+(accGdvL0.getHor()/2)], FMb_new[0]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2)+(accGdvL0.getHor()/2 + 1)], FMb_new[1]);
rcMbDataAccess.getCombinedMotionInfo(1,FMb_new,cMbMotionTmp);
}
break;
case 2: //UpperDown
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2)+(accGdvL0.getHor()/2)], FMb_new[0]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2+1)+(accGdvL0.getHor()/2)], FMb_new[1]);
rcMbDataAccess.getCombinedMotionInfo(2,FMb_new,cMbMotionTmp);
}
break;
case 3: //4combined
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2)+(accGdvL0.getHor()/2)], FMb_new[0]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2)+(accGdvL0.getHor()/2+1)], FMb_new[1]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2+1)+(accGdvL0.getHor()/2)], FMb_new[2]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2+1)+(accGdvL0.getHor()/2+1)], FMb_new[3]);
rcMbDataAccess.getCombinedMotionInfo(3,FMb_new,cMbMotionTmp);
}
break;
default:
return Err::m_nERR;
} //switch
}
else
{
rcMbDataAccess.GDVtoOrg(disparityL1[0], centerL1);
adjOffsetL1.set(rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset.getHor()-centerL1.getHor(),
rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset.getVer()-centerL1.getVer());
accGdvL1.setHor(disparityL1[0].getHor() + adjOffsetL1.getHor());
accGdvL1.setVer(disparityL1[0].getVer() + adjOffsetL1.getVer());
Int iRefId = (Int)rcMbDataAccess.getSH().getSPS().SpsMVC->m_non_anchor_ref_list1[rcMbDataAccess.getSH().getViewId()][0];
Int iMbInFrame = Int(rcMbDataAccess.getSH().getSPS().getMbInFrame());
Int iFrameWidthInMbs = rcMbDataAccess.getSH().getSPS().getFrameWidthInMbs();
Int iMode = (abs(accGdvL1.getVer()) % 2) * 2 + (abs(accGdvL1.getHor()) % 2);
switch(iMode)
{
case 0: //aligned
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId * iMbInFrame + iFrameWidthInMbs * (accGdvL1.getVer()/2) + (accGdvL1.getHor()/2)], FMb_new[0]);
rcMbDataAccess.getCombinedMotionInfo(0,FMb_new,cMbMotionTmp);
}
break;
case 1: //LR
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2)+(accGdvL1.getHor()/2)], FMb_new[0]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2)+(accGdvL1.getHor()/2 + 1)], FMb_new[1]);
rcMbDataAccess.getCombinedMotionInfo(1,FMb_new,cMbMotionTmp);
}
break;
case 2: //UpperDown
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2)+(accGdvL1.getHor()/2)], FMb_new[0]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2+1)+(accGdvL1.getHor()/2)], FMb_new[1]);
rcMbDataAccess.getCombinedMotionInfo(2,FMb_new,cMbMotionTmp);
}
break;
case 3: //4combined
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2)+(accGdvL1.getHor()/2)], FMb_new[0]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2)+(accGdvL1.getHor()/2+1)], FMb_new[1]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2+1)+(accGdvL1.getHor()/2)], FMb_new[2]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2+1)+(accGdvL1.getHor()/2+1)], FMb_new[3]);
rcMbDataAccess.getCombinedMotionInfo(3,FMb_new,cMbMotionTmp);
}
break;
default:
return Err::m_nERR;
} //switch
}
pcFoundNeighborMotion = &cMbMotionTmp;
//JVT-Z021
}
else
{
//JVT-Z021
GDV accGdvL0, accGdvL1;
Mv centerL0, centerL1;
Mv adjOffsetL0, adjOffsetL1;
class MBMotion FMb_new[4];
if(rcMbDataAccess.getMbData().m_pcMbImsm->m_iListXFlag == LIST_0)
{
rcMbDataAccess.GDVtoOrg(disparityL0[0], centerL0);
adjOffsetL0.set(rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset.getHor()-centerL0.getHor(),
rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset.getVer()-centerL0.getVer());
accGdvL0.setHor(disparityL0[0].getHor() + adjOffsetL0.getHor());
accGdvL0.setVer(disparityL0[0].getVer() + adjOffsetL0.getVer());
Int iRefId = (Int)rcMbDataAccess.getSH().getSPS().SpsMVC->m_non_anchor_ref_list0[rcMbDataAccess.getSH().getViewId()][0];
Int iMbInFrame = Int(rcMbDataAccess.getSH().getSPS().getMbInFrame());
Int iFrameWidthInMbs = rcMbDataAccess.getSH().getSPS().getFrameWidthInMbs();
Int iMode = (abs(accGdvL0.getVer()) % 2) * 2 + (abs(accGdvL0.getHor()) % 2);
switch(iMode)
{
case 0: //aligned
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId * iMbInFrame + iFrameWidthInMbs * (accGdvL0.getVer()/2) + (accGdvL0.getHor()/2)], FMb_new[0]);
rcMbDataAccess.getCombinedMotionInfo(0,FMb_new,cMbMotionTmp);
}
break;
case 1: //LR
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2)+(accGdvL0.getHor()/2)], FMb_new[0]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2)+(accGdvL0.getHor()/2 + 1)], FMb_new[1]);
rcMbDataAccess.getCombinedMotionInfo(1,FMb_new,cMbMotionTmp);
}
break;
case 2: //UpperDown
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2)+(accGdvL0.getHor()/2)], FMb_new[0]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2+1)+(accGdvL0.getHor()/2)], FMb_new[1]);
rcMbDataAccess.getCombinedMotionInfo(2,FMb_new,cMbMotionTmp);
}
break;
case 3: //4combined
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2)+(accGdvL0.getHor()/2)], FMb_new[0]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2)+(accGdvL0.getHor()/2+1)], FMb_new[1]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2+1)+(accGdvL0.getHor()/2)], FMb_new[2]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL0.getVer()/2+1)+(accGdvL0.getHor()/2+1)], FMb_new[3]);
rcMbDataAccess.getCombinedMotionInfo(3,FMb_new,cMbMotionTmp);
}
break;
default:
return Err::m_nERR;
} //switch
}
else
{
rcMbDataAccess.GDVtoOrg(disparityL1[0], centerL1);
adjOffsetL1.set(rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset.getHor()-centerL1.getHor(),
rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset.getVer()-centerL1.getVer());
accGdvL1.setHor(disparityL1[0].getHor() + adjOffsetL1.getHor());
accGdvL1.setVer(disparityL1[0].getVer() + adjOffsetL1.getVer());
Int iRefId = (Int)rcMbDataAccess.getSH().getSPS().SpsMVC->m_non_anchor_ref_list1[rcMbDataAccess.getSH().getViewId()][0];
Int iMbInFrame = Int(rcMbDataAccess.getSH().getSPS().getMbInFrame());
Int iFrameWidthInMbs = rcMbDataAccess.getSH().getSPS().getFrameWidthInMbs();
Int iMode = (abs(accGdvL1.getVer()) % 2) * 2 + (abs(accGdvL1.getHor()) % 2);
switch(iMode)
{
case 0: //aligned
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId * iMbInFrame + iFrameWidthInMbs * (accGdvL1.getVer()/2) + (accGdvL1.getHor()/2)], FMb_new[0]);
rcMbDataAccess.getCombinedMotionInfo(0,FMb_new,cMbMotionTmp);
}
break;
case 1: //LR
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2)+(accGdvL1.getHor()/2)], FMb_new[0]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2)+(accGdvL1.getHor()/2 + 1)], FMb_new[1]);
rcMbDataAccess.getCombinedMotionInfo(1,FMb_new,cMbMotionTmp);
}
break;
case 2: //UpDown
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2)+(accGdvL1.getHor()/2)], FMb_new[0]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2+1)+(accGdvL1.getHor()/2)], FMb_new[1]);
rcMbDataAccess.getCombinedMotionInfo(2,FMb_new,cMbMotionTmp);
}
break;
case 3: //4combined
{
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2)+(accGdvL1.getHor()/2)], FMb_new[0]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2)+(accGdvL1.getHor()/2+1)], FMb_new[1]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2+1)+(accGdvL1.getHor()/2)], FMb_new[2]);
rcMbDataAccess.MbMotionCopy(pcNeighbor[iRefId*iMbInFrame+iFrameWidthInMbs*(accGdvL1.getVer()/2+1)+(accGdvL1.getHor()/2+1)], FMb_new[3]);
rcMbDataAccess.getCombinedMotionInfo(3,FMb_new,cMbMotionTmp);
}
break;
default:
return Err::m_nERR;
} //switch
}
pcFoundNeighborMotion = &cMbMotionTmp;
}
if(!pcFoundNeighborMotion)
Err::m_nERR;
rcMbDataAccess.getMbMvdData( LIST_0 ).clear();
rcMbDataAccess.getMbMvdData( LIST_1 ).clear();
rcMbDataAccess.getMbData().setMbMode(MbMode(pcFoundNeighborMotion->m_iViewMode));
rcMbDataAccess.getMbData().setFwdBwd(pcFoundNeighborMotion->m_uiFwdBwd);
rcMbDataAccess.getMbData().setBlkMode(B_8x8_0, BlkMode(pcFoundNeighborMotion->m_iBlkMode[0]));
rcMbDataAccess.getMbData().setBlkMode(B_8x8_1, BlkMode(pcFoundNeighborMotion->m_iBlkMode[1]));
rcMbDataAccess.getMbData().setBlkMode(B_8x8_2, BlkMode(pcFoundNeighborMotion->m_iBlkMode[2]));
rcMbDataAccess.getMbData().setBlkMode(B_8x8_3, BlkMode(pcFoundNeighborMotion->m_iBlkMode[3]));
for (ac=0; ac<16; ac++)
{
rcMbDataAccess.getMbMotionData( LIST_0).m_acMv[ac].m_sHor = pcFoundNeighborMotion->m_iMvL0Hor[ac];
rcMbDataAccess.getMbMotionData( LIST_0).m_acMv[ac].m_sVer = pcFoundNeighborMotion->m_iMvL0Ver[ac];
rcMbDataAccess.getMbMotionData( LIST_1).m_acMv[ac].m_sHor = pcFoundNeighborMotion->m_iMvL1Hor[ac];
rcMbDataAccess.getMbMotionData( LIST_1).m_acMv[ac].m_sVer = pcFoundNeighborMotion->m_iMvL1Ver[ac];
}
for (ac=0; ac<4; ac++)
{
if (pcFoundNeighborMotion->m_iRefMultiViewL0[ac] == BLOCK_NOT_AVAILABLE)
{
rcMbDataAccess.getMbMotionData(LIST_0).m_ascRefIdx[ac] = BLOCK_NOT_AVAILABLE;
pcVRefPicL0[ac] =0;
}
else if (pcFoundNeighborMotion->m_iRefMultiViewL0[ac] == BLOCK_NOT_PREDICTED)
{
rcMbDataAccess.getMbMotionData(LIST_0).m_ascRefIdx[ac] = BLOCK_NOT_PREDICTED;
pcVRefPicL0[ac] =0;
}
else
{
if (rcMbDataAccess.getSH().getRefListSize(LIST_0))
{
rcMbDataAccess.getMbMotionData(LIST_0).m_ascRefIdx[ac] = pcFoundNeighborMotion->m_iRefMultiViewL0[ac];
pcVRefPicL0[ac] = rcMbDataAccess.getSH().getRefPic(pcFoundNeighborMotion->m_iRefMultiViewL0[ac], LIST_0).getFrame();
if (ac==0) rcMbDataAccess.getMbMotionData( LIST_0 ).setRefPic(pcVRefPicL0[0], PART_8x8_0);
if (ac==1) rcMbDataAccess.getMbMotionData( LIST_0 ).setRefPic(pcVRefPicL0[1], PART_8x8_1);
if (ac==2) rcMbDataAccess.getMbMotionData( LIST_0 ).setRefPic(pcVRefPicL0[2], PART_8x8_2);
if (ac==3) rcMbDataAccess.getMbMotionData( LIST_0 ).setRefPic(pcVRefPicL0[3], PART_8x8_3);
}
else
{
Err::m_nERR;
}
}
if (pcFoundNeighborMotion->m_iRefMultiViewL1[ac]== BLOCK_NOT_AVAILABLE)
{
rcMbDataAccess.getMbMotionData(LIST_1).m_ascRefIdx[ac] = BLOCK_NOT_AVAILABLE;
pcVRefPicL1[ac]=0;
}
else if (pcFoundNeighborMotion->m_iRefMultiViewL1[ac]== BLOCK_NOT_PREDICTED)
{
rcMbDataAccess.getMbMotionData(LIST_1).m_ascRefIdx[ac] = BLOCK_NOT_PREDICTED;
pcVRefPicL1[ac]=0;
}
else
{
if (rcMbDataAccess.getSH().getRefListSize(LIST_1))
{
rcMbDataAccess.getMbMotionData(LIST_1).m_ascRefIdx[ac] = pcFoundNeighborMotion->m_iRefMultiViewL1[ac];
pcVRefPicL1[ac] = rcMbDataAccess.getSH().getRefPic(pcFoundNeighborMotion->m_iRefMultiViewL1[ac], LIST_1).getFrame();
if (ac==0) rcMbDataAccess.getMbMotionData( LIST_1 ).setRefPic(pcVRefPicL1[0], PART_8x8_0);
if (ac==1) rcMbDataAccess.getMbMotionData( LIST_1 ).setRefPic(pcVRefPicL1[1], PART_8x8_1);
if (ac==2) rcMbDataAccess.getMbMotionData( LIST_1 ).setRefPic(pcVRefPicL1[2], PART_8x8_2);
if (ac==3) rcMbDataAccess.getMbMotionData( LIST_1 ).setRefPic(pcVRefPicL1[3], PART_8x8_3);
}
else
{
Err::m_nERR;
}
}
}
return Err::m_nOK;
}
//JVT-Z021
ErrVal MbDecoder::getNeighborMbMotionInfo( MbDataAccess& rcMbDataAccess,
GDV* disparityL0,
GDV* disparityL1,
MBMotion& cMbMotionTmp)
{
Mv cMv;
UInt uiIdx;
SliceHeader& rcSliceHeader = rcMbDataAccess.getSH();
if(cMbMotionTmp.m_iViewMode != INTRA_4X4)
{
Mv cCenterL0, cCenterL1;
rcMbDataAccess.getOrgMbMotionInfo(disparityL0[0], disparityL1[0]);
rcMbDataAccess.getNewMbMotionInfo(disparityL0[0], disparityL1[0], cCenterL0, cCenterL1);
if(rcMbDataAccess.getMbData().m_pcMbImsm->m_iListXFlag==LIST_0)
{
cMv.set((rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset.getHor()+ 9/2),
(rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset.getVer() + 9/2));
uiIdx = cMv.getVer()*9 + cMv.getHor();
cMbMotionTmp = rcMbDataAccess.getSH().getMbMotionInfo(LIST_0, uiIdx);
}
else if(rcMbDataAccess.getMbData().m_pcMbImsm->m_iListXFlag==LIST_1)
{
cMv.set((rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset.getHor()+ 9/2),
(rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset.getVer() + 9/2));
uiIdx = cMv.getVer()*9 + cMv.getHor();
cMbMotionTmp = rcMbDataAccess.getSH().getMbMotionInfo(LIST_1, uiIdx);
}
else
{
cMbMotionTmp.m_iViewMode = INTRA_4X4;
}
}
return Err::m_nOK;
}
//JVT-Z021
#endif // JVT-W081
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -