📄 mp4_enc_headers.cpp
字号:
cBS.PutBits(VOL.ref_layer_id, 4);
cBS.PutBits(VOL.ref_layer_sampling_direct, 1);
cBS.PutBits(VOL.hor_sampling_factor_n, 5);
cBS.PutBits(VOL.hor_sampling_factor_m, 5);
cBS.PutBits(VOL.vert_sampling_factor_n, 5);
cBS.PutBits(VOL.vert_sampling_factor_m, 5);
cBS.PutBits(VOL.enhancement_type, 1);
if (VOL.video_object_layer_shape == MP4_SHAPE_TYPE_BINARY && VOL.hierarchy_type == 0) {
cBS.PutBits(VOL.use_ref_shape, 1);
cBS.PutBits(VOL.use_ref_texture, 1);
cBS.PutBits(VOL.shape_hor_sampling_factor_n, 5);
cBS.PutBits(VOL.shape_hor_sampling_factor_m, 5);
cBS.PutBits(VOL.shape_vert_sampling_factor_n, 5);
cBS.PutBits(VOL.shape_vert_sampling_factor_m, 5);
}
}
} else {
if (VOL.video_object_layer_verid != 1) {
cBS.PutBits(VOL.scalability, 1);
if (VOL.scalability) {
cBS.PutBits(VOL.shape_hor_sampling_factor_n, 5);
cBS.PutBits(VOL.shape_hor_sampling_factor_m, 5);
cBS.PutBits(VOL.shape_vert_sampling_factor_n, 5);
cBS.PutBits(VOL.shape_vert_sampling_factor_m, 5);
}
}
cBS.PutBits(VOL.resync_marker_disable, 1);
}
EncodeStuffingBitsAlign();
EncodeStartCode(MP4_USER_DATA_SC);
const IppLibraryVersion *ippVer = ippvcGetLibVersion();
Ipp8s ippStr[1024];
sprintf((char *)ippStr, " Intel(R) MPEG-4 encoder based on Intel(R) IPP %s[%d.%d.%d.%d]",
ippVer->Version, ippVer->major, ippVer->minor, ippVer->majorBuild, ippVer->build);
cBS.PutStr(ippStr);
}
void ippVideoEncoderMPEG4::EncodeGOV_Header()
{
Ipp32s sec, min, hour;
EncodeStartCode(MP4_GROUP_OF_VOP_SC);
sec = GOV.time_code;
hour = sec / 3600;
sec -= hour * 3600;
min = sec / 60;
sec -= min * 60;
GOV.time_code = (hour << 13) + (min << 7) + (1 << 6) + sec;
cBS.PutBits(GOV.time_code, 18);
cBS.PutBits(GOV.closed_gov, 1);
cBS.PutBits(GOV.broken_link, 1);
EncodeStuffingBitsAlign();
//f EncodeStartCode(MP4_USER_DATA_SC);
//f user_data
}
void ippVideoEncoderMPEG4::EncodeVOP_Header()
{
EncodeStartCode(MP4_VIDEO_OBJECT_PLANE_SC);
cBS.PutBits(VOP.vop_coding_type, 2);
Ipp32s i = VOP.modulo_time_base;
while (i > 0) {
cBS.PutMarkerBit();
i --;
}
cBS.PutZeroBit();
cBS.PutMarkerBit();
cBS.PutBits(VOP.vop_time_increment, VOL.vop_time_increment_resolution_bits);
cBS.PutMarkerBit();
cBS.PutBits(VOP.vop_coded, 1);
if (VOP.vop_coded == 0) {
EncodeStuffingBitsAlign();
return;
}
if (VOL.newpred_enable) {
//f vop_id 4-15
cBS.PutBits(VOP.vop_id_for_prediction_indication, 1);
if (VOP.vop_id_for_prediction_indication) {
//f vop_id_for_prediction 4-15
cBS.PutMarkerBit();
}
}
if ((VOL.video_object_layer_shape != MP4_SHAPE_TYPE_BINARYONLY) &&
(VOP.vop_coding_type == MP4_VOP_TYPE_P ||
(VOP.vop_coding_type == MP4_VOP_TYPE_S && VOL.sprite_enable == MP4_SPRITE_GMC)))
cBS.PutBits(VOP.vop_rounding_type, 1);
if ((VOL.reduced_resolution_vop_enable) && (VOL.video_object_layer_shape == MP4_SHAPE_TYPE_RECTANGULAR) &&
((VOP.vop_coding_type == MP4_VOP_TYPE_P) || (VOP.vop_coding_type == MP4_VOP_TYPE_I)))
cBS.PutBits(VOP.vop_reduced_resolution, 1);
if (VOL.video_object_layer_shape != MP4_SHAPE_TYPE_RECTANGULAR) {
if (!(VOL.sprite_enable == MP4_SPRITE_STATIC && VOP.vop_coding_type == MP4_VOP_TYPE_I)) {
cBS.PutBits(VOP.vop_width, 13);
cBS.PutMarkerBit();
cBS.PutBits(VOP.vop_height, 13);
cBS.PutMarkerBit();
cBS.PutBits(VOP.vop_horizontal_mc_spatial_ref, 13);
cBS.PutMarkerBit();
cBS.PutBits(VOP.vop_vertical_mc_spatial_ref, 13);
cBS.PutMarkerBit();
}
if ((VOL.video_object_layer_shape != MP4_SHAPE_TYPE_BINARYONLY) && VOL.scalability && VOL.enhancement_type)
cBS.PutBits(VOP.background_composition, 1);
cBS.PutBits(VOP.change_conv_ratio_disable, 1);
cBS.PutBits(VOP.vop_constant_alpha, 1);
if (VOP.vop_constant_alpha)
cBS.PutBits(VOP.vop_constant_alpha_value, 8);
}
//f if (VOL.video_object_layer_shape != MP4_SHAPE_TYPE_BINARYONLY)
//f if (!complexity_estimation_disable)
//f read_vop_complexity_estimation_header()
if (VOL.video_object_layer_shape != MP4_SHAPE_TYPE_BINARYONLY) {
cBS.PutBits(VOP.intra_dc_vlc_thr, 3);
if (VOL.interlaced) {
cBS.PutBits(VOP.top_field_first, 1);
cBS.PutBits(VOP.alternate_vertical_scan_flag, 1);
}
}
if ((VOL.sprite_enable == MP4_SPRITE_STATIC || VOL.sprite_enable == MP4_SPRITE_GMC) && VOP.vop_coding_type == MP4_VOP_TYPE_S) {
if (VOL.no_of_sprite_warping_points > 0) {
Ipp32s dmv, dmva, i, j;
static const Ipp32s wc[15] = {0, 2, 3, 4, 5, 6, 14, 30, 62, 126, 254, 510, 1022, 2046, 4094};
static const Ipp32s wl[15] = {2, 3, 3, 3, 3, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
for (i = 0; i < VOL.no_of_sprite_warping_points; i ++) {
dmv = VOP.warping_mv_code_du[i];
if (dmv == 0) {
cBS.PutBits(0, 2);
} else {
dmva = (dmv < 0) ? -dmv : dmv;
j = 1;
while (dmva >>= 1)
j ++;
cBS.PutBits(wc[j], wl[j]);
if (dmv < 0)
dmv += (1 << j) - 1;
cBS.PutBits(dmv, j);
}
cBS.PutMarkerBit();
dmv = VOP.warping_mv_code_dv[i];
if (dmv == 0) {
cBS.PutBits(0, 2);
} else {
dmva = (dmv < 0) ? -dmv : dmv;
j = 1;
while (dmva >>= 1)
j ++;
cBS.PutBits(wc[j], wl[j]);
if (dmv < 0)
dmv += (1 << j) - 1;
cBS.PutBits(dmv, j);
}
cBS.PutMarkerBit();
}
}
if (VOL.sprite_brightness_change) {
Ipp32s i, j;
j = VOP.brightness_change_factor;
if (j < 0)
j = -j;
if (j <= 16) {
j += (VOP.brightness_change_factor < 0) ? 16 : 15;
i = 6;
} else if (j <= 48) {
j += (VOP.brightness_change_factor < 0) ? 48 + 128 : 15 + 128;
i = 8;
} else if (j <= 112) {
j += (VOP.brightness_change_factor < 0) ? 112 + 768 : 15 + 768;
i = 10;
} else if (j <= 624) {
j -= 113 - 7168;
i = 13;
} else {
j -= 625 - 15360;
i = 14;
}
cBS.PutBits(j, i);
}
if (VOL.sprite_enable == MP4_SPRITE_STATIC)
return;
}
if (VOL.video_object_layer_shape != MP4_SHAPE_TYPE_BINARYONLY) {
cBS.PutBits(VOP.vop_quant, VOL.quant_precision);
//f if (VOL.video_object_layer_shape == MP4_SHAPE_TYPE_GRAYSCALE)
//f for(i=0; i<aux_comp_count; i++)
//f vop_alpha_quant[i] 6 uimsbf
if (VOP.vop_coding_type != MP4_VOP_TYPE_I)
cBS.PutBits(VOP.vop_fcode_forward, 3);
if (VOP.vop_coding_type == MP4_VOP_TYPE_B)
cBS.PutBits(VOP.vop_fcode_backward, 3);
if (!VOL.scalability) {
if (VOL.video_object_layer_shape != MP4_SHAPE_TYPE_RECTANGULAR && VOP.vop_coding_type != MP4_VOP_TYPE_I)
cBS.PutBits(VOP.vop_shape_coding_type, 1);
} else {
//f scalability
}
}
}
void ippVideoEncoderMPEG4::EncodeVOPSH_Header()
{
cBS.PutBits(32, 22);
cBS.PutBits(VOP.temporal_reference, 8);
cBS.PutMarkerBit();
cBS.PutZeroBit();
cBS.PutBits(VOP.split_screen_indicator, 1);
cBS.PutBits(VOP.document_camera_indicator, 1);
cBS.PutBits(VOP.full_picture_freeze_release, 1);
cBS.PutBits(VOP.source_format, 3);
cBS.PutBits(VOP.picture_coding_type, 1);
cBS.PutBits(0, 4);
cBS.PutBits(VOP.vop_quant, 5);
cBS.PutZeroBit();
cBS.PutZeroBit(); //f pei
}
Ipp32s ippVideoEncoderMPEG4::EncodeHeader()
{
if (!mIsInit)
return MP4_STS_ERR_NOTINIT;
if (!VOL.short_video_header) {
Ipp8u *sPtr = cBS.GetBitPtr();
EncodeVOS_Header();
EncodeVO_Header();
EncodeVOL_Header();
//mBitsEncodedTotal += (cBS.GetBitPtr() - sPtr) << 3;
}
return MP4_STS_NOERR;
}
} // namespace MPEG4_ENC
#endif //defined (UMC_ENABLE_MPEG4_VIDEO_ENCODER)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -