📄 mp4dpars.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 parsing functions of MPEG-4 video decoder
// sample code for Intel(R) Integrated Performance Primitives.
// Functions List:
// parse_mb_mpeg4()
// parse_gov_mpeg4()
// parse_vop_header_mpeg4()
// parse_voandvol_header_mpeg4()
******************************************************************************/
#include "sampmp4.h"
/******************************************************************************
// Name: parse_mb_mpeg4
// Description: parsing the MB header which is stored in the vop_infor
// Input Arguments:
// stream_buf - Pointer to the source compressed video bitstream
// vop_infor - Pointer to the vop information struct
// vop_type - Current vop coding type
//
// Output Arguments:
// stream_buf - Pointer to the updated source video stream after the MB
// header is decoded
// 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 parse_mb_mpeg4
(sample_bitstream *stream_buf, mp4_dec_vop_infor *vop_infor, int vop_type)
{
Ipp32u code = 0;
int dquant = 0;
int vlc_end = 0;
const mp4_tree_node *cur_node = NULL;
vop_infor->cbpy = 0;
vop_infor->cbpc = 0;
/* PVOP */
if (IVOP != vop_type) {
/* 1 bit not_coded */
vop_infor->mb_not_coded = get_bits_mpeg4(stream_buf, 1);
if (vop_infor->mb_not_coded) {
vop_infor->mb_type = IPP_VIDEO_INTER;
return SAMPLE_STATUS_NOERR;
}
/* mcbpc vlc: B.1.2, Table B-7, ISO/IEC 14496-2:2001(E) */
cur_node = mcbpc_pvop_vlc_tbl;
do {
code = get_bits_mpeg4(stream_buf, 1);
if (0 == code) {
if (0 == cur_node->c0_end) {
cur_node = cur_node->next0_node_symbol + mcbpc_pvop_vlc_tbl;
} else {
vop_infor->cbpc = (cur_node->next0_node_symbol) & 0x3;
vop_infor->mb_type = (cur_node->next0_node_symbol) >> 2;
vlc_end = 1;
}
} else {
if (0 == cur_node->c1_end) {
cur_node = cur_node->next1_node_symbol + mcbpc_pvop_vlc_tbl;
} else {
vop_infor->cbpc = (cur_node->next1_node_symbol) & 0x3;
vop_infor->mb_type = (cur_node->next1_node_symbol) >> 2;
vlc_end = 1;
}
}
} while (!vlc_end);
} else { /* IVOP */
/* mcbpc vlc: B.1.2, Table B-6, ISO/IEC 14496-2:2001(E) */
do {
/* prefetch 9 bits */
code = get_bits_mpeg4(stream_buf, 9);
if (64 <= code) {
vop_infor->mb_type = IPP_VIDEO_INTRA;
vop_infor->cbpc = code >> 6;
if (4 <= vop_infor->cbpc) {
vop_infor->cbpc = 0;
rewind_buffer_mpeg4(stream_buf, 8);
} else {
rewind_buffer_mpeg4(stream_buf, 6);
}
} else {
if (1 == code) {
vop_infor->mb_type = MPEG4_MB_STUFF;
} else {
vop_infor->mb_type = IPP_VIDEO_INTRA_Q;
vop_infor->cbpc = code >> 3;
if (4 <= vop_infor->cbpc) {
vop_infor->cbpc = 0;
rewind_buffer_mpeg4(stream_buf, 5);
} else {
rewind_buffer_mpeg4(stream_buf, 3);
}
}
}
} while (MPEG4_MB_STUFF == vop_infor->mb_type);
}
/* 1 bit ac_pred_flag */
if ((IPP_VIDEO_INTRA == vop_infor->mb_type) ||
(IPP_VIDEO_INTRA_Q == vop_infor->mb_type)) {
vop_infor->ac_pred_flag = get_bits_mpeg4(stream_buf, 1);
}
/* cbpy vlc: B.1.2, Table B-8, ISO/IEC 14496-2:2001(E) */
/* prefetch 4 bits */
code = get_bits_mpeg4(stream_buf, 4);
if ((12 > code) && (2 < code)) {
vop_infor->cbpy = cbpy4_intra_tbl[code];
} else if (12 <= code) {
vop_infor->cbpy = cbpy4_intra_tbl[12];
rewind_buffer_mpeg4(stream_buf, 2);
} else if (2 == code) {
code = get_bits_mpeg4(stream_buf, 1);
vop_infor->cbpy = 2 - code;
} else if (1 == code) {
code = get_bits_mpeg4(stream_buf, 1);
vop_infor->cbpy = 8 >> code;
} else {
code = get_bits_mpeg4(stream_buf, 2);
if (2 > code) {
return SAMPLE_STATUS_ERR;
} else {
vop_infor->cbpy = 3 * code;
}
}
/* inter-MB */
if ((IPP_VIDEO_INTRA != vop_infor->mb_type) &&
(IPP_VIDEO_INTRA_Q != vop_infor->mb_type)) {
vop_infor->cbpy = 15 - vop_infor->cbpy;
}
/* dquant */
if ((IPP_VIDEO_INTER_Q == vop_infor->mb_type) ||
(IPP_VIDEO_INTRA_Q == vop_infor->mb_type))
{
/* Get 2 bit dquant in intra_Q or inter_Q type */
dquant = (int)get_bits_mpeg4(stream_buf, 2);
if (2 <= dquant) {
dquant = - 1 + dquant;
} else {
dquant = - 1 - dquant;
}
code = vop_infor->cur_qp + dquant;
CLIP_VIDEO_I(code, 1, 31);
vop_infor->cur_qp = (Ipp8u)code;
}
return SAMPLE_STATUS_NOERR;
}
/******************************************************************************
// Name: parse_gov_mpeg4
// Description: Parse group of video object plane from bitstream
// Input Arguments:
// stream_buf - Pointer to the source compressed video bitstream
// dec_state - Pointer to the general state structure of MPEG-4 decoder
//
// Output Arguments:
// stream_buf - Pointer to the updated source video stream after the VO
// and VOL header is decoded
// dec_state - Pointer to the updated general state structure of MPEG-4
// decoder
//
// Returns:
// SAMPLE_STATUS_NOERR If succeeds
// SAMPLE_STATUS_ERR If stream parsing error occurs
******************************************************************************/
sample_status parse_gov_mpeg4
(sample_bitstream *stream_buf, mp4_dec_state *dec_state)
{
/* 5 bit time_code_hours */
dec_state->hour = get_bits_mpeg4(stream_buf, 5);
/* 6 bit time_code_minutes */
dec_state->minute = get_bits_mpeg4(stream_buf, 6);
/* marker_bit */
ASSERT_MARKER_BIT(stream_buf);
/* 6 bit time_code_seconds */
dec_state->second = get_bits_mpeg4(stream_buf, 6);
dec_state->modulo_base_disp = dec_state->hour * 3600
+ dec_state->minute * 60 + dec_state->second;
dec_state->modulo_base_decd = dec_state->modulo_base_disp;
/* 1 bit closed_gov */
dec_state->closed_gov = get_bits_mpeg4(stream_buf, 1);
/* 1 bit broken_link */
dec_state->broken_link = get_bits_mpeg4(stream_buf, 1);
return SAMPLE_STATUS_NOERR;
}
/******************************************************************************
// Name: parse_vop_header_mpeg4
// Description: Parse video object plane header from bitstream
// Input Arguments:
// stream_buf - Pointer to the source compressed video bitstream
// dec_state - Pointer to the general state struct of MPEG-4 decoder
// vop_infor - Pointer to the vop information struct
//
// Output Arguments:
// stream_buf - Pointer to the updated source video stream after the VOP
// header is decoded
// dec_state - Pointer to the updated general state struct of MPEG-4
// decoder
// 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_NOTSUPPORTED_ERR If stream syntax is not supported by
// current sample decoder
******************************************************************************/
sample_status parse_vop_header_mpeg4
(sample_bitstream *stream_buf, mp4_dec_state *dec_state,
mp4_dec_vop_infor *vop_infor)
{
Ipp32u code;
int modulo_inc, delta_base, cur_time_sec;
/* 2 bit vop_coding_type */
dec_state->vop_coding_type = get_bits_mpeg4(stream_buf, 2);
if ((IVOP != dec_state->vop_coding_type) && (PVOP
!= dec_state->vop_coding_type)) {
return SAMPLE_STATUS_NOTSUPPORTED_ERR;
}
/* modulo_time_base */
modulo_inc = 0;
do {
code = get_bits_mpeg4(stream_buf, 1);
if (code) {
modulo_inc++;
}
} while (0 != code);
delta_base = dec_state->modulo_base_decd;
cur_time_sec = modulo_inc + delta_base;
/* marker_bit */
ASSERT_MARKER_BIT(stream_buf);
/* numbits_time_incr bit vop_time_increment */
vop_infor->vop_time_inc = get_bits_mpeg4(stream_buf,
dec_state->numbits_time_incr);
dec_state->modulo_base_disp = dec_state->modulo_base_decd;
dec_state->modulo_base_decd = cur_time_sec;
dec_state->cur_frame_no = cur_time_sec * dec_state->clock_rate +
vop_infor->vop_time_inc;
/* marker_bit */
ASSERT_MARKER_BIT(stream_buf);
/* 1 bit vop_coded */
dec_state->vop_coded = get_bits_mpeg4(stream_buf, 1);
if (0 == dec_state->vop_coded) {
return SAMPLE_STATUS_NOERR;
}
/* 1 bit vop_rounding_type */
if (PVOP == dec_state->vop_coding_type) {
dec_state->rounding = get_bits_mpeg4(stream_buf, 1);
} else {
dec_state->rounding = 0;
}
/* 3 bit intra_dc_vlc_thr */
dec_state->intra_dc_thr = get_bits_mpeg4(stream_buf, 3);
/* 5 bit vop_quant */
/* not_8_bit is not supported, so the quant_precision is always 5 */
dec_state->vop_quant = (Ipp8u)get_bits_mpeg4(stream_buf, 5);
/* 3 bit vop_fcode_forward */
if (IVOP == dec_state->vop_coding_type) {
vop_infor->fcode_fwd = 1;
} else {
vop_infor->fcode_fwd = get_bits_mpeg4(stream_buf, 3);
}
/* turns into motion_shape_texture() */
return SAMPLE_STATUS_NOERR;
}
/******************************************************************************
// Name: parse_voandvol_header_mpeg4
// Description: Parse visual object and visual object layer header from
// bitstream
// Input Arguments:
// stream_buf - Pointer to the source compressed video bitstream
// dec_state - Pointer to the general state structure of MPEG-4 decoder
//
// Output Arguments:
// stream_buf - Pointer to the updated source video stream after the VO
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -