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

📄 picturei.cpp

📁 H.263的编码程序,加了CPU指令优化,VC版.
💻 CPP
字号:
/*!
********************************************************
*\file
*    picureI.cpp
*\brief
*    implementation for frame(I frame) level funcitons .
*\date
*    12/6/2002
*
********************************************************/
#include <stdio.h>
#include "HEnc.h"
#include "vlc.h"
#include "image.h"
#include "macroblock.h"
#include "bitstream.h"

// Name   : EncIfrm  
// Input  : H263VencStatus 
// Output : Encoded Intra Picture 
// Description : Encode one I frame 
/*! Last modified on 2002.12.5 by zj */
int EncIfrm (H263VencStatus *curr_encode_status)
{
	int i, j;
	INT16 mb_coeff[384];   //mb data encoded 384 = 8*8 * (4+1+1).
	int COD = 0;
	int CBP;
	int dquant = 0;
	int mb_mode = MODE_INTRA;
	int frame_total_bits = 0;
	int gob_nbr = 0;
	int gob_quant = curr_encode_status->total_Q;
	
    if (curr_encode_status->version2)
	{
		frame_total_bits += EncPicHdrPlus(curr_encode_status);
	}
	else
	{
		frame_total_bits += EncPicHdr(curr_encode_status);
	}

	for (i = 0; i < curr_encode_status->lines; i += 16)
	{
		if (curr_encode_status->advanced_intra_coding && (i == 0))
		{
			clear_coeff_top(curr_encode_status->rcoeff.top_lum, curr_encode_status->rcoeff.top_cb, curr_encode_status->rcoeff.top_cr);
			clear_coeff_top(curr_encode_status->coeff.top_lum, curr_encode_status->coeff.top_cb, curr_encode_status->coeff.top_cr);
		}
		if(curr_encode_status->gobsync && i &&  (i/16)%(curr_encode_status->gobsync) == 0)
		{
			gob_nbr++;
			frame_total_bits += EncGOBHdr(&(curr_encode_status->putstrmctrl), gob_nbr,curr_encode_status->gfid, gob_quant, curr_encode_status->TR, 0);
			if (curr_encode_status->advanced_intra_coding)
			{
				clear_coeff_top(curr_encode_status->rcoeff.top_lum, curr_encode_status->rcoeff.top_cb, curr_encode_status->rcoeff.top_cr);
				clear_coeff_top(curr_encode_status->coeff.top_lum, curr_encode_status->coeff.top_cb, curr_encode_status->coeff.top_cr);
	
			}
		}

		for (j = 0; j < curr_encode_status->pels; j += 16)
		{
			if (!curr_encode_status->advanced_intra_coding)
			{
				CBP = MB_Encode_I (curr_encode_status, j, i, mb_coeff);
				/* take down the code information of current mb */
				curr_encode_status->coded_tab[i/16+1][j/16+1] = 1;
				curr_encode_status->quant_tab[i/16+1][j/16+1] = curr_encode_status->total_Q;	
				frame_total_bits += EncMBHdr(&(curr_encode_status->putstrmctrl), curr_encode_status->PTYPE, mb_mode, COD, CBP, dquant);
				frame_total_bits += EncCoeff(&(curr_encode_status->putstrmctrl), 1, CBP, mb_coeff, 64);
			}
			else
			{
				if (0 == j)
				{
					clear_coeff_left(curr_encode_status->rcoeff.left_lum, curr_encode_status->rcoeff.left_cr, curr_encode_status->rcoeff.left_cb);
					clear_coeff_left(curr_encode_status->coeff.left_lum, curr_encode_status->coeff.left_cr, curr_encode_status->coeff.left_cb);
				}
				CBP = MB_Encode_AI(curr_encode_status, j, i, mb_coeff);
				curr_encode_status->coded_tab[i/16+1][j/16+1] = 1;
				curr_encode_status->quant_tab[i/16+1][j/16+1] = curr_encode_status->total_Q;
				frame_total_bits += EncMBHdr(&(curr_encode_status->putstrmctrl), curr_encode_status->PTYPE, mb_mode, COD, CBP, dquant);
				frame_total_bits += EncCoeff(&(curr_encode_status->putstrmctrl), 2, CBP, mb_coeff, 64);         
			}
		}
	}

	frame_total_bits += alignbits(&(curr_encode_status->putstrmctrl));
	clear_buff(&(curr_encode_status->putstrmctrl));

	if (curr_encode_status->filter)
	{
		EdgeFilter(curr_encode_status);
	}	
	if (curr_encode_status->mv_outside_frame)
	{
		MakeEdgeImage(curr_encode_status);
	}

	return frame_total_bits;

}

⌨️ 快捷键说明

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