📄 picturep.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 + -