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

📄 mp4emblk.c

📁 Intel提供的在PCA(例如Sitsang开发板)使用IPP4.0库的MPEG-4编码源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    }       /* 3. computer the texture error of luminance and chrominance blocks */    /* src reference block after motion compensation */    refer_blk = enc_state->blk_ref_buf;    /* dst texture residuals of current inter macro block */    resid_blk = enc_state->resid_buf;    sad[0] = sad[1] = sad[2] = sad[3] = sad[4] = sad[5] = 0;        for (blk_indx = Y_BLOCK1; blk_indx <= V_BLOCK; blk_indx++) {                switch (blk_indx) {        case U_BLOCK:            src_blk = vop_infor->cur_mb.cb_ptr;            step = u_step;            break;        case V_BLOCK:            src_blk = vop_infor->cur_mb.cr_ptr;            step = v_step;            break;        default:            src_blk = vop_infor->cur_mb.y_ptr + (blk_indx & 1) * 8                + (blk_indx >> 1) * y_step * 8;            step = y_step;        }                /* compute texture error residuals of the block */        /* src_blk, refer_blk and resid_blk must be 8 byte aligned */        ret_code = ippiComputeTextureErrorBlock_SAD_8u16s (            src_blk,            step,            refer_blk,            resid_blk,            &(sad[blk_indx]));        if (ippStsNoErr != ret_code) {            return ret_code;        }        refer_blk += SAMPLE_VIDEO_BLOCK_SQUARE_SIZE;        resid_blk += SAMPLE_VIDEO_BLOCK_SQUARE_SIZE;     }        if(Q_H263 == enc_state->quant_type) {        for(blk_indx = Y_BLOCK1; blk_indx <= V_BLOCK; blk_indx++) {            if(sad[blk_indx] < MPEG4_ENCODE_THRESHOLD_Q_H263 * vop_infor->cur_qp) {                sad[blk_indx] = 0;            }        }		    } else if(Q_MPEG4 == enc_state->quant_type) {        for(blk_indx = Y_BLOCK1; blk_indx <= V_BLOCK; blk_indx++) {            if(sad[blk_indx] < MPEG4_ENCODE_THRESHOLD_Q_MPEG * vop_infor->cur_qp) {                sad[blk_indx] = 0;            }        }		    }        /* 4. begin the macro block encoding */    /* src texture residuals to be encoded of current inter macro block */    resid_blk	  = enc_state->resid_buf;    /* dst quantized DCT coefficients */    coeff_blk     = enc_state->blk_coef_buf;    /* dst reconstructed texture residuals */    rec_resid_blk = enc_state->rec_resid_buf;            for (blk_indx = Y_BLOCK1; blk_indx <= V_BLOCK; blk_indx++) {        if(sad[blk_indx]) {            ret_code = encode_block_inter_mpeg4(                resid_blk,                rec_resid_blk,                coeff_blk,                vop_infor->cur_qp,                enc_state->qmatrix_inter);            if (ippStsNoErr != ret_code) {                return ret_code;            }        }        resid_blk += SAMPLE_VIDEO_BLOCK_SQUARE_SIZE;        coeff_blk += SAMPLE_VIDEO_BLOCK_SQUARE_SIZE;        rec_resid_blk += SAMPLE_VIDEO_BLOCK_SQUARE_SIZE;    }        /* 5. compute the associated head information */    /* src quantized DCT coefficients */    coeff_blk = enc_state->blk_coef_buf;        /* determine mb_not_coded */    vop_infor->mb_not_coded = 1;    for (blk_indx = Y_BLOCK1; blk_indx <= V_BLOCK; blk_indx++) {                if (Y_BLOCK4 >= blk_indx) {            if (mv_cur_mb[blk_indx].dx || mv_cur_mb[blk_indx].dy) {                vop_infor->mb_not_coded = 0;            }        }                vop_infor->pattern_buf[blk_indx] = FALSE;        if (sad[blk_indx]) {            for (i = 0; i < SAMPLE_VIDEO_BLOCK_SQUARE_SIZE; i++) {                if (coeff_blk[blk_indx * SAMPLE_VIDEO_BLOCK_SQUARE_SIZE + i]) {                    vop_infor->pattern_buf[blk_indx] = TRUE;                    vop_infor->mb_not_coded = 0;                    break;                }            }        }    }    /* determine cbpc */    vop_infor->cbpc = vop_infor->pattern_buf[U_BLOCK] << 1 |        vop_infor->pattern_buf[V_BLOCK];        /* determine cbpy */    /* For RECTANGULAR shape, each macroblock must have four opaque blocks */    vop_infor->num_non_trans_blk = 4;    vop_infor->cbpy = 0;    for (blk_indx = Y_BLOCK1; blk_indx <= Y_BLOCK4; blk_indx++) {        vop_infor->cbpy |= vop_infor->pattern_buf[blk_indx]            << (vop_infor->num_non_trans_blk - 1 - blk_indx);    }    /* 6. Dump out MB level information */    ret_code = create_mb_mpeg4(stream_buf, enc_state, vop_infor);    if (SAMPLE_STATUS_NOERR != ret_code) {        return ret_code;    }        if (!vop_infor->mb_not_coded) {        /* 7. encode and motion vector and texture residuals */        /* encode the motion vector */        mv_left_mb  = mv_cur_mb - 4;        mv_top_mb   = mv_cur_mb - (enc_state->mb_per_row + 2) * 4;        mv_top_right_mb = mv_top_mb + 4;                ret_code = ippiEncodeMV_MPEG4_8u16s(            &stream_buf->bs_cur_byte,            &stream_buf->bs_cur_bitoffset,            mv_cur_mb,            mv_left_mb,            mv_top_mb,            mv_top_right_mb,            transp_cur_mb,            vop_infor->tranp_buf,            vop_infor->tranp_buf + 4,            vop_infor->tranp_buf + 8,            vop_infor->fcode_fwd,            vop_infor->mb_type);        if (ippStsNoErr != ret_code) {            return ret_code;        }                /* zigzag scan and vlc encoding of the texture residuals */        /* src quantized DCT coefficients */        coeff_blk = enc_state->blk_coef_buf;                for (blk_indx = Y_BLOCK1; blk_indx <= V_BLOCK; blk_indx++) {                        ret_code = ippiEncodeVLCZigzag_Inter_MPEG4_16s1u(                &stream_buf->bs_cur_byte,                &stream_buf->bs_cur_bitoffset,                coeff_blk,                vop_infor->pattern_buf[blk_indx]);            if (ippStsNoErr != ret_code) {                return ret_code;            }            coeff_blk += SAMPLE_VIDEO_BLOCK_SQUARE_SIZE;        }                /* 8. reconstruct the texture and store into recon plane */        /* src reference block after motion compensation */        refer_blk     = enc_state->blk_ref_buf;        /* src reconstructed texture residuals */        rec_resid_blk = enc_state->rec_resid_buf;                for (blk_indx = Y_BLOCK1; blk_indx <= V_BLOCK; blk_indx ++) {            switch (blk_indx) {            case U_BLOCK:                dst_blk = vop_infor->rec_mb.cb_ptr;                step = u_step;                break;            case V_BLOCK:                dst_blk = vop_infor->rec_mb.cr_ptr;                step = v_step;                break;            default:                dst_blk = vop_infor->rec_mb.y_ptr + (blk_indx & 1) * 8                    + (blk_indx >> 1) * y_step * 8;                step = y_step;                break;            }                        if(vop_infor->pattern_buf[blk_indx]) {                /* refer_blk, rec_resid_blk, dst_blk must be 8 bytes aligned */                ret_code = ippiReconBlock_8x8(                    refer_blk,                    8,                    rec_resid_blk,                    dst_blk,                    step);                if (ippStsNoErr != ret_code) {                    return ret_code;                }            } else {                /* refer_blk, dst_blk must be 8 bytes aligned */                ret_code = ippiCopyBlock_8x8_8u(                    refer_blk,                    8,                    dst_blk,                    step);                if (ippStsNoErr != ret_code) {                    return ret_code;                }            }            refer_blk += SAMPLE_VIDEO_BLOCK_SQUARE_SIZE;            rec_resid_blk += SAMPLE_VIDEO_BLOCK_SQUARE_SIZE;                    }        } else {        /* 8. reconstruct the texture and store into recon plane */        /* src reference block after motion compensation */        refer_blk = enc_state->blk_ref_buf;        for(blk_indx = Y_BLOCK1; blk_indx <= V_BLOCK; blk_indx++) {            switch (blk_indx) {            case U_BLOCK:                dst_blk = vop_infor->rec_mb.cb_ptr;                step = u_step;                break;            case V_BLOCK:                dst_blk = vop_infor->rec_mb.cr_ptr;                step = v_step;                break;            default:                dst_blk = vop_infor->rec_mb.y_ptr + (blk_indx & 1) * 8                    + (blk_indx >> 1) * y_step * 8;                step = y_step;                break;            }            /* refer_blk, dst_blk must be 8 bytes aligned */            ret_code = ippiCopyBlock_8x8_8u(                refer_blk,                8,                dst_blk,                step);            if (ippStsNoErr != ret_code) {                return ret_code;            }            refer_blk += SAMPLE_VIDEO_BLOCK_SQUARE_SIZE;        }    }        /* update dc/ac prediction coefficient row and column buffer    // take y plane for example:    // coef_buf_row[0] <- dc coefficient of block 3    // coef_buf_row[8] <- dc coefficient of block 2    // coef_buf_col[8] <- dc coefficient of block 4    // the above three dc coefficient values should be set as -1 to imply    // it's an INTER MB, besides that there're still two dc coefficients    // which need to be updated    // coef_buf_row[-8] <- coef_buf_col[8]    // coef_buf_col[0]  <- coef_buf_row[8] */        *(vop_infor->coef_buf_col.y_ptr) = *(vop_infor->coef_buf_row.y_ptr            + SAMPLE_VIDEO_BLOCK_SIZE);    *(vop_infor->coef_buf_row.y_ptr - SAMPLE_VIDEO_BLOCK_SIZE) =        *(vop_infor->coef_buf_col.y_ptr + SAMPLE_VIDEO_BLOCK_SIZE);    *(vop_infor->coef_buf_row.y_ptr) = -1;    *(vop_infor->coef_buf_row.y_ptr + SAMPLE_VIDEO_BLOCK_SIZE) = -1;    *(vop_infor->coef_buf_col.y_ptr + SAMPLE_VIDEO_BLOCK_SIZE) = -1;        *(vop_infor->coef_buf_col.cb_ptr) = *(vop_infor->coef_buf_row.cb_ptr);    *(vop_infor->coef_buf_row.cb_ptr) = -1;        *(vop_infor->coef_buf_col.cr_ptr) = *(vop_infor->coef_buf_row.cr_ptr);    *(vop_infor->coef_buf_row.cr_ptr) = -1;     return SAMPLE_STATUS_NOERR;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -