⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mc.cpp

📁 网络MPEG4IP流媒体开发源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
					pmvR = pmvRightMb + 3;				break;			default:				assert (FALSE);			}		// Compute the top left corner's x,y coordinates of current block.		UInt dxc = (((i - 1) & 1) << 3);		UInt dyc = (((i - 1) & 2) << 2);		UInt nxcY = (x + dxc) << 1; 		UInt nycY = (y + dyc) << 1; 		// Compute the corresponding positions on Ref frm, using 5 MVs.		CoordI xRefC = nxcY + pmvC->m_vctTrueHalfPel.x, yRefC = nycY + pmvC->m_vctTrueHalfPel.y;		CoordI xRefT = nxcY + pmvT->m_vctTrueHalfPel.x, yRefT = nycY + pmvT->m_vctTrueHalfPel.y;		CoordI xRefB = nxcY + pmvB->m_vctTrueHalfPel.x, yRefB = nycY + pmvB->m_vctTrueHalfPel.y;		CoordI xRefR = nxcY + pmvR->m_vctTrueHalfPel.x, yRefR = nycY + pmvR->m_vctTrueHalfPel.y;		CoordI xRefL = nxcY + pmvL->m_vctTrueHalfPel.x, yRefL = nycY + pmvL->m_vctTrueHalfPel.y;//		UInt nxcY = x + dxc;//		UInt nycY = y + dyc;//		// Compute the corresponding positions on Ref frm, using 5 MVs.//		CoordI xRefC = ((nxcY + pmvC -> iMVX) << 1) + pmvC -> iHalfX, yRefC = ((nycY + pmvC -> iMVY) << 1) + pmvC -> iHalfY;//		CoordI xRefT = ((nxcY + pmvT -> iMVX) << 1) + pmvT -> iHalfX, yRefT = ((nycY + pmvT -> iMVY) << 1) + pmvT -> iHalfY;//  	CoordI xRefB = ((nxcY + pmvB -> iMVX) << 1) + pmvB -> iHalfX, yRefB = ((nycY + pmvB -> iMVY) << 1) + pmvB -> iHalfY;//		CoordI xRefR = ((nxcY + pmvR -> iMVX) << 1) + pmvR -> iHalfX, yRefR = ((nycY + pmvR -> iMVY) << 1) + pmvR -> iHalfY;//		CoordI xRefL = ((nxcY + pmvL -> iMVX) << 1) + pmvL -> iHalfX, yRefL = ((nycY + pmvL -> iMVY) << 1) + pmvL -> iHalfY;			limitMVRangeToExtendedBBHalfPel (xRefC,yRefC,prctMVLimit,BLOCK_SIZE);		limitMVRangeToExtendedBBHalfPel (xRefT,yRefT,prctMVLimit,BLOCK_SIZE);		limitMVRangeToExtendedBBHalfPel (xRefB,yRefB,prctMVLimit,BLOCK_SIZE);		limitMVRangeToExtendedBBHalfPel (xRefR,yRefR,prctMVLimit,BLOCK_SIZE);		limitMVRangeToExtendedBBHalfPel (xRefL,yRefL,prctMVLimit,BLOCK_SIZE);		Bool bXSubPxlC = (xRefC & 1), bYSubPxlC = (yRefC & 1),			 bXSubPxlT = (xRefT & 1), bYSubPxlT = (yRefT & 1),			 bXSubPxlB = (xRefB & 1), bYSubPxlB = (yRefB & 1),			 bXSubPxlR = (xRefR & 1), bYSubPxlR = (yRefR & 1),			 bXSubPxlL = (xRefL & 1), bYSubPxlL = (yRefL & 1);				// 5 starting pos. in Zoomed Ref. Frames		const PixelC* ppxliPrevYC = ppxlcRefLeftTop + ((yRefC >> 1) + EXPANDY_REF_FRAME) * m_iFrameWidthY + (xRefC >> 1) + EXPANDY_REF_FRAME;		const PixelC* ppxliPrevYT = ppxlcRefLeftTop + ((yRefT >> 1) + EXPANDY_REF_FRAME) * m_iFrameWidthY + (xRefT >> 1) + EXPANDY_REF_FRAME;		const PixelC* ppxliPrevYB = ppxlcRefLeftTop + ((yRefB >> 1) + EXPANDY_REF_FRAME) * m_iFrameWidthY + (xRefB >> 1) + EXPANDY_REF_FRAME;		const PixelC* ppxliPrevYR = ppxlcRefLeftTop + ((yRefR >> 1) + EXPANDY_REF_FRAME) * m_iFrameWidthY + (xRefR >> 1) + EXPANDY_REF_FRAME;		const PixelC* ppxliPrevYL = ppxlcRefLeftTop + ((yRefL >> 1) + EXPANDY_REF_FRAME) * m_iFrameWidthY + (xRefL >> 1) + EXPANDY_REF_FRAME;		UInt *pWghtC, *pWghtT, *pWghtB, *pWghtR, *pWghtL;		pWghtC = (UInt*) gWghtC;		pWghtT = (UInt*) gWghtT;		pWghtB = (UInt*) gWghtB + 32;		pWghtR = (UInt*) gWghtR;		pWghtL = (UInt*) gWghtL;		UInt* uiOvrlpPredY = gOvrlpPredY;		if (bXSubPxlC && bYSubPxlC)			bilnrMCVH (uiOvrlpPredY, ppxliPrevYC, pWghtC, 0, 8, 0, 8, FALSE);		else if (bXSubPxlC && !bYSubPxlC)			bilnrMCH (uiOvrlpPredY, ppxliPrevYC, pWghtC, 0, 8, 0, 8, FALSE);		else if (!bXSubPxlC && bYSubPxlC)			bilnrMCV (uiOvrlpPredY, ppxliPrevYC, pWghtC, 0, 8, 0, 8, FALSE);		else // (!bXSubPxlC && !bYSubPxlC)			bilnrMC (uiOvrlpPredY, ppxliPrevYC, pWghtC, 0, 8, 0, 8, FALSE);		if (bXSubPxlT && bYSubPxlT)			bilnrMCVH (uiOvrlpPredY, ppxliPrevYT, pWghtT, 0, 8, 0, 4, TRUE);		else if (bXSubPxlT && !bYSubPxlT)			bilnrMCH (uiOvrlpPredY, ppxliPrevYT, pWghtT, 0, 8, 0, 4, TRUE);		else if (!bXSubPxlT && bYSubPxlT)			bilnrMCV (uiOvrlpPredY, ppxliPrevYT, pWghtT, 0, 8, 0, 4, TRUE);		else // (!bXSubPxlT && !bYSubPxlT)			bilnrMC (uiOvrlpPredY, ppxliPrevYT, pWghtT, 0, 8, 0, 4, TRUE);		if (bXSubPxlB && bYSubPxlB)			bilnrMCVH (&uiOvrlpPredY [32], ppxliPrevYB + (m_iFrameWidthY << 2), pWghtB, 0, 8, 4, 8, TRUE);		else if (bXSubPxlB && !bYSubPxlB)			bilnrMCH (&uiOvrlpPredY [32], ppxliPrevYB + (m_iFrameWidthY << 2), pWghtB, 0, 8, 4, 8, TRUE);		else if (!bXSubPxlB && bYSubPxlB)			bilnrMCV (&uiOvrlpPredY [32], ppxliPrevYB + (m_iFrameWidthY << 2), pWghtB, 0, 8, 4, 8, TRUE);		else // (!bXSubPxlB && !bYSubPxlB)			bilnrMC (&uiOvrlpPredY [32], ppxliPrevYB + (m_iFrameWidthY << 2), pWghtB, 0, 8, 4, 8, TRUE);		if (bXSubPxlR && bYSubPxlR)			bilnrMCVH (uiOvrlpPredY, ppxliPrevYR, pWghtR, 4, 8, 0, 8, TRUE);		else if (bXSubPxlR && !bYSubPxlR)			bilnrMCH (uiOvrlpPredY, ppxliPrevYR, pWghtR, 4, 8, 0, 8, TRUE);		else if (!bXSubPxlR && bYSubPxlR)			bilnrMCV (uiOvrlpPredY, ppxliPrevYR, pWghtR, 4, 8, 0, 8, TRUE);		else // (!bXSubPxlR && !bYSubPxlR)			bilnrMC (uiOvrlpPredY, ppxliPrevYR, pWghtR, 4, 8, 0, 8, TRUE);		if (bXSubPxlL && bYSubPxlL)			bilnrMCVH (uiOvrlpPredY, ppxliPrevYL, pWghtL, 0, 4, 0, 8, TRUE);		else if (bXSubPxlL && !bYSubPxlL)			bilnrMCH (uiOvrlpPredY, ppxliPrevYL, pWghtL, 0, 4, 0, 8, TRUE);		else if (!bXSubPxlL && bYSubPxlL)			bilnrMCV (uiOvrlpPredY, ppxliPrevYL, pWghtL, 0, 4, 0, 8, TRUE);		else // (!bXSubPxlL && !bYSubPxlL)			bilnrMC (uiOvrlpPredY, ppxliPrevYL, pWghtL, 0, 4, 0, 8, TRUE);		PixelC* ppxliPredY = ppxlcPredMB + dxc + dyc * MB_SIZE;  // Starting of Pred. Frame		for (UInt iy = 0; iy < BLOCK_SIZE; iy++){			for (UInt ix = 0; ix < BLOCK_SIZE; ix++)				*ppxliPredY++= (*uiOvrlpPredY++ + 4) >> 3;			ppxliPredY += BLOCK_SIZE;		}	}}Void CVideoObject::bilnrMCVH (UInt* PredY, const PixelC* ppxliPrevYC, UInt* pMWght, UInt xlow, UInt xhigh, UInt ylow, UInt yhigh, Bool bAdd){	const PixelC* ppxliPrevYCBot = ppxliPrevYC + m_iFrameWidthY;	if (bAdd)		for (UInt iy = ylow; iy < yhigh; iy++) {			for (UInt ix = xlow; ix < xhigh; ix++)//				PredY [ix] += ((UInt) (ppxliPrevYC [ix] + ppxliPrevYC [ix + 1] + ppxliPrevYCBot [ix] + ppxliPrevYCBot[ix+1] + 2) >> 2) * pMWght [ix];				PredY [ix] += ((UInt) (ppxliPrevYC [ix] + ppxliPrevYC [ix + 1] + ppxliPrevYCBot [ix] + ppxliPrevYCBot[ix+1] + 2 - m_vopmd.iRoundingControl) >> 2) * pMWght [ix];			ppxliPrevYC += m_iFrameWidthY;			ppxliPrevYCBot += m_iFrameWidthY;			PredY += BLOCK_SIZE;			pMWght += BLOCK_SIZE;		}	else		for (UInt iy = ylow; iy < yhigh; iy++) {			for (UInt ix = xlow; ix < xhigh; ix++)//				PredY [ix] = ((UInt) (ppxliPrevYC [ix] + ppxliPrevYC [ix + 1] + ppxliPrevYCBot [ix] + ppxliPrevYCBot[ix+1] + 2) >> 2) * pMWght [ix];				PredY [ix] = ((UInt) (ppxliPrevYC [ix] + ppxliPrevYC [ix + 1] + ppxliPrevYCBot [ix] + ppxliPrevYCBot[ix+1] + 2 - m_vopmd.iRoundingControl) >> 2) * pMWght [ix];			ppxliPrevYC += m_iFrameWidthY;			ppxliPrevYCBot += m_iFrameWidthY;			PredY += BLOCK_SIZE;			pMWght += BLOCK_SIZE;		}}Void CVideoObject::bilnrMCV (UInt* PredY, const PixelC* ppxliPrevYC, UInt* pMWght, UInt xlow, UInt xhigh, UInt ylow, UInt yhigh, Bool bAdd){	const PixelC* ppxliPrevYCBot = ppxliPrevYC + m_iFrameWidthY;	if (bAdd)		for (UInt iy = ylow; iy < yhigh; iy++) {			for (UInt ix = xlow; ix < xhigh; ix++)//				PredY [ix] += ((UInt) (ppxliPrevYC [ix] + ppxliPrevYCBot [ix] + 1) >> 1) * pMWght [ix]; 				PredY [ix] += ((UInt) (ppxliPrevYC [ix] + ppxliPrevYCBot [ix] + 1 - m_vopmd.iRoundingControl) >> 1) * pMWght [ix];			ppxliPrevYC += m_iFrameWidthY;			ppxliPrevYCBot += m_iFrameWidthY;			PredY += BLOCK_SIZE;			pMWght += BLOCK_SIZE;		}	else		for (UInt iy = ylow; iy < yhigh; iy++) {			for (UInt ix = xlow; ix < xhigh; ix++)//				PredY [ix] = ((UInt) (ppxliPrevYC [ix] + ppxliPrevYCBot [ix] + 1) >> 1) * pMWght [ix];				PredY [ix] = ((UInt) (ppxliPrevYC [ix] + ppxliPrevYCBot [ix] + 1 - m_vopmd.iRoundingControl) >> 1) * pMWght [ix];			ppxliPrevYC += m_iFrameWidthY;			ppxliPrevYCBot += m_iFrameWidthY;			PredY += BLOCK_SIZE;			pMWght += BLOCK_SIZE;		}}Void CVideoObject::bilnrMCH (UInt* PredY, const PixelC* ppxliPrevYC, UInt* pMWght, UInt xlow, UInt xhigh, UInt ylow, UInt yhigh, Bool bAdd){	//PixelC* ppxliPrevYCBot = ppxliPrevYC + m_iFrameWidthY;	if (bAdd)		for (UInt iy = ylow; iy < yhigh; iy++) {			for (UInt ix = xlow; ix < xhigh; ix++)//				PredY [ix] += ((UInt) (ppxliPrevYC [ix] + ppxliPrevYC [ix + 1] + 1) >> 1) * pMWght [ix];				PredY [ix] += ((UInt) (ppxliPrevYC [ix] + ppxliPrevYC [ix + 1] + 1 - m_vopmd.iRoundingControl) >> 1) * pMWght [ix];			ppxliPrevYC += m_iFrameWidthY;			PredY += BLOCK_SIZE;			pMWght += BLOCK_SIZE;		}	else		for (UInt iy = ylow; iy < yhigh; iy++) {			for (UInt ix = xlow; ix < xhigh; ix++)//				PredY [ix] = ((UInt) (ppxliPrevYC [ix] + ppxliPrevYC [ix + 1] + 1) >> 1) * pMWght [ix];				PredY [ix] = ((UInt) (ppxliPrevYC [ix] + ppxliPrevYC [ix + 1] + 1 - m_vopmd.iRoundingControl) >> 1) * pMWght [ix];			ppxliPrevYC += m_iFrameWidthY;			PredY += BLOCK_SIZE;			pMWght += BLOCK_SIZE;		}}Void CVideoObject::bilnrMC (UInt* PredY, const PixelC* ppxliPrevYC, UInt* pMWght, UInt xlow, UInt xhigh, UInt ylow, UInt yhigh, Bool bAdd){	//PixelC* ppxliPrevYCBot = ppxliPrevYC + m_iFrameWidthY;	if (bAdd)		for (UInt iy = ylow; iy < yhigh; iy++) {			for (UInt ix = xlow; ix < xhigh; ix++)				PredY [ix] += (UInt) ppxliPrevYC [ix] * pMWght[ix];			ppxliPrevYC += m_iFrameWidthY;			PredY += BLOCK_SIZE;			pMWght += BLOCK_SIZE;		}	else		for (UInt iy = ylow; iy < yhigh; iy++) {			for (UInt ix = xlow; ix < xhigh; ix++)				PredY [ix] = (UInt) ppxliPrevYC [ix] * pMWght [ix];			ppxliPrevYC += m_iFrameWidthY;			PredY += BLOCK_SIZE;			pMWght += BLOCK_SIZE;		}}Void CVideoObject::motionCompBY (	PixelC* ppxlcPred, // can be either Y or A	const PixelC* ppxlcRefLeftTop,	CoordI iXRef, CoordI iYRef // x + mvX in full pel unit){	CoordI iY;	const PixelC* ppxlcRef = ppxlcRefLeftTop + 							(iYRef + EXPANDY_REF_FRAME) * m_iFrameWidthY + iXRef + EXPANDY_REF_FRAME;    // bugfix: use the proper bounding rect (!), 981028 mwi    Int iLeftBound;    Int iRightBound;    Int iTopBound;    Int iBottomBound;    if (m_vopmd.vopPredType == BVOP && m_vopmd.fShapeBPredDir == B_BACKWARD) {      iLeftBound = max(0,m_rctRefVOPY1.left - iXRef);      iRightBound = max(0,m_rctRefVOPY1.right - iXRef);      iTopBound = max(0,m_rctRefVOPY1.top - iYRef);      iBottomBound = max(0,m_rctRefVOPY1.bottom - iYRef);    }    else {      iLeftBound = max(0,m_rctRefVOPY0.left - iXRef);      iRightBound = max(0,m_rctRefVOPY0.right - iXRef);      iTopBound = max(0,m_rctRefVOPY0.top - iYRef);      iBottomBound = max(0,m_rctRefVOPY0.bottom - iYRef);    }    // ~bugfix: use the proper bounding rect		iLeftBound = min(MC_BAB_SIZE,iLeftBound);	iRightBound = min(MC_BAB_SIZE,iRightBound);	iTopBound = min(MC_BAB_SIZE,iTopBound);	iBottomBound = min(MC_BAB_SIZE,iBottomBound);	Int iHeightMax = iBottomBound-iTopBound;	Int iWidthMax  = iRightBound-iLeftBound;	if (iHeightMax == MC_BAB_SIZE && iWidthMax == MC_BAB_SIZE)	{		for (iY = 0; iY < MC_BAB_SIZE; iY++) {			memcpy (ppxlcPred, ppxlcRef, MC_BAB_SIZE*sizeof(PixelC));			ppxlcRef  += m_iFrameWidthY;			ppxlcPred += MC_BAB_SIZE;		}	} else if(iWidthMax == 0 || iHeightMax==0)		for (iY = 0; iY < MC_BAB_SIZE; iY++) {			memset (ppxlcPred, 0, MC_BAB_SIZE*sizeof(PixelC));			ppxlcPred += MC_BAB_SIZE;		}	else {		for (iY = 0; iY < MC_BAB_SIZE; iY++) {			if(iY<iTopBound || iY>=iBottomBound)				memset (ppxlcPred, 0, MC_BAB_SIZE*sizeof(PixelC));  // clear row			else			{				if(iLeftBound>0)					memset (ppxlcPred, 0, iLeftBound*sizeof(PixelC)); // clear left hand span				if(iRightBound<MC_BAB_SIZE)					memset (ppxlcPred+iRightBound, 0, (MC_BAB_SIZE-iRightBound)*sizeof(PixelC)); // right span				memcpy (ppxlcPred+iLeftBound, ppxlcRef+iLeftBound, iWidthMax*sizeof(PixelC)); // copy middle region			}			ppxlcRef += m_iFrameWidthY;			ppxlcPred += MC_BAB_SIZE;		}	}}Void CVideoObject::copyFromRefToCurrQ (	const CVOPU8YUVBA* pvopcRef, // reference VOP	CoordI x, CoordI y, 	PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV,	CRct *prctMVLimit){	// needs limiting to reference area bounding box	limitMVRangeToExtendedBBFullPel(x,y,prctMVLimit,MB_SIZE);		Int iOffsetY = (y + EXPANDY_REF_FRAME) * m_iFrameWidthY + x + EXPANDY_REF_FRAME;	Int iOffsetUV = (y / 2 + EXPANDUV_REF_FRAME) * m_iFrameWidthUV + x / 2 + EXPANDUV_REF_FRAME;	const PixelC* ppxlcRefMBY = pvopcRef->pixelsY () + iOffsetY;	const PixelC* ppxlcRefMBU = pvopcRef->pixelsU () + iOffsetUV;	const PixelC* ppxlcRefMBV = pvopcRef->pixelsV () + iOffsetUV;	CoordI iY;	for (iY = 0; iY < BLOCK_SIZE; iY++) {		memcpy (ppxlcCurrQMBY, ppxlcRefMBY, MB_SIZE*sizeof(PixelC));		memcpy (ppxlcCurrQMBU, ppxlcRefMBU, BLOCK_SIZE*sizeof(PixelC));		memcpy (ppxlcCurrQMBV, ppxlcRefMBV, BLOCK_SIZE*sizeof(PixelC));		ppxlcCurrQMBY += m_iFrameWidthY; ppxlcRefMBY += m_iFrameWidthY;		ppxlcCurrQMBU += m_iFrameWidthUV; ppxlcRefMBU += m_iFrameWidthUV;		ppxlcCurrQMBV += m_iFrameWidthUV; ppxlcRefMBV += m_iFrameWidthUV;		memcpy (ppxlcCurrQMBY, ppxlcRefMBY, MB_SIZE*sizeof(PixelC));		ppxlcCurrQMBY += m_iFrameWidthY; ppxlcRefMBY += m_iFrameWidthY;	}}Void CVideoObject::copyFromRefToCurrQ_WithShape (	const CVOPU8YUVBA* pvopcRef, // reference VOP	CoordI x, CoordI y, 	PixelC* ppxlcCurrQMBY, PixelC* ppxlcCurrQMBU, PixelC* ppxlcCurrQMBV, PixelC* ppxlcCurrQMBBY){	Int iOffsetY = (y + EXPANDY_REF_FRAME) * m_iFrameWidthY + x + EXPANDY_REF_FRAME;	Int iOffsetUV = (y / 2 + EXPANDUV_REF_FRAME) * m_iFrameWidthUV + x / 2 + EXPANDUV_REF_FRAME;	const PixelC* ppxlcRefMBY = pvopcRef->pixelsY () + iOffsetY;	const PixelC* ppxlcRefMBBY = pvopcRef->pixelsBY () + iOffsetY;	const PixelC* ppxlcRefMBU = pvopcRef->pixelsU () + iOffsetUV;	const PixelC* ppxlcRefMBV = pvopcRef->pixelsV () + iOffsetUV;	CoordI iY;	for (iY = 0; iY < BLOCK_SIZE; iY++) {		memcpy (ppxlcCurrQMBY, ppxlcRefMBY, MB_SIZE*sizeof(PixelC));		memcpy (ppxlcCurrQMBBY, ppxlcRefMBBY, MB_SIZE*sizeof(PixelC));		memcpy (ppxlcCurrQMBU, ppxlcRefMBU, BLOCK_SIZE*sizeof(PixelC));		memcpy (ppxlcCurrQMBV, ppxlcRefMBV, BLOCK_SIZE*sizeof(PixelC));		ppxlcCurrQMBY += m_iFrameWidthY; ppxlcRefMBY += m_iFrameWidthY;		ppxlcCurrQMBBY += m_iFrameWidthY; ppxlcRefMBBY += m_iFrameWidthY;		ppxlcCurrQMBU += m_iFrameWidthUV; ppxlcRefMBU += m_iFrameWidthUV;		ppxlcCurrQMBV += m_iFrameWidthUV; ppxlcRefMBV += m_iFrameWidthUV;		memcpy (ppxlcCurrQMBY, ppxlcRefMBY, MB_SIZE*sizeof(PixelC));		ppxlcCurrQMBY += m_iFrameWidthY; ppxlcRefMBY += m_iFrameWidthY;		memcpy (ppxlcCurrQMBBY, ppxlcRefMBBY, MB_SIZE*sizeof(PixelC));		ppxlcCurrQMBBY += m_iFrameWidthY; ppxlcRefMBBY += m_iFrameWidthY;	}}Void CVideoObject::copyAlphaFromRefToCurrQ (	const CVOPU8YUVBA* pvopcRef, // reference VOP	CoordI x, CoordI y, 	PixelC* ppxlcCurrQMBA,	CRct *prctMVLimit){	// needs limiting to reference area bounding box	limitMVRangeToExtendedBBFullPel(x,y,prctMVLimit,MB_SIZE);	Int iOffsetY = (y + EXPANDY_REF_FRAME) * m_iFrameWidthY + x + EXPANDY_REF_FRAME;	const PixelC* ppxlcRefMBA = pvopcRef->pixelsA () + iOffsetY;	CoordI iY;	for (iY = 0; iY < MB_SIZE; iY++) {		memcpy (ppxlcCurrQMBA, ppxlcRefMBA, MB_SIZE*sizeof(PixelC));		ppxlcCurrQMBA += m_iFrameWidthY; 		ppxlcRefMBA += m_iFrameWidthY;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -