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

📄 picturep.cpp

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

/*!
*******************************************************************************
*
*   Name:          EncPfrm
*   Description:   Encode one P Picture
*   Input:          
*   Output:        
*   Last modified: 2002/12/5 by lcl
*
*******************************************************************************/
int EncPfrm(H263VencStatus *encoder, MCParam *MC)
{
	int     pix_x, pix_y;
	int     mb_x, mb_y;
	int     lines = encoder->lines;
	int     pels = encoder->pels;
	INT16   qcoeff[384];
	int     mb_mode;
	int     cod;
	int     cbp;
	int     dquant = 0;
	int     newgob;
	int     frame_total_bits = 0;
	int     gob_nbr = 0;
	int     gob_quant = encoder->total_Q;
	int     TRP = encoder->TR - encoder->ref_pic*(encoder->B_frame+1);

	encoder->method.interpolate_lum(encoder);
	grabVec(encoder, MC, 0);              //???? Find MV on frame level or MB level?

	if (encoder->B_frame)
	{
		saveVec(MC, lines/16, pels/16);
	}

	if (encoder->version2)
	{
		frame_total_bits += EncPicHdrPlus(encoder);
	}
	else
	{
		frame_total_bits += EncPicHdr(encoder);
	}

	for (pix_y = 0, mb_y = 0; pix_y < lines; pix_y+=16, mb_y++)
	{
		newgob = 0;
		if (encoder->advanced_intra_coding && (pix_y == 0))
		{
			clear_coeff_top(encoder->rcoeff.top_lum, encoder->rcoeff.top_cb, encoder->rcoeff.top_cr);
			clear_coeff_top(encoder->coeff.top_lum, encoder->coeff.top_cb, encoder->coeff.top_cr);
		}
		if(encoder->gobsync && pix_y && mb_y%(encoder->gobsync) == 0)
		{
			gob_nbr++;
			frame_total_bits += EncGOBHdr(&(encoder->putstrmctrl), gob_nbr, encoder->gfid, gob_quant, encoder->TR, TRP);
			newgob = 1;
			if (encoder->advanced_intra_coding)
			{
				clear_coeff_top(encoder->rcoeff.top_lum, encoder->rcoeff.top_cb, encoder->rcoeff.top_cr);
				clear_coeff_top(encoder->coeff.top_lum, encoder->coeff.top_cb, encoder->coeff.top_cr);
			}
		}
		for (pix_x = 0, mb_x = 0; pix_x < pels; pix_x+=16, mb_x++)
		{
			if (encoder->advanced_intra_coding && pix_x == 0)
			{
				clear_coeff_left(encoder->rcoeff.left_lum, encoder->rcoeff.left_cr, encoder->rcoeff.left_cb);
				clear_coeff_left(encoder->coeff.left_lum, encoder->coeff.left_cr, encoder->coeff.left_cb);
			}

			mb_mode = (MC->mv_frame[0][mb_y+1][mb_x+1])->Mode; //!< set mode of current mb
			cod = 0;
			if (MODE_INTRA == mb_mode || MODE_INTRA_Q == mb_mode)
			{ 
				if (!encoder->advanced_intra_coding)
				{
					cbp = MB_Encode_I(encoder, pix_x, pix_y, qcoeff);
					/* take down the coded information of current mb */
					encoder->coded_tab[mb_y+1][mb_x+1] = 1;
					encoder->quant_tab[mb_y+1][mb_x+1] = encoder->total_Q;			
					frame_total_bits += EncMBHdr(&(encoder->putstrmctrl), encoder->PTYPE, mb_mode, cod, cbp, dquant);         //!<   write MCBPC, CBPY, DQUANT
					frame_total_bits += EncCoeff(&(encoder->putstrmctrl), 1, cbp, qcoeff, 64);          //!<   write coefficients
				}
				else
				{
					cbp = MB_Encode_AI(encoder, pix_x, pix_y, qcoeff);
					encoder->coded_tab[mb_y+1][mb_x+1] = 1;
					encoder->quant_tab[mb_y+1][mb_x+1] = encoder->total_Q;
					frame_total_bits += EncMBHdr(&(encoder->putstrmctrl), encoder->PTYPE, mb_mode, cod, cbp, dquant);
					frame_total_bits += EncCoeff(&(encoder->putstrmctrl), 2, cbp, qcoeff, 64);         
				}
			}
			else
			{
		    	cbp = MB_Encode_P(encoder, pix_x, pix_y, MC, qcoeff);
				if ((0 == cbp) && ZeroVector(MC->mv_frame[0][mb_y+1][mb_x+1]))  //!< skipped
				{
					cod = 1;
				}
				/* take down the coded information of current mb */
				encoder->coded_tab[mb_y+1][mb_x+1] = cod ? 0 : (mb_mode == MODE_INTER4V ? 3 : 2);
				encoder->quant_tab[mb_y+1][mb_x+1] = encoder->total_Q;
				frame_total_bits += EncMBHdr(&(encoder->putstrmctrl), encoder->PTYPE, mb_mode, cod, cbp, dquant);         //!<  write COD, MCBPC, CBPY, DQUANT
                if (!cod)
				{
					frame_total_bits += EncMVD(&(encoder->putstrmctrl), MC, mb_x, mb_y, mb_mode, newgob);
					frame_total_bits += EncCoeff(&(encoder->putstrmctrl), 0, cbp, qcoeff, 64);                   //!<  write coefficients
				}
				if (encoder->advanced_intra_coding)
				{
					set_coeff_inter(mb_x, encoder->rcoeff.top_lum, encoder->rcoeff.top_cr, encoder->rcoeff.top_cb,
						             encoder->rcoeff.left_lum, encoder->rcoeff.left_cr, encoder->rcoeff.left_cb);
					set_coeff_inter(mb_x, encoder->coeff.top_lum, encoder->coeff.top_cr, encoder->coeff.top_cb,
						             encoder->coeff.left_lum, encoder->coeff.left_cr, encoder->coeff.left_cb);
				}
			}

		}
	}

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

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

	return frame_total_bits;

}

⌨️ 快捷键说明

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