⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mp4dpars.c

📁 Intel提供的在Sitsang等嵌入式开发平台上使用Linux操作系统
💻 C
📖 第 1 页 / 共 2 页
字号:
//                    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 + -