📄 h263parse.c
字号:
return H263_STATUS_PARSE_ERROR;
}
}
} else {
VPicFmt->height = h263_pic_height[source_format - 1];
VPicFmt->width = h263_pic_width[source_format - 1];
}
if (VPic->PCF) { /* custom picture clock frequency */
code = h263_GetBits9(pInfo, 8);
VPic->clock_conversion_code = code >> 7;
VPic->clock_divisor = code & 0x7F;
if (VPic->clock_divisor == 0) {
h263_Error("Error: Zero clock divisor");
return H263_STATUS_PARSE_ERROR;
}
}
}
if (VPic->PCF) { /* custom picture clock frequency */
etr = h263_GetBits9(pInfo, 2);
VPic->temporal_reference += (etr << 8);
}
if (VPic->ufep == 1) {
if (oppmodes.UMV) {
code = h263_GetBit(pInfo);
if (code)
VPic->unlimited_UMV = 0;
else {
code = h263_GetBit(pInfo);
if (!code) {
h263_Error("Error: Invalid UUI");
return H263_STATUS_PARSE_ERROR;
}
VPic->unlimited_UMV = 1;
}
}
if (oppmodes.sliceStruct)
VPic->sliceSubmodes = h263_GetBits9(pInfo, 2); /* if ufep==0, the last decoded value is used */
}
if (scalability) {
VPic->enh_layer_num = h263_GetBits9(pInfo, 4);
if (VPic->enh_layer_num == 0) {
h263_Error("Error: Invalid enhanced layer number");
return H263_STATUS_PARSE_ERROR;
}
VSeqOppModes = &(pInfo->VideoSequence.oppmodes[VPic->enh_layer_num - 1]);
VSeqFmt = &(pInfo->VideoSequence.format[VPic->enh_layer_num - 1]);
if (VPic->ufep == 1) {
VPic->ref_layer_num = h263_GetBits9(pInfo, 4);
if (VPic->ref_layer_num == 0) {
h263_Error("Error: Invalid reference layer number");
return H263_STATUS_PARSE_ERROR;
}
pInfo->VideoSequence.ref_layer_num[VPic->enh_layer_num - 1] = VPic->ref_layer_num;
if (VPicFmt->height != pInfo->VideoSequence.format[VPic->ref_layer_num - 1].height) {
if (VPicFmt->width != pInfo->VideoSequence.format[VPic->ref_layer_num - 1].width)
VPicFmt->scalability_type = H263_SCALABILITY_SPATIAL_XY;
else
VPicFmt->scalability_type = H263_SCALABILITY_SPATIAL_Y;
} else {
if (VPicFmt->width != pInfo->VideoSequence.format[VPic->ref_layer_num - 1].width)
VPicFmt->scalability_type = H263_SCALABILITY_SPATIAL_X;
else
VPicFmt->scalability_type = (VPic->picture_coding_type == H263_PIC_TYPE_B ? H263_SCALABILITY_TEMPORAL : H263_SCALABILITY_SNR);
}
} else {
VPic->ref_layer_num = pInfo->VideoSequence.ref_layer_num[VPic->enh_layer_num - 1];
if (VPic->picture_coding_type == H263_PIC_TYPE_B) {
if (pInfo->VideoSequence.prev_pic_type[VPic->enh_layer_num - 1] != H263_PIC_TYPE_B)
VPic->ref_layer_num = pInfo->VideoSequence.ref_layer_num_b[VPic->enh_layer_num - 1] = VPic->enh_layer_num;
else
VPic->ref_layer_num = pInfo->VideoSequence.ref_layer_num_b[VPic->enh_layer_num - 1];
}
}
} else {
VPic->enh_layer_num = 1;
VSeqOppModes = &(pInfo->VideoSequence.oppmodes[0]);
VSeqFmt = &(pInfo->VideoSequence.format[0]);
}
if (oppmodes.RPS) {
if (VPic->ufep == 1) {
VPic->RPSflags = h263_GetBits9(pInfo, 3);
if (VPic->RPSflags < 4) {
h263_Error("Error: Invalid PRSMF");
return H263_STATUS_PARSE_ERROR;
}
}
code = h263_GetBit(pInfo); /* TRPI */
if (code) {
VPic->pred_temp_ref = h263_GetBits(pInfo, 10); /* TRP */
}
code = h263_GetBit(pInfo); /* BCI */
if (code) {
h263_parse_BCM(pInfo); /* not implemented yet !!! */
} else {
code = h263_GetBit(pInfo);
if (!code) {
h263_Error("Error: Invalid BCI");
return H263_STATUS_PARSE_ERROR;
}
}
}
if (modes.resample) {
VPic->wda = h263_GetBits9(pInfo, 2);
if (VPic->wda < 2) {
h263_Error("Error: Invalid wda");
return H263_STATUS_PARSE_ERROR;
}
VPic->wda &= 1;
h263_decode_resampleParams(pInfo);
}
if (VPic->ufep == 1) {
*VSeqOppModes = oppmodes;
*VPicOppModes = oppmodes;
*VSeqFmt = *VPicFmt;
} else {
*VPicOppModes = *VSeqOppModes;
*VPicFmt = *VSeqFmt;
}
VPic->height = VPicFmt->height;
VPic->width = VPicFmt->width;
} else { /* PLUSPTYPE */
VPic->rtype = 0;
code = h263_GetBits(pInfo, 5); /* the rest of PTYPE */
VPic->picture_coding_type = (code >> 4) & 1;
modes.UMV = (code >> 3) & 1;
modes.SAC = (code >> 2) & 1;
modes.advPred = (code >> 1) & 1;
modes.PBframes = code & 1;
modes.redResUp = 0;
modes.resample = 0;
if (modes.PBframes)
VPic->picture_coding_type = H263_PIC_TYPE_PB;
VSeqOppModes = &(pInfo->VideoSequence.oppmodes[0]);
h263_zero_oppmodes(VSeqOppModes);
h263_zero_oppmodes(VPicOppModes);
VPic->height = h263_pic_height[source_format - 1];
VPic->width = h263_pic_width[source_format - 1];
/* ??? may need that only if there are frames with and without PLUSPTYPE in the same sequence
pInfo->VideoSequence.format[0].height = VPic->height;
pInfo->VideoSequence.format[0].width = VPic->width;
*/
}
*VPicModes = modes;
/* Mode restrictions (Rec. 5.1.4.5) ??? */
if (VPic->picture_coding_type == H263_PIC_TYPE_I) {
VPicModes->UMV = VPicModes->advPred =
VPicOppModes->UMV = VPicOppModes->advPred =
VPicOppModes->altInterVLC = 0;
VPicModes->resample = VPicModes->redResUp = 0;
} else if (VPic->picture_coding_type == H263_PIC_TYPE_B) {
VPicModes->SAC = VPicOppModes->SAC =
VPicOppModes->deblockFilt =
VPicOppModes->advPred = 0;
} else if (VPic->picture_coding_type == H263_PIC_TYPE_EI) {
VPicModes->UMV = VPicModes->SAC = VPicModes->advPred =
VPicOppModes->UMV = VPicOppModes->SAC = VPicOppModes->advPred =
VPicOppModes->altInterVLC = 0;
VPicModes->resample = VPicModes->redResUp = 0;
} else if (VPic->picture_coding_type == H263_PIC_TYPE_EP) {
VPicModes->SAC = VPicModes->advPred = 0;
VPicOppModes->SAC = VPicOppModes->advPred = 0;
}
VPic->pic_quant = h263_GetBits9(pInfo, 5);
if (!VPic->plusptype) {
VPic->CPM = h263_GetBit(pInfo);
if (VPic->CPM)
VPic->PSBI = h263_GetBits9(pInfo, 2);
}
#if 0
if (VPic->width != VSeq->format[VPic->enh_layer_num - 1].width || VPic->height != VSeq->format[VPic->enh_layer_num - 1].height) { /* ??? */
if (!VPicModes->resample && !scalability && VPic->picture_coding_type != H263_PIC_TYPE_I) {
h263_Error("Error: Source format change is incompatible with picture type");
return H263_STATUS_PARSE_ERROR;
}
}
#endif
if (VPic->picture_coding_type == H263_PIC_TYPE_PB ||
VPic->picture_coding_type == H263_PIC_TYPE_iPB) {
if (VPic->PCF)
VPic->temporal_reference_B = h263_GetBits9(pInfo, 5);
else
VPic->temporal_reference_B = h263_GetBits9(pInfo, 3);
VPic->dbquant = h263_GetBits9(pInfo, 2);
}
for (;;) {
code = h263_GetBit(pInfo); /* pei */
if (!code)
break;
code = h263_GetBits9(pInfo, 8); /* psupp (Annex L) TODO ??? */
}
if (!VPicModes->redResUp) {
VPic->MacroBlockPerRow = (VPic->width + 15) >> 4;
VPic->MacroBlockPerCol = (VPic->height + 15) >> 4;
if (VPic->height <= 400) {
VPic->RowsPerGOB = 1;
VPic->num_gobs_in_pic = VPic->MacroBlockPerCol;
} else if (VPic->height <= 800) {
VPic->RowsPerGOB = 2;
VPic->num_gobs_in_pic = (VPic->MacroBlockPerCol + 1) >> 1;
} else { /* if (VPic->height <= 1152) */
VPic->RowsPerGOB = 4;
VPic->num_gobs_in_pic = (VPic->MacroBlockPerCol + 3) >> 2;
}
} else {
VPic->MacroBlockPerRow = (VPic->width + 31) >> 5;
VPic->MacroBlockPerCol = (VPic->height + 31) >> 5;
if (VPic->height <= 800) {
VPic->RowsPerGOB = 1;
VPic->num_gobs_in_pic = VPic->MacroBlockPerCol;
} else { /* if (VPic->height <= 1152) */
VPic->RowsPerGOB = 2;
VPic->num_gobs_in_pic = (VPic->MacroBlockPerCol + 1) >> 1;
}
}
return H263_STATUS_OK;
}
Ipp32s h263_ParseGOBHeader(h263_Info* pInfo)
{
Ipp32u code;
code = h263_ShowBits(pInfo, 17);
if (code > 1) /* No GOB header */
return 0;
if (code == 1) { /* GOB Start code, no GSTUF */
h263_FlushBits(pInfo, 17);
} else {
Ipp32s index = 2 + ((pInfo->bitoff + 7) >> 3);
if (pInfo->bufptr[index] > 127) { /* GOB Start code, with GSTUF */
pInfo->bufptr += index;
pInfo->bitoff = 1;
} else {
return -1;
}
}
pInfo->VideoSequence.VideoPicture.gob_number = h263_GetBits9(pInfo, 5);
if (pInfo->VideoSequence.VideoPicture.gob_number > 30) /* EOS or EOSBS */
return 1;
if (pInfo->VideoSequence.VideoPicture.CPM)
pInfo->VideoSequence.VideoPicture.GSBI = h263_GetBits9(pInfo, 2);
pInfo->VideoSequence.VideoPicture.GFID = h263_GetBits9(pInfo, 2);
pInfo->VideoSequence.VideoPicture.pic_quant = h263_GetBits9(pInfo, 5);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -