📄 mp4dpars.c
字号:
// 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_SYNCNOTFOUND_ERR If cannot find sync code// SAMPLE_STATUS_NOTSUPPORTED_ERR If stream syntax is not supported by// current sample decoder******************************************************************************/sample_status parse_voandvol_header_mpeg4(sample_bitstream *stream_buf, mp4_dec_state *dec_state){ Ipp8u *buf_border = stream_buf->bs_buffer + stream_buf->bs_bytelen; Ipp32u code = 0; int i, j; /* read 32 bit video_object_start_code / 22 bit picture_start_code // sync code */ code = get_bits_mpeg4(stream_buf, 32); /* loop to find video_object_start_code / picture_start_code sync code */ while ((MPEG4_VOSC != (code & 0xFFFFFFE0)) && (MPEG4_H263_PSC != (code >> 10)) && (stream_buf->bs_cur_byte < buf_border)) { code = (code << 8) | get_bits_mpeg4(stream_buf, 8); } /* short header */ if (MPEG4_H263_PSC == (code >> 10)) { dec_state->short_head = 1; stream_buf->bs_cur_byte -= 4; return SAMPLE_STATUS_NOTSUPPORTED_ERR; } /* sync code not found */ else if (MPEG4_VOSC != (code & 0xFFFFFFE0)) { printf ("Error: Not find visual object sync code!\n"); return SAMPLE_STATUS_SYNCNOTFOUND_ERR; } dec_state->short_head = 0; /* read 32 bit video_object_layer_start_code sync code */ code = get_bits_mpeg4(stream_buf, 32); if (MPEG4_VOLSC != (code & 0xFFFFFFF0)) { printf ("Error: Not find video object layer sync code!\n"); return SAMPLE_STATUS_SYNCNOTFOUND_ERR; } /* 1 bit random_accessible_vol */ code = get_bits_mpeg4(stream_buf, 1); /* 8 bit video_object_type_indication */ dec_state->vol_typeid = (int)get_bits_mpeg4(stream_buf, 8); /* 1 bit is_object_layer_identifier */ code = get_bits_mpeg4(stream_buf, 1); if (code) { /* 4 bit video_object_layer_verid */ dec_state->vol_verid = (int)get_bits_mpeg4(stream_buf, 4); /* 3 bit video_object_layer_priority */ dec_state->vol_prior = (int)get_bits_mpeg4(stream_buf, 3); } else { dec_state->vol_verid = 1; } /* 4 bit aspect_ratio_info */ code = get_bits_mpeg4(stream_buf, 4); /* aspect_ratio_info == "extended PAR" */ if (15 == code) { /* 8 bit par_width */ code = get_bits_mpeg4(stream_buf, 8); /* 8 bit par_height */ code = get_bits_mpeg4(stream_buf, 8); } /* 1 bit vol_control_parameters */ dec_state->vol_control_para = get_bits_mpeg4(stream_buf, 1); if (dec_state->vol_control_para) { /* 2 bit chroma_format */ dec_state->chroma_fmt = get_bits_mpeg4(stream_buf, 2); /* chroma_format != YUV 4:2:0 */ if (1 != dec_state->chroma_fmt) { return SAMPLE_STATUS_NOTSUPPORTED_ERR; } /* 1 bit low_delay */ dec_state->low_delay = get_bits_mpeg4(stream_buf, 1); /* 1 bit vbv_parameters */ code = get_bits_mpeg4(stream_buf, 1); if (code) { /* 15 bit first_half_bit_rate */ dec_state->bit_rate = get_bits_mpeg4(stream_buf, 15); /* marker bit */ ASSERT_MARKER_BIT(stream_buf); /* 15 bit latter_half_bit_rate */ code = get_bits_mpeg4(stream_buf, 15); /* marker bit */ ASSERT_MARKER_BIT(stream_buf); dec_state->bit_rate = (dec_state->bit_rate << 15) + code; if (0 == dec_state->bit_rate) { return SAMPLE_STATUS_ERR; } /* 15 bit first_half_vbv_buffer_size */ dec_state->vbv_buf_size = get_bits_mpeg4(stream_buf, 15); /* marker bit */ ASSERT_MARKER_BIT(stream_buf); /* 3 bit latter_half_vbv_buffer_size */ code = get_bits_mpeg4(stream_buf, 3); dec_state->vbv_buf_size = (dec_state->vbv_buf_size << 3) + code; if (0 == dec_state->vbv_buf_size) { return SAMPLE_STATUS_ERR; } /* 11 bit first_half_vbv_occupancy */ dec_state->vbv_occupancy = get_bits_mpeg4(stream_buf, 11); /* marker bit */ ASSERT_MARKER_BIT(stream_buf); /* 15 bit latter_half_vbv_occupancy */ code = get_bits_mpeg4(stream_buf, 15); /* marker bit */ ASSERT_MARKER_BIT(stream_buf); dec_state->vbv_occupancy = (dec_state->vbv_occupancy << 15) + code; } } /* 2 bit video_object_layer_shape */ dec_state->vol_shape_type = get_bits_mpeg4(stream_buf, 2); /* video_object_layer_shape != "rectangular" */ if (RECTANGULAR != dec_state->vol_shape_type) { return SAMPLE_STATUS_NOTSUPPORTED_ERR; } /* marker bit */ ASSERT_MARKER_BIT(stream_buf); /* 16 bit vop_time_increment_resolution */ dec_state->clock_rate = get_bits_mpeg4(stream_buf, 16); dec_state->numbits_time_incr = 1; code = dec_state->clock_rate; if (1 < code) { code -= 1; while (1 < code) { code = code >> 1; dec_state->numbits_time_incr++; } } /* marker bit */ ASSERT_MARKER_BIT(stream_buf); /* 1 bit fixed_vop_rate */ dec_state->fix_vop_rate = get_bits_mpeg4(stream_buf, 1); if (dec_state->fix_vop_rate) { return SAMPLE_STATUS_NOTSUPPORTED_ERR; } /* marker bit */ ASSERT_MARKER_BIT(stream_buf); /* 13 bit video_object_layer_width */ dec_state->vol_display_width = get_bits_mpeg4(stream_buf, MPEG4_NUMBITS_VOP_WIDTH); /* marker bit */ ASSERT_MARKER_BIT(stream_buf); /* 13 bit video_object_layer_height */ dec_state->vol_display_height = get_bits_mpeg4(stream_buf, MPEG4_NUMBITS_VOP_HEIGHT); /* marker bit */ ASSERT_MARKER_BIT(stream_buf); /* 1 bit interlaced */ dec_state->interlaced = get_bits_mpeg4(stream_buf, 1); if (1 == dec_state->interlaced) { return SAMPLE_STATUS_NOTSUPPORTED_ERR; } /* 1 bit obmc_disable */ dec_state->obmc_disabled = get_bits_mpeg4(stream_buf, 1); if (0 == dec_state->obmc_disabled) { return SAMPLE_STATUS_NOTSUPPORTED_ERR; } /* 1 or 2 bit sprite_enable */ if(1 == dec_state->vol_verid) { dec_state->sprite_type = get_bits_mpeg4(stream_buf, 1); } else { dec_state->sprite_type = get_bits_mpeg4(stream_buf, 2); } if (dec_state->sprite_type != 0) { return SAMPLE_STATUS_NOTSUPPORTED_ERR; } /* sadct_disable */ dec_state->sadct_disabled = TRUE; /* 1 bit not_8_bit */ code = get_bits_mpeg4(stream_buf, 1); if (1 == code) { return SAMPLE_STATUS_NOTSUPPORTED_ERR; } /* 1 bit quant_type */ dec_state->quant_type = get_bits_mpeg4(stream_buf, 1); if (Q_MPEG4 == dec_state->quant_type) { /* 1 bit load_intra_quant_mat */ code = get_bits_mpeg4(stream_buf, 1); if (code) { /* intra_quant_mat: 8*[2-64] bits */ for (i = 0; i < SAMPLE_VIDEO_BLOCK_SQUARE_SIZE; i++) { code = get_bits_mpeg4(stream_buf, MPEG4_NUMBITS_QMATRIX); if (0 != code) { dec_state->qmatrix_intra_tbl[classic_zigzag_tbl[i]] = (Ipp8u)code; } else { break; } } for (j = i; j < SAMPLE_VIDEO_BLOCK_SQUARE_SIZE; j++) { dec_state->qmatrix_intra_tbl[classic_zigzag_tbl[j]] = dec_state->qmatrix_intra_tbl[classic_zigzag_tbl[i-1]]; } dec_state->qmatrix_intra = dec_state->qmatrix_intra_tbl; } else { dec_state->qmatrix_intra = default_qmat_intra_tbl; } /* 1 bit load_nonintra_quant_mat */ code = get_bits_mpeg4(stream_buf, 1); if (code) { /* nonintra_quant_mat: 8*[2-64] bits */ for (i = 0; i < SAMPLE_VIDEO_BLOCK_SQUARE_SIZE; i++) { code = get_bits_mpeg4(stream_buf, MPEG4_NUMBITS_QMATRIX); if (0 != code) { dec_state->qmatrix_inter_tbl[classic_zigzag_tbl[i]] = (Ipp8u)code; } else { break; } } for (j = i; j < SAMPLE_VIDEO_BLOCK_SQUARE_SIZE; j++) { dec_state->qmatrix_inter_tbl[classic_zigzag_tbl[j]] = dec_state->qmatrix_inter_tbl[classic_zigzag_tbl[i-1]]; } dec_state->qmatrix_inter = dec_state->qmatrix_inter_tbl; } else { dec_state->qmatrix_inter = default_qmat_inter_tbl; } } else { dec_state->qmatrix_intra = NULL; dec_state->qmatrix_inter = NULL; } /* 1 bit quarter_sample */ if (1 != dec_state->vol_verid) { dec_state->quater_sample = get_bits_mpeg4(stream_buf, 1); } else { dec_state->quater_sample = 0; } /* 1 bit complexity_estimation_disable */ dec_state->complex_est_disable = get_bits_mpeg4(stream_buf, 1); if (0 == dec_state->complex_est_disable) { return SAMPLE_STATUS_NOTSUPPORTED_ERR; } /* 1 bit resync_marker_disable */ dec_state->resync_disabled = get_bits_mpeg4(stream_buf, 1); if (0 == dec_state->resync_disabled) { return SAMPLE_STATUS_NOTSUPPORTED_ERR; } /* 1 bit data_partitioned */ dec_state->data_patitioned = get_bits_mpeg4(stream_buf, 1); if (1 == dec_state->data_patitioned) { return SAMPLE_STATUS_NOTSUPPORTED_ERR; } if (1 != dec_state->vol_verid) { /* 1 bit newpred_enable */ dec_state->new_pred = get_bits_mpeg4(stream_buf, 1); if (dec_state->new_pred) { return SAMPLE_STATUS_NOTSUPPORTED_ERR; } /* 1 bit reduced_resolution_vop_enable */ dec_state->reduced_resolution = get_bits_mpeg4(stream_buf, 1); if (dec_state->reduced_resolution) { return SAMPLE_STATUS_NOTSUPPORTED_ERR; } } else { dec_state->new_pred = 0; dec_state->reduced_resolution = 0; } /* 1 bit scalability */ dec_state->scalable = get_bits_mpeg4(stream_buf, 1); if (dec_state->scalable) { return SAMPLE_STATUS_NOTSUPPORTED_ERR; } return SAMPLE_STATUS_NOERR;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -