📄 mp4esynt.c
字号:
/******************************************************************************
// INTEL CORPORATION PROPRIETARY INFORMATION
// This software is supplied under the terms of a license agreement or
// nondisclosure agreement with Intel Corporation and may not be copied
// or disclosed except in accordance with the terms of that agreement.
// Copyright (c) 2003 Intel Corporation. All Rights Reserved.
//
// Description: Stream syntax generation functions of MPEG-4 video encoder
// sample code for Intel(R) Integrated Performance Primitives.
// Functions List:
// create_voandvol_header_mpeg4()
// create_vop_header_mpeg4()
// create_mb_mpeg4()
******************************************************************************/
#include "sampmp4.h"
/******************************************************************************
// Name: create_voandvol_header_mpeg4
// Description: Create visual object and visual object layer header in
// bitstream
// Input Arguments:
// enc_state - Pointer to the general state structure of MPEG-4 encoder
//
// Output Arguments:
// stream_buf - Pointer to the updated output video stream after the VO
// and VOL header is generated
// enc_state - Pointer to the updated general state structure of MPEG-4
// encoder
//
// Returns:
// SAMPLE_STATUS_NOERR If succeeds
//
******************************************************************************/
sample_status create_voandvol_header_mpeg4(sample_bitstream *stream_buf,
mp4_enc_state *enc_state)
{
Ipp32u code;
/* video_object_start_code */
code = MPEG4_VOSC | 0x01;
put_bits_mpeg4(stream_buf, code, 32);
enc_state->short_head = 0;
/* video_object_layer_start_code */
code = MPEG4_VOLSC | 0x0;
put_bits_mpeg4(stream_buf, code, 32);
/* random_accessible_vol */
code = 0;
put_bits_mpeg4(stream_buf, code , 1);
/* video_object_type_indication */
code = 4; /* Main Object Type */
put_bits_mpeg4(stream_buf, code, 8);
if (2 == enc_state->vol_verid) {
/* is_object_layer_identifier */
code = 1;
put_bits_mpeg4(stream_buf, code, 1);
/* video_object_layer_verid */
code = enc_state->vol_verid;
put_bits_mpeg4(stream_buf, code, 4);
/* video_object_layer_priority */
code = 1; /* highest priority */
put_bits_mpeg4(stream_buf, code, 3);
} else {
/* is_object_layer_identifier */
code = 0;
put_bits_mpeg4(stream_buf, code, 1);
}
/* aspect_ratio_info */
code = 1; /* 1:1 (square) */
put_bits_mpeg4(stream_buf, code, 4);
/* vol_control_parameters */
code = 0;
put_bits_mpeg4(stream_buf, code, 1);
/* video_object_layer_shape */
code = enc_state->vol_shape_type;
put_bits_mpeg4(stream_buf, code, 2);
/* marker_bit */
INSERT_MARKER_BIT(stream_buf);
/* vop_time_increment_resolution */
code = enc_state->frame_rate;
put_bits_mpeg4(stream_buf, code, 16);
enc_state->numbits_time_incr = 1;
if (1 < code) {
code -= 1;
while (1 < code) {
code = code >> 1;
enc_state->numbits_time_incr ++;
}
}
/* marker_bit */
INSERT_MARKER_BIT(stream_buf);
/* fixed_vop_rate */
code = 0;
put_bits_mpeg4(stream_buf, code, 1);
if (BINARYONLY != enc_state->vol_shape_type) {
if (RECTANGULAR == enc_state->vol_shape_type) {
/* marker_bit */
INSERT_MARKER_BIT(stream_buf);
/* video_object_layer_width */
code = enc_state->vol_display_width;
put_bits_mpeg4(stream_buf, code, 13);
/* marker_bit */
INSERT_MARKER_BIT(stream_buf);
/* video_object_layer_height */
code = enc_state->vol_display_height;
put_bits_mpeg4(stream_buf, code, 13);
/* marker_bit */
INSERT_MARKER_BIT(stream_buf);
}
/* interlaced */
code = 0;
put_bits_mpeg4(stream_buf, code, 1);
/* obmc_disable */
code = enc_state->obmc_disabled;
put_bits_mpeg4(stream_buf, code, 1);
code = enc_state->sprite_type;
if (1 == enc_state->vol_verid) {
put_bits_mpeg4(stream_buf, code, 1);
} else {
put_bits_mpeg4(stream_buf, code, 2);
}
if (enc_state->sprite_type) {
/* add extra source codes if sprite_enable == "static" || "GMC" */
}
if ((1 != enc_state->vol_verid) && (RECTANGULAR
!= enc_state->vol_shape_type)) {
/* sadct_disable */
code = enc_state->sadct_disabled;
put_bits_mpeg4(stream_buf, code, 1);
}
/* not_8_bit */
code = 0;
put_bits_mpeg4(stream_buf, code, 1);
if (code) {
/* add extra source codes if not 8 bits per pixel */
}
if (GRAYSCALE == enc_state->vol_shape_type) {
/* add extra source codes if vol_shape_type == "grayscale" */
}
/* quant_type */
code = enc_state->quant_type;
put_bits_mpeg4(stream_buf, code, 1);
if (Q_MPEG4 == enc_state->quant_type) {
/* load_intra_quant_mat */
code = 0; /* use default intra_quant_mat */
put_bits_mpeg4(stream_buf, code, 1);
/* load_nonintra_quant_mat */
code = 0; /* use default nonintra_quant_mat */
put_bits_mpeg4(stream_buf, code, 1);
if (GRAYSCALE == enc_state->vol_shape_type) {
/* add extra source codes if vol_shape_type == "grayscale" */
}
}
if (1 != enc_state->vol_verid) {
/* quater_sample */
code = enc_state->quater_sample;
put_bits_mpeg4(stream_buf, code, 1);
}
/* complexity_estimation_disable */
code = enc_state->complex_est_disable;
put_bits_mpeg4(stream_buf, code, 1);
/* resync_marker_disable */
code = enc_state->resync_disabled;
put_bits_mpeg4(stream_buf, code, 1);
/* data_partitioned */
code = enc_state->data_patitioned;
put_bits_mpeg4(stream_buf, code, 1);
if (enc_state->data_patitioned) {
/* add extra source codes if data_partitioned == 1 */
}
if (1 != enc_state->vol_verid) {
/* newpred_enable */
code = enc_state->new_pred;
put_bits_mpeg4(stream_buf, code, 1);
if (enc_state->new_pred) {
/* add extra source codes if newpred_enable == 1 */
}
/* reduced_resolution_vop_enable */
code = enc_state->reduced_resolution;
put_bits_mpeg4(stream_buf, code, 1);
}
/* scalability */
code = enc_state->scalable;
put_bits_mpeg4(stream_buf, code, 1);
if (enc_state->scalable) {
/* add extra source codes if scalability == 1 */
}
} else {
/* add extra source code if video_object_shape_type == "binary only" */
}
/* fill stuffing bits */
if (stream_buf->bs_cur_bitoffset) {
stream_buf->bs_cur_byte[0] |=
bits_stuf_tbl[7 - stream_buf->bs_cur_bitoffset];
stream_buf->bs_cur_bitoffset = 0;
stream_buf->bs_cur_byte++;
}
return SAMPLE_STATUS_NOERR;
}
/******************************************************************************
// Name: create_vop_header_mpeg4
// Description: Create video object plane header in bitstream
// Input Arguments:
// enc_state - Pointer to the general state struct of MPEG-4 encoder
// vop_infor - Pointer to the vop information struct
//
// Output Arguments:
// stream_buf - Pointer to the updated output video stream after the VOP
// header is generated
// enc_state - Pointer to the updated general state struct of MPEG-4
// encoder
// vop_infor - Pointer to the updated vop information struct
//
// Returns:
// SAMPLE_STATUS_NOERR If succeeds
******************************************************************************/
sample_status create_vop_header_mpeg4 (sample_bitstream *stream_buf,
mp4_enc_state *enc_state,
mp4_enc_vop_infor *vop_infor)
{
Ipp32u code;
int cur_sec, modulo_frame, modulo_time_base;
/* 32 bit vop_start_code */
code = (MPEG4_PREFIX_SC << 8) | (MPEG4_SUFFIX_VOPSC);
put_bits_mpeg4(stream_buf, code, 32);
/* 2 bit vop_coding_type */
code = enc_state->vop_coding_type;
put_bits_mpeg4(stream_buf, code, 2);
/* modulo_time_base */
cur_sec = 0;
modulo_frame = enc_state->vop_indx;
while (modulo_frame >= enc_state->frame_rate) {
modulo_frame -= enc_state->frame_rate;
cur_sec ++;
}
modulo_time_base = cur_sec - enc_state->modulo_base_decd;
while (modulo_time_base--) {
put_bits_mpeg4(stream_buf, 1, 1);
}
put_bits_mpeg4(stream_buf, 0, 1);
enc_state->modulo_base_disp = enc_state->modulo_base_decd;
enc_state->modulo_base_decd = cur_sec;
/* marker_bit */
INSERT_MARKER_BIT(stream_buf);
/* vop_time_increment */
code = modulo_frame;
put_bits_mpeg4(stream_buf, code, enc_state->numbits_time_incr);
/* marker_bit */
INSERT_MARKER_BIT(stream_buf);
/* 1 bit vop_coded */
code = enc_state->vop_coded;
put_bits_mpeg4(stream_buf, code, 1);
if (0 == code) {
return SAMPLE_STATUS_NOERR;
}
/* 1 bit vop_rounding_type */
/* video_object_layer_shape can't be "binary only" and vop_coding_type
// can't be "SVOP" */
if (PVOP == enc_state->vop_coding_type) {
code = enc_state->rounding;
put_bits_mpeg4(stream_buf, code, 1);
}
if (BINARYONLY != enc_state->vol_shape_type) {
/* 3 bit intra_dc_vlc_thr */
code = enc_state->intra_dc_thr;
put_bits_mpeg4(stream_buf, code, 3);
}
if (BINARYONLY != enc_state->vol_shape_type) {
/* 5 bit vop_quant if not_8_bit is zero */
code = vop_infor->cur_qp;
put_bits_mpeg4(stream_buf, code, 5);
if (IVOP != enc_state->vop_coding_type) {
/* 3 bit vop_fcode_forward */
code = vop_infor->fcode_fwd;
put_bits_mpeg4(stream_buf, code, 3);
}
}
return SAMPLE_STATUS_NOERR;
}
/******************************************************************************
// Name: create_mb_mpeg4
// Description: Create the MB header in bitstream
// Input Arguments:
// vop_infor - Pointer to the vop information struct
//
// Output Arguments:
// stream_buf - Pointer to the updated output video stream after the MB
// header is generated
// vop_infor - Pointer to the updated vop information struct
//
// Returns:
// SAMPLE_STATUS_NOERR If succeeds
// SAMPLE_STATUS_ERR If stream parsing error occurs
******************************************************************************/
sample_status create_mb_mpeg4(sample_bitstream *stream_buf,
mp4_enc_state *enc_state,
mp4_enc_vop_infor *vop_infor)
{
Ipp32u code = 0;
int size = 0, dquant = 0;
if (BINARYONLY != enc_state->vol_shape_type) {
/* RECTANGULAR shape only */
if (IVOP != enc_state->vop_coding_type) {
/* 1 bit not_coded */
code = vop_infor->mb_not_coded;
put_bits_mpeg4(stream_buf, code, 1);
}
if ((IVOP == enc_state->vop_coding_type) || (!vop_infor->mb_not_coded))
{
/* mcbpc */
if (IVOP == enc_state->vop_coding_type) {
code = vlc_mcbpc_ivop_tbl[(vop_infor->mb_type - 3) * 4
+ vop_infor->cbpc].value;
size = vlc_mcbpc_ivop_tbl[(vop_infor->mb_type - 3) * 4
+ vop_infor->cbpc].numbit;
put_bits_mpeg4(stream_buf, code, size);
} else {
code = vlc_mcbpc_pvop_tbl[vop_infor->mb_type * 4
+ vop_infor->cbpc].value;
size = vlc_mcbpc_pvop_tbl[vop_infor->mb_type * 4
+ vop_infor->cbpc].numbit;
put_bits_mpeg4(stream_buf, code, size);
}
if ((IPP_VIDEO_INTRA == vop_infor->mb_type) || (IPP_VIDEO_INTRA_Q
== vop_infor->mb_type)) {
/* 1 bit ac_pred_flag */
code = vop_infor->ac_pred_flag;
size = 1;
put_bits_mpeg4(stream_buf, code, size);
/* cbpy */
/* four non_tranparent blocks in each macroblock */
code = vlc_cbpy_tbl[vop_infor->cbpy].value;
size = vlc_cbpy_tbl[vop_infor->cbpy].numbit;
put_bits_mpeg4(stream_buf, code, size);
} else {
/* cbpy */
/* four non_tranparent blocks in each macroblock */
code = vlc_cbpy_tbl[15 - vop_infor->cbpy].value;
size = vlc_cbpy_tbl[15 - vop_infor->cbpy].numbit;
put_bits_mpeg4(stream_buf, code, size);
}
if ((IPP_VIDEO_INTER_Q == vop_infor->mb_type)
|| (IPP_VIDEO_INTRA_Q == vop_infor->mb_type)) {
/* 2 bit dquant */
dquant = vop_infor->delta_qp;
if (dquant) {
if (0 < dquant) {
code = 1 + dquant;
} else {
code = -1 - dquant;
}
}
size = 2;
put_bits_mpeg4(stream_buf, code, size);
}
}
}
return SAMPLE_STATUS_NOERR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -