📄 h263decframe.c
字号:
height >>= 1;
for (i = 0; i < height; i++) {
p0 = frame->pCb + width;
p1 = frame->pCr + width;
if (fillMode == 3) {
tCb = (p0[-1] << 8) | p0[-1];
tCr = (p1[-1] << 8) | p1[-1];
}
for (j = 0; j < (8 - (width & 7)) >> 1; j++) {
((Ipp16u *)p0)[j] = tCb;
((Ipp16u *)p1)[j] = tCr;
}
}
}
if (frame->height & 15) {
width = frame->width;
height = frame->height;
p0 = frame->pY + height * frame->stepY;
for (i = 0; i < 16 - (height & 15); i++) {
if (fillMode == 3) {
ippsCopy_8u(p0 - frame->stepY, p0, (width + 15) &~ 15);
} else {
ippsSet_8u((Ipp8u)tY, p0, (width + 15) &~ 15);
}
p0 += frame->stepY;
}
width >>= 1;
height >>= 1;
p0 = frame->pCb + height * frame->stepCb;
p1 = frame->pCr + height * frame->stepCr;
for (i = 0; i < 8 - (height & 7); i++) {
if (fillMode == 3) {
ippsCopy_8u(p0 - frame->stepCb, p0, (width + 7) &~ 7);
ippsCopy_8u(p1 - frame->stepCr, p1, (width + 7) &~ 7);
} else {
ippsSet_8u((Ipp8u)tCb, p0, (width + 7) &~ 7);
ippsSet_8u((Ipp8u)tCr, p1, (width + 7) &~ 7);
}
}
p0 += frame->stepCb;
p1 += frame->stepCr;
}
}
static h263_Status h263_Resample(h263_Info* pInfo, h263_Frame *srcFr, h263_Frame *dstFr, Ipp32s implicit)
{
h263_VideoPicture* VPic = &pInfo->VideoSequence.VideoPicture;
IppMotionVector *warps = VPic->warpParams;
IppiSize srcRoi, dstRoi;
srcRoi.height = srcFr->height;
srcRoi.width = srcFr->width;
dstRoi.height = dstFr->height;
dstRoi.width = dstFr->width;
if (implicit || (warps[0].dx | warps[0].dy | warps[1].dx | warps[1].dy | warps[2].dx | warps[2].dy | warps[3].dx | warps[3].dy) == 0) {
if (srcFr->width == 2*dstFr->width && srcFr->height == 2*dstFr->height) {
ippiDownsampleFour_H263_8u_C1R(srcFr->pY, srcFr->stepY, srcRoi, dstFr->pY, dstFr->stepY, VPic->rtype);
srcRoi.height >>= 1;
srcRoi.width >>= 1;
ippiDownsampleFour_H263_8u_C1R(srcFr->pCb, srcFr->stepCb, srcRoi, dstFr->pCb, dstFr->stepCb, VPic->rtype);
ippiDownsampleFour_H263_8u_C1R(srcFr->pCr, srcFr->stepCr, srcRoi, dstFr->pCr, dstFr->stepCr, VPic->rtype);
} else if (2*srcFr->width == dstFr->width && 2*srcFr->height == dstFr->height) {
ippiUpsampleFour_H263_8u_C1R(srcFr->pY, srcFr->stepY, srcRoi, dstFr->pY, dstFr->stepY, VPic->rtype, VPic->fillMode == 3 ? -1 : VPic->fillColor[0]);
srcRoi.height >>= 1;
srcRoi.width >>= 1;
ippiUpsampleFour_H263_8u_C1R(srcFr->pCb, srcFr->stepCb, srcRoi, dstFr->pCb, dstFr->stepCb, VPic->rtype, VPic->fillMode == 3 ? -1 : VPic->fillColor[1]);
ippiUpsampleFour_H263_8u_C1R(srcFr->pCr, srcFr->stepCr, srcRoi, dstFr->pCr, dstFr->stepCr, VPic->rtype, VPic->fillMode == 3 ? -1 : VPic->fillColor[2]);
} else {
ippiResample_H263_8u_P3R(srcFr->pY, srcFr->stepY, srcRoi, srcFr->pCb, srcFr->stepCb, srcFr->pCr, srcFr->stepCr,
dstFr->pY, dstFr->stepY, dstRoi, dstFr->pCb, dstFr->stepCb, dstFr->pCr, dstFr->stepCr,
warps, VPic->wda, VPic->rtype, VPic->fillMode, VPic->fillColor);
}
} else {
ippiResample_H263_8u_P3R(srcFr->pY, srcFr->stepY, srcRoi, srcFr->pCb, srcFr->stepCb, srcFr->pCr, srcFr->stepCr,
dstFr->pY, dstFr->stepY, dstRoi, dstFr->pCb, dstFr->stepCb, dstFr->pCr, dstFr->stepCr,
warps, VPic->wda, VPic->rtype, VPic->fillMode, VPic->fillColor);
}
if ((dstFr->width | dstFr->height) & 15)
h263_PadResampledFrame(dstFr, VPic->fillMode, VPic->fillColor);
h263_PadFrame(dstFr);
H263_UPDATE_RESAMPLE_PARAMS(VPic, &pInfo->VideoSequence);
return H263_STATUS_OK;
}
Ipp32s h263_Check_Resize(h263_Info* pInfo)
{
h263_VideoPicture* VPic = &pInfo->VideoSequence.VideoPicture;
Ipp32s mbpR = VPic->MacroBlockPerRow, mbpC = VPic->MacroBlockPerCol;
Ipp32s newSize = (mbpR + 2*H263_NUM_EXT_MB) * (mbpC + 2*H263_NUM_EXT_MB);
Ipp32s oldSize;
h263_Frame *frame, *refFrame;
Ipp32s resizeMask = 0, msk;
h263_EnhancedLayer *enh_layer = NULL;
Ipp32s modiFlag;
VPic->implicit_resample = 0;
if (VPic->MacroBlockPerRow * VPic->MacroBlockPerCol > pInfo->VideoSequence.num_of_MBs)
resizeMask |= 0x100;
switch (VPic->picture_coding_type) {
case H263_PIC_TYPE_I:
frame = &pInfo->VideoSequence.rFrame;
oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
if (newSize > oldSize)
resizeMask |= 1;
break;
case H263_PIC_TYPE_P:
frame = &pInfo->VideoSequence.rFrame;
oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
if (newSize > oldSize)
resizeMask |= 1;
if (!VPic->modes.resample && // VPic->plusptype &&
(VPic->width != pInfo->VideoSequence.cFrame.width || VPic->height != pInfo->VideoSequence.cFrame.height))
VPic->implicit_resample = 1;
if (VPic->modes.resample || VPic->implicit_resample) {
frame = &pInfo->VideoSequence.bFrame; // ref frame will be resampled into this one
oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
if (newSize > oldSize)
resizeMask |= 4;
}
break;
case H263_PIC_TYPE_PB:
case H263_PIC_TYPE_iPB:
frame = &pInfo->VideoSequence.rFrame;
oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
if (newSize > oldSize)
resizeMask |= 1;
if (pInfo->VideoSequence.Bpics_to_show > 0) {
frame = &pInfo->VideoSequence.bFrame;
msk = 4;
} else {
frame = &pInfo->VideoSequence.nFrame;
msk = 2;
}
oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
if (newSize > oldSize)
resizeMask |= msk;
if (!VPic->modes.resample && // VPic->plusptype &&
(VPic->width != pInfo->VideoSequence.cFrame.width || VPic->height != pInfo->VideoSequence.cFrame.height))
VPic->implicit_resample = 1;
if (VPic->modes.resample || VPic->implicit_resample) {
frame = &pInfo->VideoSequence.aFrame;
oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
if (newSize > oldSize)
resizeMask |= 8;
}
break;
case H263_PIC_TYPE_B:
if (VPic->enh_layer_num == 1) {
if (pInfo->VideoSequence.Bpics_to_show > 0) {
frame = &pInfo->VideoSequence.bFrame;
msk = 4;
} else {
frame = &pInfo->VideoSequence.nFrame;
msk = 2;
}
oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
if (newSize > oldSize)
resizeMask |= msk;
} else {
enh_layer = pInfo->VideoSequence.enhLayers[VPic->enh_layer_num - 2];
if (enh_layer == NULL)
resizeMask |= 0xF0;
else { // paranoid: what if enhanced layer frame size has changed
frame = &enh_layer->n_Frame;
oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
if (newSize > oldSize)
resizeMask |= 0x20;
}
}
if (VPic->enh_layer_num == 1 || VPic->ref_layer_num == 1)
refFrame = &pInfo->VideoSequence.cFrame;
else
refFrame = &pInfo->VideoSequence.enhLayers[VPic->ref_layer_num - 2]->c_Frame;
if (!VPic->modes.resample && // VPic->plusptype &&
(VPic->width != refFrame->width || VPic->height != refFrame->height)) {
VPic->implicit_resample = 1;
VPic->wda = 3;
VPic->fillMode = 3;
h263_Zero4MV(VPic->warpParams);
}
if (VPic->modes.resample || VPic->implicit_resample) {
H263_COMPARE_RESAMPLE_PARAMS(modiFlag, &pInfo->VideoSequence, VPic);
if (modiFlag) {
if (VPic->enh_layer_num == 1) {
frame = &pInfo->VideoSequence.aFrame;
msk = 8;
} else {
frame = &enh_layer->a_Frame;
msk = 0x80;
}
oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
if (newSize > oldSize)
resizeMask |= msk;
}
}
break;
case H263_PIC_TYPE_EI:
enh_layer = pInfo->VideoSequence.enhLayers[VPic->enh_layer_num - 2];
if (enh_layer == NULL)
resizeMask |= 0xF0;
else {
frame = &enh_layer->r_Frame;
oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
if (newSize > oldSize)
resizeMask |= 0x10;
}
break;
case H263_PIC_TYPE_EP:
enh_layer = pInfo->VideoSequence.enhLayers[VPic->enh_layer_num - 2];
/* layers can not start with EP frame */
if (enh_layer == NULL)
return -1;
frame = &enh_layer->r_Frame;
oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
if (newSize > oldSize)
resizeMask |= 0x10;
if (!VPic->modes.resample && // VPic->plusptype &&
(VPic->width != enh_layer->c_Frame.width || VPic->height != enh_layer->c_Frame.height))
VPic->implicit_resample = 1;
if (VPic->modes.resample || VPic->implicit_resample) {
frame = &enh_layer->a_Frame;
oldSize = (frame->mbPerRow + 2*H263_NUM_EXT_MB) * (frame->mbPerCol + 2*H263_NUM_EXT_MB);
if (newSize > oldSize)
resizeMask |= 0x80;
}
break;
default:
return -1;
}
return resizeMask;
}
/**************************************************************************/
/* Main "interface" function */
/**************************************************************************/
h263_Status h263_DecodeVideoPicture(h263_Info* pInfo)
{
h263_Status status = H263_STATUS_OK;
Ipp64s pic_time;
h263_VideoPicture* VPic = &pInfo->VideoSequence.VideoPicture;
Ipp32s temp_ref_delta;
Ipp32s time_factor;
h263_EnhancedLayer *enh_layer = NULL, *ref_layer = NULL;
h263_Frame *refFrame, *lowFrame, *curFrame, *auxFrame;
if (pInfo->VideoSequence.Ppics_to_show > 0) { /* two P-frames/parts already pending */
pInfo->VideoSequence.vFrame = &pInfo->VideoSequence.rFrame;
pInfo->VideoSequence.Ppics_to_show--;
return H263_STATUS_OK;
}
/* set picture time */
if (pInfo->VideoSequence.PicIndex != 0) {
if (VPic->picture_coding_type != H263_PIC_TYPE_B)
temp_ref_delta = VPic->temporal_reference - pInfo->VideoSequence.prevP_temporal_reference;
else
temp_ref_delta = VPic->temporal_reference - pInfo->VideoSequence.ref_temporal_reference;
} else
temp_ref_delta = 0;
if (temp_ref_delta < 0) {
if (VPic->PCF)
temp_ref_delta += 1024;
else
temp_ref_delta += 256;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -