#include <stdio.h>#include <stdlib.h>#include <string.h>#include <limits.h>#include "vid_config.h"#include "vid_macros.h"Go to the source code of this file.
Classes | |
| struct | motionvector |
| struct | point |
| struct | pict_image |
| struct | pict |
| struct | slice |
| struct | macroblock |
| struct | mb_structure |
| struct | bits_counted |
| struct | results |
Defines | |
| #define | MB_SIZE 16 |
| #define | MBC 88 |
| #define | MBR 72 |
| #define | PREF_NULL_VEC 100 |
| #define | PREF_16_VEC 200 |
| #define | PREF_PBDELTA_NULL_VEC 50 |
| #define | PSC 1 |
| #define | PSC_LENGTH 17 |
| #define | ESCAPE 7167 |
| #define | PCT_INTER 1 |
| #define | PCT_INTRA 0 |
| #define | ON 1 |
| #define | OFF 0 |
| #define | SF_SQCIF 1 |
| #define | SF_QCIF 2 |
| #define | SF_CIF 3 |
| #define | SF_4CIF 4 |
| #define | SF_16CIF 5 |
| #define | MODE_INTER 0 |
| #define | MODE_INTER_Q 1 |
| #define | MODE_INTER4V 2 |
| #define | MODE_INTRA 3 |
| #define | MODE_INTRA_Q 4 |
| #define | PBMODE_NORMAL 0 |
| #define | PBMODE_MVDB 1 |
| #define | PBMODE_CBPB_MVDB 2 |
| #define | NO_VEC 999 |
Typedefs | |
| typedef motionvector | MotionVector |
| typedef point | Point |
| typedef pict_image | PictImage |
| typedef pict | Pict |
| typedef slice | Slice |
| typedef macroblock | Macroblock |
| typedef mb_structure | MB_Structure |
| typedef bits_counted | Bits |
| typedef results | Results |
Functions | |
| void | Help () |
| void | AdvancedHelp () |
| int | NextTwoPB (PictImage *p2, PictImage *bim, PictImage *p1, int bskip, int pskip, int seek_dist) |
| void | PrintSNR (Results *res, int num) |
| void | PrintResult (Bits *bits, int num_units, int num) |
| unsigned char * | ReadImage (char *filename, int frame_no, int headerlength) |
| PictImage * | FillImage (unsigned char *in) |
| void | WriteImage (PictImage *image, char *filename) |
| PictImage * | InitImage (int size) |
| void | FreeImage (PictImage *image) |
| char * | StripName (char *s) |
| int * | MB_Encode (MB_Structure *mb_orig, int QP, int I) |
| int | MB_Decode (int *qcoeff, MB_Structure *mb_recon, int QP, int I) |
| int | Dct (int *block, int *coeff) |
| int | idct (int *coeff, int *block) |
| void | FillLumBlock (int x, int y, PictImage *image, MB_Structure *data) |
| void | FillChromBlock (int x_curr, int y_curr, PictImage *image, MB_Structure *data) |
| void | ReconImage (int i, int j, MB_Structure *data, PictImage *recon) |
| void | CodeOneOrTwo (PictImage *curr, PictImage *B_image, PictImage *prev, PictImage *prev_recon, int QP, int frameskip, Bits *bits, Pict *pic, PictImage *B_recon, PictImage *recon) |
| PictImage * | CodeOneIntra (PictImage *curr, int QP, Bits *bits, Pict *pic) |
| void | Dequant (int *qcoeff, int *rcoeff, int QP, int I) |
| void | Quant (int *coeff, int *qcoeff, int QP, int I) |
| void | CountBitsCoeff (int *qcoeff, int I, int CBP, Bits *bits, int ncoeffs) |
| int | CodeCoeff (int Mode, int *qcoeff, int block, int ncoeffs) |
| int | FindCBP (int *qcoeff, int Mode, int ncoeffs) |
| void | CountBitsVectors (MotionVector *MV[5][MBR+1][MBC+2], Bits *bits, int i, int j, int Mode, int newgob, Pict *pic) |
| void | FindPMV (MotionVector *MV[5][MBR+1][MBC+2], int x, int y, int *p0, int *p1, int block, int newgob, int half_pel) |
| void | ZeroBits (Bits *bits) |
| void | ZeroRes (Results *res) |
| void | ZeroVec (MotionVector *MV) |
| void | MarkVec (MotionVector *MV) |
| void | CopyVec (MotionVector *MV1, MotionVector *MV2) |
| int | EqualVec (MotionVector *MV2, MotionVector *MV1) |
| void | AddBits (Bits *total, Bits *bits) |
| void | AddRes (Results *total, Results *res, Pict *pic) |
| void | AddBitsPicture (Bits *bits) |
| void | FindMB (int x, int y, unsigned char *image, int MB[16][16]) |
| MB_Structure * | MB_Recon (PictImage *prev_recon, MB_Structure *diff, int x_curr, int y_curr, MotionVector *MV) |
| MB_Structure * | Predict (PictImage *curr, PictImage *prev_recon, int x_curr, int y_curr, MotionVector *MV) |
| unsigned char * | InterpolateImage (unsigned char *image, int w, int h) |
| void | MotionEstimatePicture (unsigned char *curr, unsigned char *prev, unsigned char *prev_ipol, int seek_dist, MotionVector *MV[5][MBR+1][MBC+2], int gobsync) |
| void | MotionEstimation (unsigned char *curr, unsigned char *prev, int x_curr, int y_curr, int xoff, int yoff, int seek_dist, MotionVector *MV[5][MBR+1][MBC+2], int *sad_0) |
| unsigned char * | LoadArea (unsigned char *im, int x, int y, int x_size, int y_size, int lx) |
| int | SAD_Macroblock (unsigned char *ii, unsigned char *act_block, int h_length, int Min_FRAME) |
| int | SAD_MB_Bidir (unsigned char *ii, unsigned char *aa, unsigned char *bb, int width, int min_sofar) |
| int | SAD_Block (unsigned char *ii, unsigned char *act_block, int h_length, int min_sofar) |
| int | SAD_MB_integer (int *ii, int *act_block, int h_length, int min_sofar) |
| MB_Structure * | Predict_P (PictImage *curr_image, PictImage *prev_image, unsigned char *prev_ipol, int x_curr, int y_curr, MotionVector *fr[5][MBR+1][MBC+2], int PB) |
| MB_Structure * | Predict_B (PictImage *curr_image, PictImage *prev_image, unsigned char *prev_ipol, int x_curr, int y_curr, MotionVector *fr[5][MBR+1][MBC+2], MB_Structure *recon_P, int TR, int TRB) |
| void | Clip (MB_Structure *data) |
| void | FindForwLumPredPB (unsigned char *prev_ipol, int x_curr, int y_curr, MotionVector *fr, int *pred, int TRD, int TRB, int bdx, int bdy, int bs, int comp) |
| void | FindBiDirLumPredPB (int *recon_P, MotionVector *fr, int *pred, int TRD, int TRB, int bdx, int bdy, int nh, int nv) |
| void | FindBiDirChrPredPB (MB_Structure *recon_P, int dx, int dy, MB_Structure *pred) |
| void | FindBiDirLimits (int vec, int *start, int *stop, int nhv) |
| void | FindBiDirChromaLimits (int vec, int *start, int *stop) |
| void | BiDirPredBlock (int xstart, int xstop, int ystart, int ystop, int xvec, int yvec, int *recon, int *pred, int bl) |
| void | DoPredChrom_P (int x_curr, int y_curr, int dx, int dy, PictImage *curr, PictImage *prev, MB_Structure *pred_error) |
| void | FindHalfPel (int x, int y, MotionVector *MV, unsigned char *prev, int *curr, int bs, int comp) |
| void | FindPred (int x, int y, MotionVector *fr, unsigned char *prev, int *pred, int bs, int comp) |
| void | FindPredOBMC (int x, int y, MotionVector *MV[5][MBR+1][MBC+2], unsigned char *prev, int *pred, int comp, int PB) |
| MB_Structure * | MB_Recon_P (PictImage *prev_image, unsigned char *prev_ipol, MB_Structure *diff, int x_curr, int y_curr, MotionVector *MV[5][MBR+1][MBC+2], int PB) |
| MB_Structure * | MB_Recon_B (PictImage *prev, MB_Structure *diff, unsigned char *prev_ipol, int x_curr, int y_curr, MotionVector *MV[5][MBR+1][MBC+2], MB_Structure *recon_P, int TR, int TRB) |
| void | ReconLumBlock_P (int x, int y, MotionVector *fr, unsigned char *prev, int *data, int bs, int comp) |
| void | ReconChromBlock_P (int x_curr, int y_curr, int dx, int dy, PictImage *prev, MB_Structure *data) |
| void | FindChromBlock_P (int x_curr, int y_curr, int dx, int dy, PictImage *prev, MB_Structure *data) |
| void | ComputeSNR (PictImage *im1, PictImage *im2, Results *res, int write) |
| void | ZeroMBlock (MB_Structure *data) |
| int | CountBitsPicture (Pict *pic) |
| void | CountBitsMB (int Mode, int COD, int CBP, int CBPB, Pict *pic, Bits *bits) |
| int | CountBitsSlice (int slice, int quant) |
| int | ChooseMode (unsigned char *curr, int x_pos, int y_pos, int min_SAD) |
| int | ModifyMode (int Mode, int dquant) |
| int * | InterleaveCoeff (int *qp, int *qb, int bs) |
| void | MakeEdgeImage (unsigned char *src, unsigned char *dst, int width, int height, int edge) |
| void | BitPrint (int length, int val, char *bit) |
| int | UpdateQuantizer (int mb, float QP_mean, int pict_type, float bit_rate, int mb_width, int mb_height, int bitcount) |
| int | InitializeQuantizer (int pict_type, float bit_rate, float target_frame_rate, float QP_mean) |
| void | InitializeRateControl () |
| void | UpdateRateControl (int bits) |
| void | init_idctref (void) |
| void | idctref (int *coeff, int *block) |
| void | Count_sac_BitsCoeff (int *qcoeff, int I, int CBP, Bits *bits, int ncoeffs) |
| int | Code_sac_Coeff (int Mode, int *qcoeff, int block, int ncoeffs) |
| int | CodeTCoef (int mod_index, int position, int intra) |
| void | Count_sac_BitsVectors (MotionVector *MV[5][MBR+1][MBC+2], Bits *bits, int i, int j, int Mode, int newgob, Pict *pic) |
| void | Count_sac_BitsMB (int Mode, int COD, int CBP, int CBPB, Pict *pic, Bits *bits) |
| int | AR_Encode (int index, int cumul_freq[]) |
| int | indexfn (int value, int table[], int max) |
| int | bit_opp_bits (int) |
| int | bit_in_psc_layer (int) |
| int | encoder_flush () |
| void | initbits () |
| void | putbits (int, int) |
| int | alignbits () |
| int | bitcount () |
|
|
Definition at line 139 of file vid_sim.h. Referenced by Code_sac_Coeff(). |
|
|
Definition at line 77 of file vid_sim.h. Referenced by ChooseMode(), CodeOneIntra(), CodeOneOrTwo(), FindPredOBMC(), MB_Recon_B(), MB_Recon_P(), MotionEstimatePicture(), MotionEstimation(), NextTwoPB(), Predict_B(), and Predict_P(). |
|
|
Definition at line 108 of file vid_sim.h. Referenced by CodeOneOrTwo(), and NextTwoPB(). |
|
|
Definition at line 109 of file vid_sim.h. Referenced by CodeOneOrTwo(), and NextTwoPB(). |
|
|
Definition at line 152 of file vid_sim.h. Referenced by CodeOneOrTwo(), MB_Recon_P(), and Predict_P(). |
|
|
Definition at line 154 of file vid_sim.h. Referenced by FindPredOBMC(). |
|
|
Definition at line 153 of file vid_sim.h. Referenced by CodeOneOrTwo(). |
|
|
Definition at line 155 of file vid_sim.h. Referenced by Code_sac_Coeff(), CodeCoeff(), CodeOneOrTwo(), Count_sac_BitsCoeff(), Count_sac_BitsMB(), CountBitsCoeff(), CountBitsMB(), Dequant(), FindCBP(), FindPredOBMC(), Predict_B(), and Quant(). |
|
|
Definition at line 156 of file vid_sim.h. Referenced by FindPredOBMC(). |
|
|
|
|
|
|
|
|
|
|
|
Definition at line 160 of file vid_sim.h. Referenced by Count_sac_BitsMB(), and CountBitsMB(). |
|
|
Definition at line 159 of file vid_sim.h. Referenced by Count_sac_BitsMB(), Count_sac_BitsVectors(), CountBitsMB(), and CountBitsVectors(). |
|
|
Definition at line 158 of file vid_sim.h. Referenced by Count_sac_BitsMB(), and CountBitsMB(). |
|
|
Definition at line 141 of file vid_sim.h. Referenced by CodeOneOrTwo(). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Definition at line 136 of file vid_sim.h. Referenced by CountBitsPicture(), and CountBitsSlice(). |
|
|
Definition at line 137 of file vid_sim.h. Referenced by CountBitsPicture(), and CountBitsSlice(). |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Referenced by AddRes(), CodeOneIntra(), CodeOneOrTwo(), Count_sac_BitsMB(), Count_sac_BitsVectors(), CountBitsMB(), CountBitsPicture(), CountBitsVectors(), FillImage(), and new_video_codec(). |
|
|
|
Referenced by FindHalfPel(). |
|
|
Referenced by AddRes(), ComputeSNR(), new_video_codec(), PrintSNR(), and ZeroRes(). |
|
|
|
|
||||||||||||
|
Definition at line 1069 of file vid_countbit.c. References Bits, bits_counted::C, bits_counted::CBPB, bits_counted::CBPCM, bits_counted::CBPY, bits_counted::COD, bits_counted::DQUANT, bits_counted::header, bits_counted::MODB, bits_counted::no_inter, bits_counted::no_inter4v, bits_counted::no_intra, bits_counted::total, bits_counted::vec, and bits_counted::Y. Referenced by code_video(). 01070 {
01071 total->Y += bits->Y;
01072 total->C += bits->C;
01073 total->vec += bits->vec;
01074 total->CBPY += bits->CBPY;
01075 total->CBPCM += bits->CBPCM;
01076 total->MODB += bits->MODB;
01077 total->CBPB += bits->CBPB;
01078 total->COD += bits->COD;
01079 total->DQUANT += bits->DQUANT;
01080 total->header += bits->header;
01081 total->total += bits->total;
01082 total->no_inter += bits->no_inter;
01083 total->no_inter4v += bits->no_inter4v;
01084 total->no_intra += bits->no_intra;
01085 return;
01086 }
|
|
|
Definition at line 1096 of file vid_countbit.c. References Bits, bits_counted::C, bits_counted::CBPB, bits_counted::CBPCM, bits_counted::CBPY, bits_counted::COD, bits_counted::DQUANT, bits_counted::header, bits_counted::MODB, bits_counted::total, bits_counted::vec, and bits_counted::Y. Referenced by code_video(), and CodeOneOrTwo(). 01097 {
01098 bits->total =
01099 bits->Y +
01100 bits->C +
01101 bits->vec +
01102 bits->CBPY +
01103 bits->CBPCM +
01104 bits->MODB +
01105 bits->CBPB +
01106 bits->COD +
01107 bits->DQUANT +
01108 bits->header ;
01109 }
|
|
||||||||||||||||
|
Definition at line 1087 of file vid_countbit.c. References Pict, pict::QP_mean, results::QP_mean, Results, results::SNR_Cb, results::SNR_Cr, and results::SNR_l. Referenced by code_video(). 01088 {
01089 total->SNR_l += res->SNR_l;
01090 total->SNR_Cr += res->SNR_Cr;
01091 total->SNR_Cb += res->SNR_Cb;
01092 total->QP_mean += pic->QP_mean;
01093 return;
01094 }
|
|
|
|
|
|
Definition at line 115 of file vid_putbits.c. References video_codec::outcnt, putbits(), and VidSt. Referenced by code_video(). 00116 {
00117 int ret_value;
00118
00119 if ((VidSt->outcnt)!=8) {
00120 ret_value = (VidSt->outcnt); /* outcnt is reset in call to putbits () */
00121 putbits ((VidSt->outcnt), 0);
00122 return ret_value;
00123 }
00124 else
00125 return 0;
00126 }
|
|
||||||||||||
|
Definition at line 86 of file vid_sac.c. References bit_opp_bits(), bitcount(), low, and q1. Referenced by Code_sac_Coeff(), CodeTCoef(), Count_sac_BitsMB(), and Count_sac_BitsVectors(). 00087 {
00088 int bitcount=0;
00089
00090 if (index<0)
00091 return -1; /* Escape Code */
00092
00093 length = high - low + 1;
00094 high = low - 1 + (length * cumul_freq[index]) / cumul_freq[0];
00095 low += (length * cumul_freq[index+1]) / cumul_freq[0];
00096
00097 for ( ; ; ) {
00098 if (high < q2) {
00099 bitcount+=bit_opp_bits(0);
00100 }
00101 else if (low >= q2) {
00102 bitcount+=bit_opp_bits(1);
00103 low -= q2;
00104 high -= q2;
00105 }
00106 else if (low >= q1 && high < q3) {
00107 opposite_bits += 1;
00108 low -= q1;
00109 high -= q1;
00110 }
00111 else break;
00112
00113 low *= 2;
00114 high = 2*high+1;
00115 }
00116 return bitcount;
00117 }
|
|
||||||||||||||||||||||||||||||||||||||||
|
Definition at line 607 of file vid_pred.c. Referenced by FindBiDirChrPredPB(), and FindBiDirLumPredPB(). 00609 {
00610 int i,j,pel;
00611 int xint, yint;
00612 int xh, yh;
00613
00614 xint = xvec>>1;
00615 xh = xvec - 2*xint;
00616 yint = yvec>>1;
00617 yh = yvec - 2*yint;
00618
00619 if (!xh && !yh) {
00620 for (j = ystart; j <= ystop; j++) {
00621 for (i = xstart; i <= xstop; i++) {
00622 pel = *(recon +(j+yint)*bl + i+xint);
00623 *(pred + j*bl + i) = (mmin(255,mmax(0,pel)) + *(pred + j*bl + i))>>1;
00624 }
00625 }
00626 }
00627 else if (!xh && yh) {
00628 for (j = ystart; j <= ystop; j++) {
00629 for (i = xstart; i <= xstop; i++) {
00630 pel = (*(recon +(j+yint)*bl + i+xint) +
00631 *(recon +(j+yint+yh)*bl + i+xint) + 1)>>1;
00632 *(pred + j*bl + i) = (pel + *(pred + j*bl + i))>>1;
00633 }
00634 }
00635 }
00636 else if (xh && !yh) {
00637 for (j = ystart; j <= ystop; j++) {
00638 for (i = xstart; i <= xstop; i++) {
00639 pel = (*(recon +(j+yint)*bl + i+xint) +
00640 *(recon +(j+yint)*bl + i+xint+xh) + 1)>>1;
00641 *(pred + j*bl + i) = (pel + *(pred + j*bl + i))>>1;
00642 }
00643 }
00644 }
00645 else { /* xh && yh */
00646 for (j = ystart; j <= ystop; j++) {
00647 for (i = xstart; i <= xstop; i++) {
00648 pel = (*(recon +(j+yint)*bl + i+xint) +
00649 *(recon +(j+yint+yh)*bl + i+xint) +
00650 *(recon +(j+yint)*bl + i+xint+xh) +
00651 *(recon +(j+yint+yh)*bl + i+xint+xh)+2)>>2;
00652 *(pred + j*bl + i) = (pel + *(pred + j*bl + i))>>1;
00653 }
00654 }
00655 }
00656 return;
00657 }
|
|
|
Definition at line 190 of file vid_sac.c. References bitcount(), putbits(), video_codec::tf, video_codec::trace, and VidSt. Referenced by bit_opp_bits(). 00191 {
00192 void putbits (int, int);
00193 int bitcount = 0;
00194
00195 if (zerorun > 13) {
00196 if ((VidSt->trace))
00197 fprintf((VidSt->tf), "PSC emulation ... Bit stuffed.\n");
00198 putbits (1, 1);
00199 bitcount++;
00200 zerorun = 0;
00201 }
00202
00203 putbits (1, bit);
00204 bitcount++;
00205
00206 if (bit)
00207 zerorun = 0;
00208 else
00209 zerorun++;
00210
00211 return bitcount;
00212 }
|
|
|
Definition at line 119 of file vid_sac.c. References bit_in_psc_layer(), and bitcount(). Referenced by AR_Encode(), and encoder_flush(). 00120 {
00121 int bitcount=0;
00122
00123 bitcount = bit_in_psc_layer(bit);
00124
00125 while(opposite_bits > 0){
00126 bitcount += bit_in_psc_layer(!bit);
00127 opposite_bits--;
00128 }
00129 return bitcount;
00130 }
|
|
|
Definition at line 130 of file vid_putbits.c. References video_codec::bytecnt, video_codec::outcnt, and VidSt. Referenced by AR_Encode(), bit_in_psc_layer(), bit_opp_bits(), encoder_flush(), and UpdateQuantizer().
|
|
||||||||||||||||
|
Definition at line 137 of file vid_putbits.c. Referenced by putbits(). 00138 {
00139 int m;
00140
00141 m = length;
00142 bit[0] = '"';
00143 while (m--) {
00144 bit[length-m] = (val & (1<<m)) ? '1' : '0';
00145 }
00146 bit[length+1] = '"';
00147 bit[length+2] = '\n';
00148 bit[length+3] = '\0';
00149 return;
00150 }
|
|
||||||||||||||||||||
|
Definition at line 1509 of file vid_pred.c. References MB_SIZE, video_codec::pels, and VidSt. Referenced by MotionEstimatePicture(). 01510 {
01511 int i,j;
01512 int MB_mean = 0, A = 0;
01513 int y_off;
01514
01515 for (j = 0; j < MB_SIZE; j++) {
01516 y_off = (y_pos + j) * (VidSt->pels);
01517 for (i = 0; i < MB_SIZE; i++) {
01518 MB_mean += *(curr + x_pos + i + y_off);
01519 }
01520 }
01521 MB_mean /= (MB_SIZE*MB_SIZE);
01522 for (j = 0; j < MB_SIZE; j++) {
01523 y_off = (y_pos + j) * (VidSt->pels);
01524 for (i = 0; i < MB_SIZE; i++) {
01525 A += abs( *(curr + x_pos + i + y_off) - MB_mean );
01526 }
01527 }
01528
01529 if (A < (min_SAD - 500))
01530 return MODE_INTRA;
01531 else
01532 return MODE_INTER;
01533 }
|
|
|
Definition at line 1076 of file vid_coder.c. References mb_structure::Cb, mb_structure::Cr, data, mb_structure::lum, MB_Structure, mmax, and mmin. Referenced by CodeOneIntra(), and CodeOneOrTwo(). 01077 {
01078 int m,n;
01079
01080 for (n = 0; n < 16; n++) {
01081 for (m = 0; m < 16; m++) {
01082 data->lum[n][m] = mmin(255,mmax(0,data->lum[n][m]));
01083 }
01084 }
01085 for (n = 0; n < 8; n++) {
01086 for (m = 0; m < 8; m++) {
01087 data->Cr[n][m] = mmin(255,mmax(0,data->Cr[n][m]));
01088 data->Cb[n][m] = mmin(255,mmax(0,data->Cb[n][m]));
01089 }
01090 }
01091 }
|
|
||||||||||||||||||||
|
Definition at line 526 of file vid_countbit.c. References AR_Encode(), CodeTCoef(), cumf_INTRADC, cumf_LAST, cumf_LAST_intra, cumf_LEVEL, cumf_LEVEL_intra, cumf_RUN, cumf_RUN_intra, cumf_SIGN, ESCAPE, indexfn(), intradctab, lasttab, leveltab, MODE_INTRA, position, runtab, signtab, tcoeftab, video_codec::tf, video_codec::trace, and VidSt. Referenced by Count_sac_BitsCoeff(). 00527 {
00528 int j, bits, mod_index, intra;
00529 int prev_run, run, prev_level, level, first, prev_position, position;
00530 int prev_ind, ind, prev_s, s, length;
00531
00532 run = bits = 0;
00533 first = 1; position = 0; intra = 0;
00534
00535 level = s = ind = 0;
00536 prev_run = prev_level = prev_ind = prev_s = prev_position = 0;
00537
00538 intra = (Mode == MODE_INTRA || Mode == MODE_INTRA_Q);
00539
00540 for (j = block*ncoeffs; j< (block + 1)*ncoeffs; j++) {
00541
00542 if (!(j%ncoeffs) && intra) {
00543 if ((VidSt->trace)) {
00544 fprintf((VidSt->tf),"DC: ");
00545 }
00546 if (qcoeff[block*ncoeffs]!=128)
00547 mod_index = indexfn(qcoeff[block*ncoeffs],intradctab,254);
00548 else
00549 mod_index = indexfn(255,intradctab,254);
00550 bits += AR_Encode(mod_index, cumf_INTRADC);
00551 }
00552 else {
00553
00554 s = 0;
00555 /* Increment run if coeff is zero */
00556 if ((level = qcoeff[j]) == 0) {
00557 run++;
00558 }
00559 else {
00560 /* code run & level and count bits */
00561 if (level < 0) {
00562 s = 1;
00563 level = -level;
00564 }
00565 ind = level | run<<4;
00566 ind = ind | 0<<12; /* Not last coeff */
00567 position++;
00568
00569 if (!first) {
00570 mod_index = indexfn(prev_ind, tcoeftab, 103);
00571 if (prev_level < 13 && prev_run < 64)
00572 length = CodeTCoef(mod_index, prev_position, intra);
00573 else
00574 length = -1;
00575
00576 if (length == -1) { /* Escape coding */
00577 if ((VidSt->trace)) {
00578 fprintf((VidSt->tf),"Escape coding:\n");
00579 }
00580
00581 if (prev_s == 1) {prev_level = (prev_level^0xff)+1;}
00582
00583 mod_index = indexfn(ESCAPE, tcoeftab, 103);
00584 bits += CodeTCoef(mod_index, prev_position, intra);
00585
00586 if (intra)
00587 bits += AR_Encode(indexfn(0, lasttab, 2), cumf_LAST_intra);
00588 else
00589 bits += AR_Encode(indexfn(0, lasttab, 2), cumf_LAST);
00590
00591 if (intra)
00592 bits += AR_Encode(indexfn(prev_run, runtab, 64), cumf_RUN_intra);
00593 else
00594 bits += AR_Encode(indexfn(prev_run, runtab, 64), cumf_RUN);
00595
00596 if (intra)
00597 bits += AR_Encode(indexfn(prev_level, leveltab, 254),
00598 cumf_LEVEL_intra);
00599 else
00600 bits += AR_Encode(indexfn(prev_level, leveltab, 254),
00601 cumf_LEVEL);
00602
00603 }
00604 else {
00605 bits += AR_Encode(indexfn(prev_s, signtab, 2), cumf_SIGN);
00606 bits += length;
00607 }
00608 }
00609
00610 prev_run = run; prev_s = s;
00611 prev_level = level; prev_ind = ind;
00612 prev_position = position;
00613
00614 run = first = 0;
00615
00616 }
00617 }
00618 }
00619
00620 /* Encode Last Coefficient */
00621
00622 if (!first) {
00623 if ((VidSt->trace)) {
00624 fprintf((VidSt->tf),"Last coeff: ");
00625 }
00626 prev_ind = prev_ind | 1<<12; /* last coeff */
00627 mod_index = indexfn(prev_ind, tcoeftab, 103);
00628
00629 if (prev_level < 13 && prev_run < 64)
00630 length = CodeTCoef(mod_index, prev_position, intra);
00631 else
00632 length = -1;
00633
00634 if (length == -1) { /* Escape coding */
00635 if ((VidSt->trace)) {
00636 fprintf((VidSt->tf),"Escape coding:\n");
00637 }
00638
00639 if (prev_s == 1) {prev_level = (prev_level^0xff)+1;}
00640
00641 mod_index = indexfn(ESCAPE, tcoeftab, 103);
00642 bits += CodeTCoef(mod_index, prev_position, intra);
00643
00644 if (intra)
00645 bits += AR_Encode(indexfn(1, lasttab, 2), cumf_LAST_intra);
00646 else
00647 bits += AR_Encode(indexfn(1, lasttab, 2), cumf_LAST);
00648
00649 if (intra)
00650 bits += AR_Encode(indexfn(prev_run, runtab, 64), cumf_RUN_intra);
00651 else
00652 bits += AR_Encode(indexfn(prev_run, runtab, 64), cumf_RUN);
00653
00654 if (intra)
00655 bits += AR_Encode(indexfn(prev_level, leveltab, 254), cumf_LEVEL_intra);
00656 else
00657 bits += AR_Encode(indexfn(prev_level, leveltab, 254), cumf_LEVEL);
00658 }
00659 else {
00660 bits += AR_Encode(indexfn(prev_s, signtab, 2), cumf_SIGN);
00661 bits += length;
00662 }
00663 } /* last coeff */
00664
00665 return bits;
00666 }
|
|
||||||||||||||||||||
|
Definition at line 361 of file vid_countbit.c. References MODE_INTRA, put_coeff(), putbits(), video_codec::tf, video_codec::trace, and VidSt. Referenced by CountBitsCoeff(). 00362 {
00363 int j, bits;
00364 int prev_run, run, prev_level, level, first;
00365 int prev_s, s, length;
00366
00367 run = bits = 0;
00368 first = 1;
00369 prev_run = prev_level = level = s = prev_s = 0;
00370
00371 if ((VidSt->trace)) {
00372 fprintf((VidSt->tf),"Coeffs block %d:\n",block);
00373 }
00374
00375 for (j = block*ncoeffs; j< (block + 1)*ncoeffs; j++) {
00376 /* Do this block's DC-coefficient first */
00377 if (!(j%ncoeffs) && (Mode == MODE_INTRA || Mode == MODE_INTRA_Q)) {
00378 /* DC coeff */
00379 if ((VidSt->trace)) {
00380 fprintf((VidSt->tf),"DC: ");
00381 }
00382 if (qcoeff[block*ncoeffs] != 128)
00383 putbits(8,qcoeff[block*ncoeffs]);
00384 else
00385 putbits(8,255);
00386 bits += 8;
00387 }
00388 else {
00389 /* AC coeff */
00390 s = 0;
00391 /* Increment run if coeff is zero */
00392 if ((level = qcoeff[j]) == 0) {
00393 run++;
00394 }
00395 else {
00396 /* code run & level and count bits */
00397 if (level < 0) {
00398 s = 1;
00399 level = -level;
00400 }
00401
00402 if (!first) {
00403 /* Encode the previous coefficient */
00404 if (prev_level < 13 && prev_run < 64)
00405 length = put_coeff (prev_run, prev_level, 0);
00406 else
00407 length = 0;
00408 if (length == 0) { /* Escape coding */
00409 if ((VidSt->trace)) {
00410 fprintf((VidSt->tf),"Escape code: ");
00411 }
00412 if (prev_s == 1) {prev_level = (prev_level^0xff)+1;}
00413 putbits(7,3); /* Escape code */
00414 if ((VidSt->trace))
00415 fprintf((VidSt->tf),"last: ");
00416 putbits(1,0);
00417 if ((VidSt->trace))
00418 fprintf((VidSt->tf),"run: ");
00419 putbits(6,prev_run);
00420 if ((VidSt->trace))
00421 fprintf((VidSt->tf),"level: ");
00422 putbits(8,prev_level);
00423 bits += 22;
00424 }
00425 else {
00426 putbits(1,prev_s);
00427 bits += length + 1;
00428 }
00429 }
00430 prev_run = run; prev_s = s;
00431 prev_level = level;
00432
00433 run = first = 0;
00434 }
00435 }
00436 }
00437 /* Encode the last coeff */
00438 if (!first) {
00439 if ((VidSt->trace)) {
00440 fprintf((VidSt->tf),"Last coeff: ");
00441 }
00442 if (prev_level < 13 && prev_run < 64)
00443 length = put_coeff (prev_run, prev_level, 1);
00444 else
00445 length = 0;
00446 if (length == 0) { /* Escape coding */
00447 if ((VidSt->trace)) {
00448 fprintf((VidSt->tf),"Escape code: ");
00449 }
00450 if (prev_s == 1) {prev_level = (prev_level^0xff)+1;}
00451 putbits (7,3); /* Escape code */
00452 if ((VidSt->trace))
00453 fprintf((VidSt->tf),"last: ");
00454 putbits(1,1);
00455 if ((VidSt->trace))
00456 fprintf((VidSt->tf),"run: ");
00457 putbits(6,prev_run);
00458 if ((VidSt->trace))
00459 fprintf((VidSt->tf),"level: ");
00460 putbits(8,prev_level);
00461 bits += 22;
00462 }
00463 else {
00464 putbits(1,prev_s);
00465 bits += length + 1;
00466 }
00467 }
00468 return bits;
00469 }
|
|
||||||||||||||||||||
|
Definition at line 435 of file vid_coder.c. References Bits, Clip(), Count_sac_BitsCoeff(), Count_sac_BitsMB(), CountBitsCoeff(), CountBitsMB(), CountBitsPicture(), CountBitsSlice(), data, FillChromBlock(), FillLumBlock(), FindCBP(), bits_counted::header, InitImage(), video_codec::lines, pict::MB, MB_Decode(), MB_Encode(), MB_SIZE, MB_Structure, bits_counted::no_intra, video_codec::pels, Pict, PictImage, pict::QP_mean, pict::QUANT, ReconImage(), video_codec::syntax_arith_coding, pict::use_gobsync, VidSt, and ZeroBits(). Referenced by code_video(). 00436 {
00437 PictImage *recon;
00438 MB_Structure *data = (MB_Structure *)malloc(sizeof(MB_Structure));
00439 int *qcoeff;
00440 int Mode = MODE_INTRA;
00441 int CBP,COD;
00442 int i,j;
00443
00444 recon = InitImage((VidSt->pels)*(VidSt->lines));
00445 ZeroBits(bits);
00446
00447 pic->QUANT = QP;
00448 bits->header += CountBitsPicture(pic);
00449
00450 COD = 0; /* Every block is coded in Intra frame */
00451 for ( j = 0; j < (VidSt->lines)/MB_SIZE; j++) {
00452
00453 /* insert sync in *every* slice if use_gobsync is chosen */
00454 if (pic->use_gobsync && j != 0)
00455 bits->header += CountBitsSlice(j,QP);
00456 for ( i = 0; i < (VidSt->pels)/MB_SIZE; i++) {
00457
00458 pic->MB = i + j * ((VidSt->pels)/MB_SIZE);
00459 bits->no_intra++;
00460 FillLumBlock(i*MB_SIZE, j*MB_SIZE, curr, data);
00461 FillChromBlock(i*MB_SIZE, j*MB_SIZE, curr, data);
00462 qcoeff = MB_Encode(data, QP, Mode);
00463 CBP = FindCBP(qcoeff,Mode,64);
00464
00465 if (!(VidSt->syntax_arith_coding)) {
00466 CountBitsMB(Mode,COD,CBP,0,pic,bits);
00467 CountBitsCoeff(qcoeff, Mode, CBP,bits,64);
00468 } else {
00469 Count_sac_BitsMB(Mode,COD,CBP,0,pic,bits);
00470 Count_sac_BitsCoeff(qcoeff, Mode, CBP,bits,64);
00471 }
00472
00473 MB_Decode(qcoeff, data, QP, Mode);
00474 Clip(data);
00475 ReconImage(i,j,data,recon);
00476 free(qcoeff);
00477 }
00478 }
00479 pic->QP_mean = (float)QP;
00480
00481
00482 free(data);
00483 return recon;
00484 }
|
|
||||||||||||||||||||||||||||||||||||||||||||
|
Definition at line 73 of file vid_coder.c. References AddBitsPicture(), pict::bit_rate, Bits, pict::BQUANT, pict_image::Cb, Clip(), Count_sac_BitsCoeff(), Count_sac_BitsMB(), Count_sac_BitsVectors(), CountBitsCoeff(), CountBitsMB(), CountBitsPicture(), CountBitsSlice(), CountBitsVectors(), pict_image::Cr, pict::DQUANT, EqualVec(), FillChromBlock(), FillLumBlock(), FindCBP(), FreeImage(), bits_counted::header, InitializeQuantizer(), InitImage(), InterpolateImage(), video_codec::lines, video_codec::long_vectors, pict_image::lum, MakeEdgeImage(), MarkVec(), pict::MB, MB_Decode(), MB_Encode(), MB_Recon_B(), MB_Recon_P(), MB_SIZE, MB_Structure, MBC, MBR, mmax, mmin, pict::MODB, motionvector::Mode, MODE_INTER, MODE_INTER_Q, MODE_INTRA, ModifyMode(), MotionEstimatePicture(), MotionVector, video_codec::mv_outside_frame, bits_counted::no_inter, bits_counted::no_inter4v, bits_counted::no_intra, pict::PB, PCT_INTER, video_codec::pels, Pict, PictImage, Predict_B(), Predict_P(), pict::QP_mean, pict::QUANT, ReconImage(), pict::seek_dist, video_codec::syntax_arith_coding, pict::target_frame_rate, bits_counted::total, pict::TRB, UpdateQuantizer(), pict::use_gobsync, VidSt, motionvector::x, motionvector::y, ZeroBits(), ZeroMBlock(), and ZeroVec(). Referenced by code_video(). 00076 {
00077 unsigned char *prev_ipol,*pi_edge=NULL,*pi,*orig_lum;
00078 PictImage *prev_recon=NULL, *pr_edge=NULL;
00079 MotionVector *MV[6][MBR+1][MBC+2];
00080 MotionVector ZERO = {0,0,0,0,0};
00081 MB_Structure *recon_data_P;
00082 MB_Structure *recon_data_B=NULL;
00083 MB_Structure *diff;
00084 int *qcoeff_P;
00085 int *qcoeff_B=NULL;
00086
00087 int Mode,B;
00088 int CBP, CBPB=0;
00089 int bquant[] = {5,6,7,8};
00090 int QP_B;
00091 int newgob;
00092
00093 int i,j,k;
00094
00095 /* buffer control vars */
00096 float QP_cumulative = (float)0.0;
00097 int abs_mb_num = 0, QuantChangePostponed = 0;
00098 int QP_new, QP_prev, dquant, QP_xmitted=QP;
00099
00100 ZeroBits(bits);
00101
00102 /* interpolate image */
00103 if ((VidSt->mv_outside_frame)) {
00104 if ((VidSt->long_vectors)) {
00105 /* If the Extended Motion Vector range is used, motion vectors
00106 may point further out of the picture than in the normal range,
00107 and the edge images will have to be made larger */
00108 B = 16;
00109 }
00110 else {
00111 /* normal range */
00112 B = 8;
00113 }
00114 pi_edge = (unsigned char *)malloc(sizeof(char)*((VidSt->pels)+4*B)*((VidSt->lines)+4*B));
00115 if (pi_edge == NULL) {
00116 fprintf(stderr,"Couldn't allocate memory for pi_edge\n");
00117 exit(-1);
00118 }
00119 MakeEdgeImage(pr->lum,pi_edge + ((VidSt->pels) + 4*B)*2*B+2*B,(VidSt->pels),(VidSt->lines),2*B);
00120 pi = InterpolateImage(pi_edge, (VidSt->pels)+4*B, (VidSt->lines)+4*B);
00121 free(pi_edge);
00122 prev_ipol = pi + (2*(VidSt->pels) + 8*B) * 4*B + 4*B;
00123
00124 /* luma of non_interpolated image */
00125 pr_edge = InitImage(((VidSt->pels)+4*B)*((VidSt->lines)+4*B));
00126 MakeEdgeImage(prev->lum, pr_edge->lum + ((VidSt->pels) + 4*B)*2*B+2*B,
00127 (VidSt->pels),(VidSt->lines),2*B);
00128 orig_lum = pr_edge->lum + ((VidSt->pels) + 4*B)*2*B+2*B;
00129
00130 /* non-interpolated image */
00131 MakeEdgeImage(pr->lum,pr_edge->lum + ((VidSt->pels)+4*B)*2*B + 2*B,(VidSt->pels),(VidSt->lines),2*B);
00132 MakeEdgeImage(pr->Cr,pr_edge->Cr + ((VidSt->pels)/2 + 2*B)*B + B,(VidSt->pels)/2,(VidSt->lines)/2,B);
00133 MakeEdgeImage(pr->Cb,pr_edge->Cb + ((VidSt->pels)/2 + 2*B)*B + B,(VidSt->pels)/2,(VidSt->lines)/2,B);
00134
00135 prev_recon = (PictImage *)malloc(sizeof(PictImage));
00136 prev_recon->lum = pr_edge->lum + ((VidSt->pels) + 4*B)*2*B + 2*B;
00137 prev_recon->Cr = pr_edge->Cr + ((VidSt->pels)/2 + 2*B)*B + B;
00138 prev_recon->Cb = pr_edge->Cb + ((VidSt->pels)/2 + 2*B)*B + B;
00139 }
00140 else {
00141 pi = InterpolateImage(pr->lum,(VidSt->pels),(VidSt->lines));
00142 prev_ipol = pi;
00143 prev_recon = pr;
00144 orig_lum = prev->lum;
00145 }
00146
00147 /* mark PMV's outside the frame */
00148 for (i = 1; i < ((VidSt->pels)>>4)+1; i++) {
00149 for (k = 0; k < 6; k++) {
00150 MV[k][0][i] = (MotionVector *)malloc(sizeof(MotionVector));
00151 MarkVec(MV[k][0][i]);
00152 }
00153 MV[0][0][i]->Mode = MODE_INTRA;
00154 }
00155 /* zero out PMV's outside the frame */
00156 for (i = 0; i < ((VidSt->lines)>>4)+1; i++) {
00157 for (k = 0; k < 6; k++) {
00158 MV[k][i][0] = (MotionVector *)malloc(sizeof(MotionVector));
00159 ZeroVec(MV[k][i][0]);
00160 MV[k][i][((VidSt->pels)>>4)+1] = (MotionVector *)malloc(sizeof(MotionVector));
00161 ZeroVec(MV[k][i][((VidSt->pels)>>4)+1]);
00162 }
00163 MV[0][i][0]->Mode = MODE_INTRA;
00164 MV[0][i][((VidSt->pels)>>4)+1]->Mode = MODE_INTRA;
00165 }
00166
00167 /* Integer and half pel motion estimation */
00168 MotionEstimatePicture(curr->lum,prev_recon->lum,prev_ipol,
00169 pic->seek_dist,MV, pic->use_gobsync);
00170 /* note: integer pel motion estimation is now based on previous
00171 reconstructed image, not the previous original image. We have
00172 found that this works better for some sequences and not worse for
00173 others. Note that it can not easily be changed back by
00174 substituting prev_recon->lum with orig_lum in the line above,
00175 because SAD for zero vector is not re-calculated in the half
00176 pel search. The half pel search has always been based on the
00177 previous reconstructed image */
00178
00179
00180 if (pic->bit_rate != 0) {
00181 /* Initialization routine for Rate Control */
00182 QP_new = InitializeQuantizer(PCT_INTER, (float)pic->bit_rate,
00183 (pic->PB ? pic->target_frame_rate/2 : pic->target_frame_rate),
00184 pic->QP_mean);
00185 QP_xmitted = QP_prev = QP_new;
00186 }
00187 else {
00188 QP_new = QP_xmitted = QP_prev = QP; /* Copy the passed value of QP */
00189 }
00190
00191 dquant = 0;
00192
00193 for ( j = 0; j < (VidSt->lines)/MB_SIZE; j++) {
00194
00195
00196 if (pic->bit_rate != 0) {
00197 /* QP updated at the beginning of each row */
00198 AddBitsPicture(bits);
00199
00200 QP_new = UpdateQuantizer(abs_mb_num, pic->QP_mean, PCT_INTER,
00201 (float)pic->bit_rate, (VidSt->pels)/MB_SIZE,
00202 (VidSt->lines)/MB_SIZE, bits->total);
00203 }
00204
00205 newgob = 0;
00206
00207 if (j == 0) {
00208 pic->QUANT = QP_new;
00209 bits->header += CountBitsPicture(pic);
00210 QP_xmitted = QP_prev = QP_new;
00211 }
00212 else if (pic->use_gobsync && j%pic->use_gobsync == 0) {
00213 bits->header += CountBitsSlice(j,QP_new); /* insert gob sync */
00214 QP_xmitted = QP_prev = QP_new;
00215 newgob = 1;
00216 }
00217
00218 for ( i = 0; i < (VidSt->pels)/MB_SIZE; i++) {
00219
00220 /* Update of dquant, check and correct its limit */
00221 dquant = QP_new - QP_prev;
00222 if (dquant != 0 && i != 0 && MV[0][j+1][i+1]->Mode == MODE_INTER4V) {
00223 /* It is not possible to change the quantizer and at the same
00224 time use 8x8 vectors. Turning off 8x8 vectors is not
00225 possible at this stage because the previous macroblock
00226 encoded assumed this one should use 8x8 vectors. Therefore
00227 the change of quantizer is postponed until the first MB
00228 without 8x8 vectors */
00229 dquant = 0;
00230 QP_xmitted = QP_prev;
00231 QuantChangePostponed = 1;
00232 }
00233 else {
00234 QP_xmitted = QP_new;
00235 QuantChangePostponed = 0;
00236 }
00237 if (dquant > 2) { dquant = 2; QP_xmitted = QP_prev + dquant;}
00238 if (dquant < -2) { dquant = -2; QP_xmitted = QP_prev + dquant;}
00239
00240 pic->DQUANT = dquant;
00241 /* modify mode if dquant != 0 (e.g. MODE_INTER -> MODE_INTER_Q) */
00242 Mode = ModifyMode(MV[0][j+1][i+1]->Mode,pic->DQUANT);
00243 MV[0][j+1][i+1]->Mode = Mode;
00244
00245 pic->MB = i + j * ((VidSt->pels)/MB_SIZE);
00246
00247 if (Mode == MODE_INTER || Mode == MODE_INTER_Q || Mode==MODE_INTER4V) {
00248 /* Predict P-MB */
00249 diff = Predict_P(curr,prev_recon,prev_ipol,
00250 i*MB_SIZE,j*MB_SIZE,MV,pic->PB);
00251
00252 }
00253 else {
00254 diff = (MB_Structure *)malloc(sizeof(MB_Structure));
00255 FillLumBlock(i*MB_SIZE, j*MB_SIZE, curr, diff);
00256 FillChromBlock(i*MB_SIZE, j*MB_SIZE, curr, diff);
00257 }
00258
00259 /* P or INTRA Macroblock */
00260 qcoeff_P = MB_Encode(diff, QP_xmitted, Mode);
00261 CBP = FindCBP(qcoeff_P, Mode, 64);
00262 if (CBP == 0 && (Mode == MODE_INTER || Mode == MODE_INTER_Q))
00263 ZeroMBlock(diff);
00264 else
00265 MB_Decode(qcoeff_P, diff, QP_xmitted, Mode);
00266 recon_data_P = MB_Recon_P(prev_recon, prev_ipol,diff,
00267 i*MB_SIZE,j*MB_SIZE,MV,pic->PB);
00268 Clip(recon_data_P);
00269 free(diff);
00270
00271
00272 /* Predict B-MB using reconstructed P-MB and prev. recon. image */
00273 if (pic->PB) {
00274 diff = Predict_B(B_image, prev_recon, prev_ipol,i*MB_SIZE, j*MB_SIZE,
00275 MV, recon_data_P, frameskip, pic->TRB);
00276 if (QP_xmitted == 0)
00277 QP_B = 0; /* (QP = 0 means no quantization) */
00278 else
00279 QP_B = mmax(1,mmin(31,bquant[pic->BQUANT]*QP_xmitted/4));
00280 qcoeff_B = MB_Encode(diff, QP_B, MODE_INTER);
00281 CBPB = FindCBP(qcoeff_B, MODE_INTER, 64);
00282 if (CBPB)
00283 MB_Decode(qcoeff_B, diff, QP_B, MODE_INTER);
00284 else
00285 ZeroMBlock(diff);
00286 recon_data_B = MB_Recon_B(prev_recon, diff,prev_ipol,i*MB_SIZE,
00287 j*MB_SIZE,MV,recon_data_P,frameskip,
00288 pic->TRB);
00289 Clip(recon_data_B);
00290
00291 /* decide MODB */
00292
00293 if (CBPB) {
00294 pic->MODB = PBMODE_CBPB_MVDB;
00295 }
00296 else {
00297 if (MV[5][j+1][i+1]->x == 0 && MV[5][j+1][i+1]->y == 0)
00298 pic->MODB = PBMODE_NORMAL;
00299 else
00300 pic->MODB = PBMODE_MVDB;
00301 }
00302
00303 free(diff);
00304
00305 }
00306 else
00307 ZeroVec(MV[5][j+1][i+1]); /* Zero out PB deltas */
00308
00309 if ((CBP==0) && (CBPB==0) && (EqualVec(MV[0][j+1][i+1],&ZERO)) &&
00310 (EqualVec(MV[5][j+1][i+1],&ZERO)) &&
00311 (Mode == MODE_INTER || Mode == MODE_INTER_Q)) {
00312 /* Skipped MB : both CBP and CBPB are zero, 16x16 vector is zero,
00313 PB delta vector is zero and Mode = MODE_INTER */
00314 if (Mode == MODE_INTER_Q) {
00315 /* DQUANT != 0 but not coded anyway */
00316 QP_xmitted = QP_prev;
00317 pic->DQUANT = 0;
00318 Mode = MODE_INTER;
00319 }
00320 if (!(VidSt->syntax_arith_coding))
00321 CountBitsMB(Mode,1,CBP,CBPB,pic,bits);
00322 else
00323 Count_sac_BitsMB(Mode,1,CBP,CBPB,pic,bits);
00324 }
00325 else {
00326 /* Normal MB */
00327 if (!(VidSt->syntax_arith_coding)) { /* VLC */
00328 CountBitsMB(Mode,0,CBP,CBPB,pic,bits);
00329
00330 if (Mode == MODE_INTER || Mode == MODE_INTER_Q) {
00331 bits->no_inter++;
00332 CountBitsVectors(MV, bits, i, j, Mode, newgob, pic);
00333 }
00334 else if (Mode == MODE_INTER4V) {
00335 bits->no_inter4v++;
00336 CountBitsVectors(MV, bits, i, j, Mode, newgob, pic);
00337 }
00338 else {
00339 /* MODE_INTRA or MODE_INTRA_Q */
00340 bits->no_intra++;
00341 if (pic->PB)
00342 CountBitsVectors(MV, bits, i, j, Mode, newgob, pic);
00343 }
00344
00345 if (CBP || Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
00346 CountBitsCoeff(qcoeff_P, Mode, CBP, bits, 64);
00347 if (CBPB)
00348 CountBitsCoeff(qcoeff_B, MODE_INTER, CBPB, bits, 64);
00349 } /* end VLC */
00350
00351 else { /* SAC */
00352 Count_sac_BitsMB(Mode,0,CBP,CBPB,pic,bits);
00353
00354 if (Mode == MODE_INTER || Mode == MODE_INTER_Q) {
00355 bits->no_inter++;
00356 Count_sac_BitsVectors(MV, bits, i, j, Mode, newgob, pic);
00357 }
00358 else if (Mode == MODE_INTER4V) {
00359 bits->no_inter4v++;
00360 Count_sac_BitsVectors(MV, bits, i, j, Mode, newgob, pic);
00361 }
00362 else {
00363 /* MODE_INTRA or MODE_INTRA_Q */
00364 bits->no_intra++;
00365 if (pic->PB)
00366 Count_sac_BitsVectors(MV, bits, i, j, Mode, newgob, pic);
00367 }
00368
00369 if (CBP || Mode == MODE_INTRA || Mode == MODE_INTRA_Q)
00370 Count_sac_BitsCoeff(qcoeff_P, Mode, CBP, bits, 64);
00371 if (CBPB)
00372 Count_sac_BitsCoeff(qcoeff_B, MODE_INTER, CBPB, bits, 64);
00373 } /* end SAC */
00374
00375 QP_prev = QP_xmitted;
00376 }
00377
00378 abs_mb_num++;
00379 QP_cumulative += QP_xmitted;
00380 #ifdef PRINTQ
00381 /* most useful when quantizer changes within a picture */
00382 if (QuantChangePostponed)
00383 fprintf(stdout,"@%2d",QP_xmitted);
00384 else
00385 fprintf(stdout," %2d",QP_xmitted);
00386 #endif
00387
00388 if (pic->PB)
00389 ReconImage(i,j,recon_data_B,B_recon);
00390
00391 ReconImage(i,j,recon_data_P,recon);
00392 free(recon_data_P);
00393 free(qcoeff_P);
00394 if (pic->PB) {
00395 free(qcoeff_B);
00396 free(recon_data_B);
00397 }
00398 }
00399 #ifdef PRINTQ
00400 fprintf(stdout,"\n");
00401 #endif
00402 }
00403
00404 pic->QP_mean = QP_cumulative/(float)abs_mb_num;
00405
00406 /* Free memory */
00407 free(pi);
00408 if ((VidSt->mv_outside_frame)) {
00409 free(prev_recon);
00410 FreeImage(pr_edge);
00411 }
00412 for (j = 0; j < ((VidSt->lines)>>4)+1; j++)
00413 for (i = 0; i < ((VidSt->pels)>>4)+2; i++)
00414 for (k = 0; k < 6; k++)
00415 free(MV[k][j][i]);
00416 return;
00417 }
|
|
||||||||||||||||
|
Definition at line 686 of file vid_countbit.c. References AR_Encode(), cumf_TCOEF1, cumf_TCOEF1_intra, cumf_TCOEF2, cumf_TCOEF2_intra, cumf_TCOEF3, cumf_TCOEF3_intra, cumf_TCOEFr, and cumf_TCOEFr_intra. Referenced by Code_sac_Coeff(). 00687 {
00688 int length;
00689
00690 switch (position) {
00691 case 1:
00692 {
00693 if (intra)
00694 length = AR_Encode(mod_index, cumf_TCOEF1_intra);
00695 else
00696 length = AR_Encode(mod_index, cumf_TCOEF1);
00697 break;
00698 }
00699 case 2:
00700 {
00701 if (intra)
00702 length = AR_Encode(mod_index, cumf_TCOEF2_intra);
00703 else
00704 length = AR_Encode(mod_index, cumf_TCOEF2);
00705 break;
00706 }
00707 case 3:
00708 {
00709 if (intra)
00710 length = AR_Encode(mod_index, cumf_TCOEF3_intra);
00711 else
00712 length = AR_Encode(mod_index, cumf_TCOEF3);
00713 break;
00714 }
00715 default:
00716 {
00717 if (intra)
00718 length = AR_Encode(mod_index, cumf_TCOEFr_intra);
00719 else
00720 length = AR_Encode(mod_index, cumf_TCOEFr);
00721 break;
00722 }
00723 }
00724
00725 return length;
00726 }
|
|
||||||||||||||||||||
|
Definition at line 67 of file vid_snr.c. References pict_image::Cb, pict_image::Cr, video_codec::lines, pict_image::lum, video_codec::pels, PictImage, Results, results::SNR_Cb, results::SNR_Cr, results::SNR_l, and VidSt. Referenced by code_video(). 00068 {
00069 FILE *out = NULL;
00070 int n;
00071 register int m;
00072 int quad, quad_Cr, quad_Cb, diff;
00073 PictImage *diff_image = NULL;
00074 /* Diff. image written to diff_filename */
00075 char *diff_filename=DEF_DIFFILENAME;
00076
00077 if (write) {
00078 out = fopen(diff_filename,"ab");
00079 diff_image = (PictImage *)malloc(sizeof(PictImage));
00080 diff_image->lum = (unsigned char *)malloc(sizeof(char)*(VidSt->pels)*(VidSt->lines));
00081 diff_image->Cr = (unsigned char *)malloc(sizeof(char)*(VidSt->pels)*(VidSt->lines)/4);
00082 diff_image->Cb = (unsigned char *)malloc(sizeof(char)*(VidSt->pels)*(VidSt->lines)/4);
00083 }
00084
00085 quad = 0;
00086 quad_Cr = quad_Cb = 0;
00087 /* Luminance */
00088 quad = 0;
00089 for (n = 0; n < (VidSt->lines); n++)
00090 for (m = 0; m < (VidSt->pels); m++) {
00091 diff = *(im1->lum + m + n*(VidSt->pels)) - *(im2->lum + m + n*(VidSt->pels));
00092 if (write)
00093 *(diff_image->lum + m + n*(VidSt->pels)) = 10*diff + 128;
00094 quad += diff * diff;
00095 }
00096
00097 res->SNR_l = (float)quad/(float)((VidSt->pels)*(VidSt->lines));
00098 if (res->SNR_l) {
00099 res->SNR_l = (float)(255*255) / res->SNR_l;
00100 res->SNR_l = 10 * (float)log10(res->SNR_l);
00101 }
00102 else res->SNR_l = (float)99.99;
00103
00104 /* Chrominance */
00105 for (n = 0; n < (VidSt->lines)/2; n++)
00106 for (m = 0; m < (VidSt->pels)/2; m++) {
00107 quad_Cr += (*(im1->Cr+m + n*(VidSt->pels)/2) - *(im2->Cr + m + n*(VidSt->pels)/2)) *
00108 (*(im1->Cr+m + n*(VidSt->pels)/2) - *(im2->Cr + m + n*(VidSt->pels)/2));
00109 quad_Cb += (*(im1->Cb+m + n*(VidSt->pels)/2) - *(im2->Cb + m + n*(VidSt->pels)/2)) *
00110 (*(im1->Cb+m + n*(VidSt->pels)/2) - *(im2->Cb + m + n*(VidSt->pels)/2));
00111 if (write) {
00112 *(diff_image->Cr + m + n*(VidSt->pels)/2) =
00113 (*(im1->Cr+m + n*(VidSt->pels)/2) - *(im2->Cr + m + n*(VidSt->pels)/2))*10+128;
00114 *(diff_image->Cb + m + n*(VidSt->pels)/2) =
00115 (*(im1->Cb+m + n*(VidSt->pels)/2) - *(im2->Cb + m + n*(VidSt->pels)/2))*10+128;
00116 }
00117 }
00118
00119 res->SNR_Cr = (float)quad_Cr/(float)((VidSt->pels)*(VidSt->lines)/4);
00120 if (res->SNR_Cr) {
00121 res->SNR_Cr = (float)(255*255) / res->SNR_Cr;
00122 res->SNR_Cr = 10 * (float)log10(res->SNR_Cr);
00123 }
00124 else res->SNR_Cr = (float)99.99;
00125
00126 res->SNR_Cb = (float)quad_Cb/(float)((VidSt->pels)*(VidSt->lines)/4);
00127 if (res->SNR_Cb) {
00128 res->SNR_Cb = (float)(255*255) / res->SNR_Cb;
00129 res->SNR_Cb = 10 * (float)log10(res->SNR_Cb);
00130 }
00131 else res->SNR_Cb = (float)99.99;
00132
00133 if (write) {
00134 fwrite(diff_image->lum, sizeof(char), (VidSt->pels)*(VidSt->lines), out);
00135 fwrite(diff_image->Cr, sizeof(char), (VidSt->pels)*(VidSt->lines)/4, out);
00136 fwrite(diff_image->Cb, sizeof(char), (VidSt->pels)*(VidSt->lines)/4, out);
00137 free(diff_image->lum);
00138 free(diff_image->Cr);
00139 free(diff_image->Cb);
00140 free(diff_image);
00141 fclose(out);
00142 }
00143 return;
00144 }
|
|
||||||||||||
|
Definition at line 1127 of file vid_countbit.c. References MotionVector, motionvector::x, motionvector::x_half, motionvector::y, and motionvector::y_half. 01128 {
01129 MV2->x = MV1->x;
01130 MV2->x_half = MV1->x_half;
01131 MV2->y = MV1->y;
01132 MV2->y_half = MV1->y_half;
01133 return;
01134 }
|
|
||||||||||||||||||||||||
|
Definition at line 486 of file vid_countbit.c. References video_codec::arith_used, Bits, bits_counted::C, Code_sac_Coeff(), MODE_INTRA, VidSt, and bits_counted::Y. Referenced by CodeOneIntra(), and CodeOneOrTwo(). 00487 {
00488
00489 int i;
00490
00491 (VidSt->arith_used) = 1;
00492
00493 if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) {
00494 for (i = 0; i < 4; i++) {
00495 bits->Y += Code_sac_Coeff(Mode, qcoeff,i,ncoeffs);
00496 }
00497 for (i = 4; i < 6; i++) {
00498 bits->C += Code_sac_Coeff(Mode, qcoeff,i,ncoeffs);
00499 }
00500 }
00501 else {
00502 for (i = 0; i < 4; i++) {
00503 if ((i==0 && CBP&32) ||
00504 (i==1 && CBP&16) ||
00505 (i==2 && CBP&8) ||
00506 (i==3 && CBP&4) ||
00507 (i==4 && CBP&2) ||
00508 (i==5 && CBP&1)) {
00509 bits->Y += Code_sac_Coeff(Mode, qcoeff, i, ncoeffs);
00510 }
00511 }
00512 for (i = 4; i < 6; i++) {
00513 if ((i==0 && CBP&32) ||
00514 (i==1 && CBP&16) ||
00515 (i==2 && CBP&8) ||
00516 (i==3 && CBP&4) ||
00517 (i==4 && CBP&2) ||
00518 (i==5 && CBP&1)) {
00519 bits->C += Code_sac_Coeff(Mode, qcoeff, i, ncoeffs);
00520 }
00521 }
00522 }
00523 return;
00524 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 169 of file vid_countbit.c. References AR_Encode(), video_codec::arith_used, Bits, bits_counted::CBPB, bits_counted::CBPCM, bits_counted::CBPY, cbpy_intratab, cbpytab, bits_counted::COD, cumf_CBPY, cumf_CBPY_intra, cumf_COD, cumf_DQUANT, cumf_MCBPC, cumf_MCBPC_intra, cumf_MODB, cumf_UVCBPB, cumf_YCBPB, pict::DQUANT, bits_counted::DQUANT, dquanttab, indexfn(), pict::MB, mcbpc_intratab, mcbpctab, bits_counted::MODB, pict::MODB, MODE_INTRA, pict::PB, PBMODE_CBPB_MVDB, PBMODE_MVDB, PBMODE_NORMAL, Pict, pict::picture_coding_type, video_codec::tf, video_codec::trace, and VidSt. Referenced by CodeOneIntra(), and CodeOneOrTwo(). 00170 {
00171 int cbpy, cbpcm, length, i;
00172
00173 (VidSt->arith_used) = 1;
00174
00175 /* COD */
00176
00177 if ((VidSt->trace)) {
00178 fprintf((VidSt->tf),"MB-nr: %d",pic->MB);
00179 if (pic->picture_coding_type == PCT_INTER)
00180 fprintf((VidSt->tf)," COD: %d ",COD);
00181 }
00182
00183 if (pic->picture_coding_type == PCT_INTER)
00184 bits->COD+=AR_Encode(COD, cumf_COD);
00185
00186 if (COD)
00187 return; /* not coded */
00188
00189 /* CBPCM */
00190
00191 cbpcm = Mode | ((CBP&3)<<4);
00192 if ((VidSt->trace)) {
00193 fprintf((VidSt->tf),"CBPCM (CBP=%d) (cbpcm=%d): ",CBP,cbpcm);
00194 }
00195 if (pic->picture_coding_type == PCT_INTRA)
00196 length = AR_Encode(indexfn(cbpcm,mcbpc_intratab,9),cumf_MCBPC_intra);
00197 else
00198 length = AR_Encode(indexfn(cbpcm,mcbpctab,21),cumf_MCBPC);
00199
00200 bits->CBPCM += length;
00201
00202 /* MODB & CBPB */
00203 if (pic->PB) {
00204 switch (pic->MODB) {
00205 case PBMODE_NORMAL:
00206 bits->MODB += AR_Encode(0, cumf_MODB);
00207 break;
00208 case PBMODE_MVDB:
00209 bits->MODB += AR_Encode(1, cumf_MODB);
00210 break;
00211 case PBMODE_CBPB_MVDB:
00212 bits->MODB += AR_Encode(2, cumf_MODB);
00213 /* CBPB */
00214 for(i=5; i>1; i--)
00215 bits->CBPB += AR_Encode(((CBPB & 1<<i)>>i), cumf_YCBPB);
00216 for(i=1; i>-1; i--)
00217 bits->CBPB += AR_Encode(((CBPB & 1<<i)>>i), cumf_UVCBPB);
00218 break;
00219 }
00220 if ((VidSt->trace))
00221 fprintf((VidSt->tf),"MODB: %d, CBPB: %d\n", pic->MODB, CBPB);
00222 }
00223
00224 /* CBPY */
00225
00226 cbpy = CBP>>2;
00227 if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) { /* Intra */
00228 length = AR_Encode(indexfn(cbpy,cbpy_intratab,16),cumf_CBPY_intra);
00229 } else {
00230 length = AR_Encode(indexfn(cbpy,cbpytab,16),cumf_CBPY);
00231 }
00232 if ((VidSt->trace)) {
00233 fprintf((VidSt->tf),"CBPY (CBP=%d) (cbpy=%d): ",CBP,cbpy);
00234 }
00235 bits->CBPY += length;
00236
00237 /* DQUANT */
00238
00239 if ((Mode == MODE_INTER_Q) || (Mode == MODE_INTRA_Q)) {
00240 if ((VidSt->trace)) {
00241 fprintf((VidSt->tf),"DQUANT: ");
00242 }
00243 bits->DQUANT += AR_Encode(indexfn(pic->DQUANT+2,dquanttab,4), cumf_DQUANT);
00244 }
00245 return;
00246 }
|
|
||||||||||||||||||||||||||||||||
|
Referenced by CodeOneOrTwo(). |
|
||||||||||||||||||||||||
|
Definition at line 323 of file vid_countbit.c. References Bits, bits_counted::C, CodeCoeff(), MODE_INTRA, and bits_counted::Y. Referenced by CodeOneIntra(), and CodeOneOrTwo(). 00324 {
00325
00326 int i;
00327
00328 if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) {
00329 for (i = 0; i < 4; i++) {
00330 bits->Y += CodeCoeff(Mode, qcoeff,i,ncoeffs);
00331 }
00332 for (i = 4; i < 6; i++) {
00333 bits->C += CodeCoeff(Mode, qcoeff,i,ncoeffs);
00334 }
00335 }
00336 else {
00337 for (i = 0; i < 4; i++) {
00338 if ((i==0 && CBP&32) ||
00339 (i==1 && CBP&16) ||
00340 (i==2 && CBP&8) ||
00341 (i==3 && CBP&4) ||
00342 (i==4 && CBP&2) ||
00343 (i==5 && CBP&1)) {
00344 bits->Y += CodeCoeff(Mode, qcoeff, i, ncoeffs);
00345 }
00346 }
00347 for (i = 4; i < 6; i++) {
00348 if ((i==0 && CBP&32) ||
00349 (i==1 && CBP&16) ||
00350 (i==2 && CBP&8) ||
00351 (i==3 && CBP&4) ||
00352 (i==4 && CBP&2) ||
00353 (i==5 && CBP&1)) {
00354 bits->C += CodeCoeff(Mode, qcoeff, i, ncoeffs);
00355 }
00356 }
00357 }
00358 return;
00359 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 65 of file vid_countbit.c. References Bits, bits_counted::CBPB, bits_counted::CBPCM, bits_counted::CBPY, bits_counted::COD, bits_counted::DQUANT, pict::DQUANT, pict::MB, bits_counted::MODB, pict::MODB, MODE_INTRA, pict::PB, PBMODE_CBPB_MVDB, PBMODE_MVDB, PBMODE_NORMAL, Pict, pict::picture_coding_type, put_cbpcm_inter(), put_cbpcm_intra(), put_cbpy(), putbits(), video_codec::tf, video_codec::trace, and VidSt. Referenced by CodeOneIntra(), and CodeOneOrTwo(). 00066 {
00067 int cbpy, cbpcm, length;
00068
00069 /* COD */
00070 if ((VidSt->trace)) {
00071 fprintf((VidSt->tf),"MB-nr: %d",pic->MB);
00072 if (pic->picture_coding_type == PCT_INTER)
00073 fprintf((VidSt->tf)," COD: %d\n",COD);
00074 }
00075 if (pic->picture_coding_type == PCT_INTER) {
00076 putbits(1,COD);
00077 bits->COD++;
00078 }
00079
00080 if (COD)
00081 return; /* not coded */
00082
00083 /* CBPCM */
00084 cbpcm = Mode | ((CBP&3)<<4);
00085 if ((VidSt->trace)) {
00086 fprintf((VidSt->tf),"CBPCM (CBP=%d) (cbpcm=%d): ",CBP,cbpcm);
00087 }
00088 if (pic->picture_coding_type == PCT_INTRA)
00089 length = put_cbpcm_intra (CBP, Mode);
00090 else
00091 length = put_cbpcm_inter (CBP, Mode);
00092 bits->CBPCM += length;
00093
00094 /* MODB & CBPB */
00095 if (pic->PB) {
00096 switch (pic->MODB) {
00097 case PBMODE_NORMAL:
00098 putbits(1,0);
00099 bits->MODB += 1;
00100 break;
00101 case PBMODE_MVDB:
00102 putbits(2,2);
00103 bits->MODB += 2;
00104 break;
00105 case PBMODE_CBPB_MVDB:
00106 putbits(2,3);
00107 bits->MODB += 2;
00108 /* CBPB */
00109 putbits(6,CBPB);
00110 bits->CBPB += 6;
00111 break;
00112 }
00113 if ((VidSt->trace))
00114 fprintf((VidSt->tf),"MODB: %d, CBPB: %d\n", pic->MODB, CBPB);
00115 }
00116
00117 /* CBPY */
00118 cbpy = CBP>>2;
00119 if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) /* Intra */
00120 cbpy = cbpy^15;
00121 if ((VidSt->trace)) {
00122 fprintf((VidSt->tf),"CBPY (CBP=%d) (cbpy=%d): ",CBP,cbpy);
00123 }
00124 length = put_cbpy (CBP, Mode);
00125
00126 bits->CBPY += length;
00127
00128 /* DQUANT */
00129 if ((Mode == MODE_INTER_Q) || (Mode == MODE_INTRA_Q)) {
00130 if ((VidSt->trace)) {
00131 fprintf((VidSt->tf),"DQUANT: ");
00132 }
00133 switch (pic->DQUANT) {
00134 case -1:
00135 putbits(2,0);
00136 break;
00137 case -2:
00138 putbits(2,1);
00139 break;
00140 case 1:
00141 putbits(2,2);
00142 break;
00143 case 2:
00144 putbits(2,3);
00145 break;
00146 default:
00147 fprintf(stderr,"Invalid DQUANT\n");
00148 exit(-1);
00149 }
00150 bits->DQUANT += 2;
00151 }
00152 return;
00153 }
|
|
|
Definition at line 1163 of file vid_countbit.c. References video_codec::advanced, pict::BQUANT, pict::PB, Pict, pict::picture_coding_type, PSC, PSC_LENGTH, putbits(), pict::QUANT, pict::source_format, pict::spare, video_codec::syntax_arith_coding, video_codec::tf, pict::TR, video_codec::trace, pict::TRB, pict::unrestricted_mv_mode, and VidSt. Referenced by CodeOneIntra(), and CodeOneOrTwo(). 01164 {
01165 int bits = 0;
01166
01167 /* in case of arithmetic coding, encoder_flush() has been called before
01168 zeroflush() in vid_main.c */
01169
01170 /* Picture start code */
01171 if ((VidSt->trace)) {
01172 fprintf((VidSt->tf),"picture_start_code: ");
01173 }
01174 putbits(PSC_LENGTH,PSC);
01175 bits += PSC_LENGTH;
01176
01177 /* Group number */
01178 if ((VidSt->trace)) {
01179 fprintf((VidSt->tf),"Group number in picture header: ");
01180 }
01181 putbits(5,0);
01182 bits += 5;
01183
01184 /* Time reference */
01185 if ((VidSt->trace)) {
01186 fprintf((VidSt->tf),"Time reference: ");
01187 }
01188 putbits(8,pic->TR);
01189 bits += 8;
01190
01191 /* bit 1 */
01192 if ((VidSt->trace)) {
01193 fprintf((VidSt->tf),"spare: ");
01194 }
01195 pic->spare = 1; /* always 1 to avoid start code emulation */
01196 putbits(1,pic->spare);
01197 bits += 1;
01198
01199 /* bit 2 */
01200 if ((VidSt->trace)) {
01201 fprintf((VidSt->tf),"always zero for distinction with H.261\n");
01202 }
01203 putbits(1,0);
01204 bits += 1;
01205
01206 /* bit 3 */
01207 if ((VidSt->trace)) {
01208 fprintf((VidSt->tf),"split_screen_indicator: ");
01209 }
01210 putbits(1,0); /* no support for split-screen in this software */
01211 bits += 1;
01212
01213 /* bit 4 */
01214 if ((VidSt->trace)) {
01215 fprintf((VidSt->tf),"document_camera_indicator: ");
01216 }
01217 putbits(1,0);
01218 bits += 1;
01219
01220 /* bit 5 */
01221 if ((VidSt->trace)) {
01222 fprintf((VidSt->tf),"freeze_picture_release: ");
01223 }
01224 putbits(1,0);
01225 bits += 1;
01226
01227 /* bit 6-8 */
01228 if ((VidSt->trace)) {
01229 fprintf((VidSt->tf),"source_format: ");
01230 }
01231 putbits(3,pic->source_format);
01232 bits += 3;
01233
01234 /* bit 9 */
01235 if ((VidSt->trace)) {
01236 fprintf((VidSt->tf),"picture_coding_type: ");
01237 }
01238 putbits(1,pic->picture_coding_type);
01239 bits += 1;
01240
01241 /* bit 10 */
01242 if ((VidSt->trace)) {
01243 fprintf((VidSt->tf),"mv_outside_frame: ");
01244 }
01245 putbits(1,pic->unrestricted_mv_mode); /* Unrestricted Motion Vector mode */
01246 bits += 1;
01247
01248 /* bit 11 */
01249 if ((VidSt->trace)) {
01250 fprintf((VidSt->tf),"sac_coding: ");
01251 }
01252 putbits(1,(VidSt->syntax_arith_coding)); /* Syntax-based Arithmetic Coding mode */
01253 bits += 1;
01254
01255 /* bit 12 */
01256 if ((VidSt->trace)) {
01257 fprintf((VidSt->tf),"adv_pred_mode: ");
01258 }
01259 putbits(1,(VidSt->advanced)); /* Advanced Prediction mode */
01260 bits += 1;
01261
01262 /* bit 13 */
01263 if ((VidSt->trace)) {
01264 fprintf((VidSt->tf),"PB-coded: "); /* PB-frames mode */
01265 }
01266 putbits(1,pic->PB);
01267 bits += 1;
01268
01269
01270 /* QUANT */
01271 if ((VidSt->trace)) {
01272 fprintf((VidSt->tf),"QUANT: ");
01273 }
01274 putbits(5,pic->QUANT);
01275 bits += 5;
01276
01277 /* Continuous Presence Multipoint (CPM) */
01278 putbits(1,0); /* CPM is not supported in this software */
01279 bits += 1;
01280
01281 /* Picture Sub Bitstream Indicator (PSBI) */
01282 /* if CPM == 1: 2 bits PSBI */
01283 /* not supported */
01284
01285 /* extra information for PB-frames */
01286 if (pic->PB) {
01287 if ((VidSt->trace)) {
01288 fprintf((VidSt->tf),"TRB: ");
01289 }
01290 putbits(3,pic->TRB);
01291 bits += 3;
01292
01293 if ((VidSt->trace)) {
01294 fprintf((VidSt->tf),"BQUANT: ");
01295 }
01296 putbits(2,pic->BQUANT);
01297 bits += 2;
01298
01299 }
01300
01301 /* PEI (extra information) */
01302 if ((VidSt->trace)) {
01303 fprintf((VidSt->tf),"PEI: ");
01304 }
01305 /* "Encoders shall not insert PSPARE until specified by the ITU" */
01306 putbits(1,0);
01307 bits += 1;
01308
01309 /* PSPARE */
01310 /* if PEI == 1: 8 bits PSPARE + another PEI bit */
01311 /* not supported */
01312
01313 return bits;
01314 }
|
|
||||||||||||
|
Definition at line 260 of file vid_countbit.c. References video_codec::arith_used, encoder_flush(), PSC, PSC_LENGTH, putbits(), video_codec::tf, video_codec::trace, and VidSt. Referenced by CodeOneIntra(), and CodeOneOrTwo(). 00261 {
00262 int bits = 0;
00263
00264 if ((VidSt->arith_used)) {
00265 bits+=encoder_flush(); /* Need to call before fixed length string output */
00266 (VidSt->arith_used) = 0;
00267 }
00268
00269 /* Picture Start Code */
00270 if ((VidSt->trace))
00271 fprintf((VidSt->tf),"GOB sync (GBSC): ");
00272 putbits(PSC_LENGTH,PSC); /* PSC */
00273 bits += PSC_LENGTH;
00274
00275 /* Group Number */
00276 if ((VidSt->trace))
00277 fprintf((VidSt->tf),"GN: ");
00278 putbits(5,slice);
00279 bits += 5;
00280
00281 /* GOB Sub Bitstream Indicator */
00282 /* if CPM == 1: read 2 bits GSBI */
00283 /* not supported in this version */
00284
00285 /* GOB Frame ID */
00286 if ((VidSt->trace))
00287 fprintf((VidSt->tf),"GFID: ");
00288 putbits(2, 0);
00289 /* NB: in error-prone environments this value should change if
00290 PTYPE in picture header changes. In this version of the encoder
00291 PTYPE only changes when PB-frames are used in the following cases:
00292 (i) after the first intra frame
00293 (ii) if the distance between two P-frames is very large
00294 Therefore I haven't implemented this GFID change */
00295 /* GFID is not allowed to change unless PTYPE changes */
00296 bits += 2;
00297
00298 /* Gquant */
00299 if ((VidSt->trace))
00300 fprintf((VidSt->tf),"GQUANT: ");
00301 putbits(5,quant);
00302 bits += 5;
00303
00304 return bits;
00305 }
|
|
||||||||||||||||||||||||||||||||
|
Referenced by CodeOneOrTwo(). |
|
||||||||||||
|
Definition at line 89 of file vid_dct.c. References zigzag. Referenced by MB_Encode(). 00090 {
00091 int j1, i, j, k;
00092 float b[8];
00093 float b1[8];
00094 float d[8][8];
00095 float f0=(float).7071068;
00096 float f1=(float).4903926;
00097 float f2=(float).4619398;
00098 float f3=(float).4157348;
00099 float f4=(float).3535534;
00100 float f5=(float).2777851;
00101 float f6=(float).1913417;
00102 float f7=(float).0975452;
00103
00104 for (i = 0, k = 0; i < 8; i++, k += 8) {
00105 for (j = 0; j < 8; j++) {
00106 b[j] = (float)block[k+j];
00107 }
00108 /* Horizontal transform */
00109 for (j = 0; j < 4; j++) {
00110 j1 = 7 - j;
00111 b1[j] = b[j] + b[j1];
00112 b1[j1] = b[j] - b[j1];
00113 }
00114 b[0] = b1[0] + b1[3];
00115 b[1] = b1[1] + b1[2];
00116 b[2] = b1[1] - b1[2];
00117 b[3] = b1[0] - b1[3];
00118 b[4] = b1[4];
00119 b[5] = (b1[6] - b1[5]) * f0;
00120 b[6] = (b1[6] + b1[5]) * f0;
00121 b[7] = b1[7];
00122 d[i][0] = (b[0] + b[1]) * f4;
00123 d[i][4] = (b[0] - b[1]) * f4;
00124 d[i][2] = b[2] * f6 + b[3] * f2;
00125 d[i][6] = b[3] * f6 - b[2] * f2;
00126 b1[4] = b[4] + b[5];
00127 b1[7] = b[7] + b[6];
00128 b1[5] = b[4] - b[5];
00129 b1[6] = b[7] - b[6];
00130 d[i][1] = b1[4] * f7 + b1[7] * f1;
00131 d[i][5] = b1[5] * f3 + b1[6] * f5;
00132 d[i][7] = b1[7] * f7 - b1[4] * f1;
00133 d[i][3] = b1[6] * f3 - b1[5] * f5;
00134 }
00135 /* Vertical transform */
00136 for (i = 0; i < 8; i++) {
00137 for (j = 0; j < 4; j++) {
00138 j1 = 7 - j;
00139 b1[j] = d[j][i] + d[j1][i];
00140 b1[j1] = d[j][i] - d[j1][i];
00141 }
00142 b[0] = b1[0] + b1[3];
00143 b[1] = b1[1] + b1[2];
00144 b[2] = b1[1] - b1[2];
00145 b[3] = b1[0] - b1[3];
00146 b[4] = b1[4];
00147 b[5] = (b1[6] - b1[5]) * f0;
00148 b[6] = (b1[6] + b1[5]) * f0;
00149 b[7] = b1[7];
00150 d[0][i] = (b[0] + b[1]) * f4;
00151 d[4][i] = (b[0] - b[1]) * f4;
00152 d[2][i] = b[2] * f6 + b[3] * f2;
00153 d[6][i] = b[3] * f6 - b[2] * f2;
00154 b1[4] = b[4] + b[5];
00155 b1[7] = b[7] + b[6];
00156 b1[5] = b[4] - b[5];
00157 b1[6] = b[7] - b[6];
00158 d[1][i] = b1[4] * f7 + b1[7] * f1;
00159 d[5][i] = b1[5] * f3 + b1[6] * f5;
00160 d[7][i] = b1[7] * f7 - b1[4] * f1;
00161 d[3][i] = b1[6] * f3 - b1[5] * f5;
00162 }
00163 /* Zigzag - scanning */
00164 for (i = 0; i < 8; i++) {
00165 for (j = 0; j < 8; j++) {
00166 *(coeff + zigzag[i][j]) = (int)(d[i][j]);
00167 }
00168 }
00169 return 0;
00170 }
|
|
||||||||||||||||||||
|
Definition at line 108 of file vid_quant.c. References MODE_INTRA, and sign. Referenced by MB_Decode(). 00109 {
00110 int i;
00111
00112 if (QP) {
00113 for (i = 0; i < 64; i++) {
00114 if (qcoeff[i]) {
00115 if ((QP % 2) == 1)
00116 rcoeff[i] = QP * (2*abs(qcoeff[i]) + 1);
00117 else
00118 rcoeff[i] = QP * (2*abs(qcoeff[i]) + 1) - 1;
00119 rcoeff[i] = sign(qcoeff[i]) * rcoeff[i];
00120 }
00121 else
00122 rcoeff[i] = 0;
00123 }
00124 if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) { /* Intra */
00125 rcoeff[0] = qcoeff[0]*8;
00126 }
00127 }
00128 else {
00129 /* No quantizing at all */
00130 for (i = 0; i < 64; i++) {
00131 rcoeff[i] = qcoeff[i];
00132 }
00133 }
00134 return;
00135 }
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 676 of file vid_pred.c. References mb_structure::Cb, pict_image::Cb, video_codec::cpels, mb_structure::Cr, pict_image::Cr, video_codec::long_vectors, MB_Structure, video_codec::mv_outside_frame, video_codec::pels, PictImage, and VidSt. Referenced by Predict_P(). 00679 {
00680 int m,n;
00681
00682 int x, y, ofx, ofy, pel, lx;
00683 int xint, yint;
00684 int xh, yh;
00685
00686 lx = ((VidSt->mv_outside_frame) ? (VidSt->pels)/2 + ((VidSt->long_vectors)?32:16) : (VidSt->pels)/2);
00687
00688 x = x_curr>>1;
00689 y = y_curr>>1;
00690
00691 xint = dx>>1;
00692 xh = dx & 1;
00693 yint = dy>>1;
00694 yh = dy & 1;
00695
00696 if (!xh && !yh) {
00697 for (n = 0; n < 8; n++) {
00698 for (m = 0; m < 8; m++) {
00699
00700 ofx = x + xint + m;
00701 ofy = y + yint + n;
00702 pel=*(prev->Cr+ofx + (ofy )*lx);
00703 pred_error->Cr[n][m] = (int)(*(curr->Cr + x+m + (y+n)*(VidSt->cpels)) - pel);
00704
00705 pel=*(prev->Cb+ofx + (ofy )*lx);
00706 pred_error->Cb[n][m] = (int)(*(curr->Cb + x+m + (y+n)*(VidSt->cpels)) - pel);
00707 }
00708 }
00709 }
00710 else if (!xh && yh) {
00711 for (n = 0; n < 8; n++) {
00712 for (m = 0; m < 8; m++) {
00713
00714 ofx = x + xint + m;
00715 ofy = y + yint + n;
00716 pel=(*(prev->Cr+ofx + (ofy )*lx)+
00717 *(prev->Cr+ofx + (ofy+yh)*lx) + 1)>>1;
00718
00719 pred_error->Cr[n][m] =
00720 (int)(*(curr->Cr + x+m + (y+n)*(VidSt->cpels)) - pel);
00721
00722 pel=(*(prev->Cb+ofx + (ofy )*lx)+
00723 *(prev->Cb+ofx + (ofy+yh)*lx) + 1)>>1;
00724
00725 pred_error->Cb[n][m] =
00726 (int)(*(curr->Cb + x+m + (y+n)*(VidSt->cpels)) - pel);
00727
00728 }
00729 }
00730 }
00731 else if (xh && !yh) {
00732 for (n = 0; n < 8; n++) {
00733 for (m = 0; m < 8; m++) {
00734
00735 ofx = x + xint + m;
00736 ofy = y + yint + n;
00737 pel=(*(prev->Cr+ofx + (ofy )*lx)+
00738 *(prev->Cr+ofx+xh + (ofy )*lx) + 1)>>1;
00739
00740 pred_error->Cr[n][m] =
00741 (int)(*(curr->Cr + x+m + (y+n)*(VidSt->cpels)) - pel);
00742
00743 pel=(*(prev->Cb+ofx + (ofy )*lx)+
00744 *(prev->Cb+ofx+xh + (ofy )*lx) + 1)>>1;
00745
00746 pred_error->Cb[n][m] =
00747 (int)(*(curr->Cb + x+m + (y+n)*(VidSt->cpels)) - pel);
00748
00749 }
00750 }
00751 }
00752 else { /* xh && yh */
00753 for (n = 0; n < 8; n++) {
00754 for (m = 0; m < 8; m++) {
00755 ofx = x + xint + m;
00756 ofy = y + yint + n;
00757 pel=(*(prev->Cr+ofx + (ofy )*lx)+
00758 *(prev->Cr+ofx+xh + (ofy )*lx)+
00759 *(prev->Cr+ofx + (ofy+yh)*lx)+
00760 *(prev->Cr+ofx+xh + (ofy+yh)*lx)+
00761 2)>>2;
00762
00763 pred_error->Cr[n][m] =
00764 (int)(*(curr->Cr + x+m + (y+n)*(VidSt->cpels)) - pel);
00765
00766 pel=(*(prev->Cb+ofx + (ofy )*lx)+
00767 *(prev->Cb+ofx+xh + (ofy )*lx)+
00768 *(prev->Cb+ofx + (ofy+yh)*lx)+
00769 *(prev->Cb+ofx+xh + (ofy+yh)*lx)+
00770 2)>>2;
00771
00772 pred_error->Cb[n][m] =
00773 (int)(*(curr->Cb + x+m + (y+n)*(VidSt->cpels)) - pel);
00774
00775 }
00776 }
00777 }
00778 return;
00779 }
|
|
|
Definition at line 150 of file vid_sac.c. References bit_opp_bits(), bitcount(), low, video_codec::tf, video_codec::trace, and VidSt. Referenced by code_video(), and CountBitsSlice(). 00151 {
00152 int bitcount = 0;
00153
00154 if ((VidSt->trace))
00155 fprintf((VidSt->tf), "encoder_flush:\n");
00156
00157 opposite_bits++;
00158 if (low < q1) {
00159 bitcount+=bit_opp_bits(0);
00160 }
00161 else {
00162 bitcount+=bit_opp_bits(1);
00163 }
00164 low = 0;
00165 high = top;
00166
00167 zerorun=0;
00168
00169 return bitcount;
00170 }
|
|
||||||||||||
|
Definition at line 1136 of file vid_countbit.c. References MotionVector, motionvector::x, motionvector::x_half, motionvector::y, and motionvector::y_half. Referenced by CodeOneOrTwo(). 01137 {
01138 if (MV1->x != MV2->x)
01139 return 0;
01140 if (MV1->y != MV2->y)
01141 return 0;
01142 if (MV1->x_half != MV2->x_half)
01143 return 0;
01144 if (MV1->y_half != MV2->y_half)
01145 return 0;
01146 return 1;
01147 }
|
|
||||||||||||||||||||
|
Definition at line 682 of file vid_coder.c. References pict_image::Cb, mb_structure::Cb, video_codec::cpels, pict_image::Cr, mb_structure::Cr, data, MB_Structure, PictImage, and VidSt. Referenced by CodeOneIntra(), and CodeOneOrTwo(). 00684 {
00685 int n;
00686 register int m;
00687
00688 int x, y;
00689
00690 x = x_curr>>1;
00691 y = y_curr>>1;
00692
00693 for (n = 0; n < (MB_SIZE>>1); n++)
00694 for (m = 0; m < (MB_SIZE>>1); m++) {
00695 data->Cr[n][m] =
00696 (int)(*(image->Cr +x+m + (y+n)*(VidSt->cpels)));
00697 data->Cb[n][m] =
00698 (int)(*(image->Cb +x+m + (y+n)*(VidSt->cpels)));
00699 }
00700 return;
00701 }
|
|
|
Definition at line 114 of file vid_io.c. References InitImage(), video_codec::lines, video_codec::pels, Pict, PictImage, and VidSt. Referenced by code_video(). 00115 {
00116 PictImage *Pict;
00117
00118 Pict = InitImage((VidSt->pels)*(VidSt->lines));
00119
00120 memcpy(Pict->lum, in, (VidSt->pels)*(VidSt->lines));
00121 memcpy(Pict->Cb, in + (VidSt->pels)*(VidSt->lines), (VidSt->pels)*(VidSt->lines)/4);
00122 memcpy(Pict->Cr, in + (VidSt->pels)*(VidSt->lines) + (VidSt->pels)*(VidSt->lines)/4, (VidSt->pels)*(VidSt->lines)/4);
00123
00124 free(in);
00125 return(Pict);
00126 }
|
|
||||||||||||||||||||
|
Definition at line 656 of file vid_coder.c. References data, pict_image::lum, mb_structure::lum, MB_Structure, video_codec::pels, PictImage, and VidSt. Referenced by CodeOneIntra(), and CodeOneOrTwo(). 00657 {
00658 int n;
00659 register int m;
00660
00661 for (n = 0; n < MB_SIZE; n++)
00662 for (m = 0; m < MB_SIZE; m++)
00663 data->lum[n][m] =
00664 (int)(*(image->lum + x+m + (y+n)*(VidSt->pels)));
00665 return;
00666 }
|
|
||||||||||||||||
|
Definition at line 596 of file vid_pred.c. Referenced by FindBiDirChrPredPB(). 00597 {
00598
00599 /* limits taken from C loop in section G5 in H.263 */
00600 *start = mmax(0,(-vec+1)/2);
00601 *stop = mmin(7,7-(vec+1)/2);
00602
00603 return;
00604 }
|
|
||||||||||||||||||||
|
Definition at line 569 of file vid_pred.c. References BiDirPredBlock(), mb_structure::Cb, mb_structure::Cr, FindBiDirChromaLimits(), and MB_Structure. Referenced by MB_Recon_B(), and Predict_B(). 00571 {
00572 int xstart,xstop,ystart,ystop;
00573
00574 FindBiDirChromaLimits(dx,&xstart,&xstop);
00575 FindBiDirChromaLimits(dy,&ystart,&ystop);
00576
00577 BiDirPredBlock(xstart,xstop,ystart,ystop,dx,dy,
00578 &recon_P->Cb[0][0], &pred->Cb[0][0],8);
00579 BiDirPredBlock(xstart,xstop,ystart,ystop,dx,dy,
00580 &recon_P->Cr[0][0], &pred->Cr[0][0],8);
00581
00582 return;
00583 }
|
|
||||||||||||||||||||
|
Definition at line 585 of file vid_pred.c. Referenced by FindBiDirLumPredPB(). 00586 {
00587
00588 /* limits taken from C loop in section G5 in H.263 */
00589 *start = mmax(0,(-vec+1)/2 - nhv*8);
00590 *stop = mmin(7,15-(vec+1)/2 - nhv*8);
00591
00592 return;
00593
00594 }
|
|
||||||||||||||||||||||||||||||||||||||||
|
Definition at line 534 of file vid_pred.c. References BiDirPredBlock(), FindBiDirLimits(), MotionVector, motionvector::x, motionvector::x_half, motionvector::y, and motionvector::y_half. Referenced by MB_Recon_B(), and Predict_B(). 00536 {
00537 int xstart,xstop,ystart,ystop;
00538 int xvec,yvec, mvx, mvy;
00539
00540 mvx = 2*fr->x + fr->x_half;
00541 mvy = 2*fr->y + fr->y_half;
00542
00543 xvec = (bdx == 0 ? (TRB-TRD) * mvx / TRD : TRB * mvx / TRD + bdx - mvx);
00544 yvec = (bdy == 0 ? (TRB-TRD) * mvy / TRD : TRB * mvy / TRD + bdy - mvy);
00545
00546 /* Luma */
00547
00548 FindBiDirLimits(xvec,&xstart,&xstop,nh);
00549 FindBiDirLimits(yvec,&ystart,&ystop,nv);
00550
00551 BiDirPredBlock(xstart,xstop,ystart,ystop,xvec,yvec, recon_P,pred,16);
00552
00553 return;
00554 }
|
|
||||||||||||||||
|
Definition at line 743 of file vid_countbit.c. References MODE_INTRA. Referenced by CodeOneIntra(), and CodeOneOrTwo(). 00744 {
00745
00746 int i,j;
00747 int CBP = 0;
00748 int intra = (Mode == MODE_INTRA || Mode == MODE_INTRA_Q);
00749
00750 /* Set CBP for this Macroblock */
00751 for (i = 0; i < 6; i++) {
00752 for (j = i*ncoeffs + intra; j < (i+1)*ncoeffs; j++) {
00753 if (qcoeff[j]) {
00754 if (i == 0) {CBP |= 32;}
00755 else if (i == 1) {CBP |= 16;}
00756 else if (i == 2) {CBP |= 8;}
00757 else if (i == 3) {CBP |= 4;}
00758 else if (i == 4) {CBP |= 2;}
00759 else if (i == 5) {CBP |= 1;}
00760 else {
00761 fprintf(stderr,"Error in CBP assignment\n");
00762 exit(-1);
00763 }
00764 break;
00765 }
00766 }
00767 }
00768
00769 return CBP;
00770 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 1395 of file vid_pred.c. References mb_structure::Cb, pict_image::Cb, mb_structure::Cr, pict_image::Cr, data, video_codec::long_vectors, MB_Structure, video_codec::mv_outside_frame, video_codec::pels, PictImage, and VidSt. Referenced by MB_Recon_B(), and Predict_B(). 01398 {
01399 int m,n;
01400
01401 int x, y, ofx, ofy, pel,lx;
01402 int xint, yint;
01403 int xh, yh;
01404
01405 lx = ((VidSt->mv_outside_frame) ? (VidSt->pels)/2 + ((VidSt->long_vectors)?32:16) : (VidSt->pels)/2);
01406
01407 x = x_curr>>1;
01408 y = y_curr>>1;
01409
01410 xint = dx>>1;
01411 xh = dx & 1;
01412 yint = dy>>1;
01413 yh = dy & 1;
01414
01415 if (!xh && !yh) {
01416 for (n = 0; n < 8; n++) {
01417 for (m = 0; m < 8; m++) {
01418
01419 ofx = x + xint + m;
01420 ofy = y + yint + n;
01421 pel=*(prev->Cr+ofx + (ofy )*lx);
01422 data->Cr[n][m] = pel;
01423
01424 pel=*(prev->Cb+ofx + (ofy )*lx);
01425 data->Cb[n][m] = pel;
01426 }
01427 }
01428 }
01429 else if (!xh && yh) {
01430 for (n = 0; n < 8; n++) {
01431 for (m = 0; m < 8; m++) {
01432
01433 ofx = x + xint + m;
01434 ofy = y + yint + n;
01435 pel=(*(prev->Cr+ofx + (ofy )*lx)+
01436 *(prev->Cr+ofx + (ofy+yh)*lx) + 1)>>1;
01437
01438 data->Cr[n][m] = pel;
01439
01440 pel=(*(prev->Cb+ofx + (ofy )*lx)+
01441 *(prev->Cb+ofx + (ofy+yh)*lx) + 1)>>1;
01442
01443 data->Cb[n][m] = pel;
01444
01445 }
01446 }
01447 }
01448 else if (xh && !yh) {
01449 for (n = 0; n < 8; n++) {
01450 for (m = 0; m < 8; m++) {
01451
01452 ofx = x + xint + m;
01453 ofy = y + yint + n;
01454 pel=(*(prev->Cr+ofx + (ofy )*lx)+
01455 *(prev->Cr+ofx+xh + (ofy )*lx) + 1)>>1;
01456
01457 data->Cr[n][m] = pel;
01458
01459 pel=(*(prev->Cb+ofx + (ofy )*lx)+
01460 *(prev->Cb+ofx+xh + (ofy )*lx) + 1)>>1;
01461
01462 data->Cb[n][m] = pel;
01463
01464 }
01465 }
01466 }
01467 else { /* xh && yh */
01468 for (n = 0; n < 8; n++) {
01469 for (m = 0; m < 8; m++) {
01470 ofx = x + xint + m;
01471 ofy = y + yint + n;
01472 pel=(*(prev->Cr+ofx + (ofy )*lx)+
01473 *(prev->Cr+ofx+xh + (ofy )*lx)+
01474 *(prev->Cr+ofx + (ofy+yh)*lx)+
01475 *(prev->Cr+ofx+xh + (ofy+yh)*lx)+
01476 2)>>2;
01477
01478 data->Cr[n][m] = pel;
01479
01480 pel=(*(prev->Cb+ofx + (ofy )*lx)+
01481 *(prev->Cb+ofx+xh + (ofy )*lx)+
01482 *(prev->Cb+ofx + (ofy+yh)*lx)+
01483 *(prev->Cb+ofx+xh + (ofy+yh)*lx)+
01484 2)>>2;
01485
01486 data->Cb[n][m] = pel;
01487
01488 }
01489 }
01490 }
01491 return;
01492 }
|
|
||||||||||||||||||||||||||||||||||||||||||||||||
|
Definition at line 494 of file vid_pred.c. References video_codec::long_vectors, MotionVector, video_codec::mv_outside_frame, video_codec::pels, VidSt, motionvector::x, motionvector::x_half, motionvector::y, and motionvector::y_half. Referenced by MB_Recon_B(), and Predict_B(). 00497 {
00498 int i,j;
00499 int xvec,yvec,lx;
00500
00501 lx = ((VidSt->mv_outside_frame) ? (VidSt->pels) + ((VidSt->long_vectors)?64:32) : (VidSt->pels));
00502
00503 /* Luma */
00504 xvec = (TRB)*(2*fr->x + fr->x_half)/TRD + bdx;
00505 yvec = (TRB)*(2*fr->y + fr->y_half)/TRD + bdy;
00506
00507 x_curr += ((comp&1)<<3);
00508 y_curr += ((comp&2)<<2);
00509
00510 for (j = 0; j < bs; j++) {
00511 for (i = 0; i < bs; i++) {
00512 *(pred+i+j*16) = *(prev_ipol + (i+x_curr)*2 + xvec +
00513 ((j+y_curr)*2 + yvec)*lx*2);
00514 }
00515 }
00516
00517 return;
00518 }
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 797 of file vid_pred.c. References video_codec::lines, video_codec::long_vectors, motionvector::min_error, MotionVector, video_codec::mv_outside_frame, video_codec::pels, Point, VidSt, point::x, motionvector::x, motionvector::x_half, point::y, motionvector::y, and motionvector::y_half. Referenced by MotionEstimatePicture(). 00799 {
00800 int i, m, n;
00801 int half_pel;
00802 int start_x, start_y, stop_x, stop_y, new_x, new_y, lx;
00803 int min_pos;
00804 int AE, AE_min;
00805 Point search[9];
00806
00807 start_x = -1;
00808 stop_x = 1;
00809 start_y = -1;
00810 stop_y = 1;
00811
00812 new_x = x + fr->x;
00813 new_y = y + fr->y;
00814
00815 new_x += ((comp&1)<<3);
00816 new_y += ((comp&2)<<2);
00817
00818 lx = ((VidSt->mv_outside_frame) ? (VidSt->pels) + ((VidSt->long_vectors)?64:32) : (VidSt->pels));
00819
00820 /* Make sure that no addressing is outside the frame */
00821 if (!(VidSt->mv_outside_frame)) {
00822 if ((new_x) <= 0)
00823 start_x = 0;
00824 if ((new_y) <= 0)
00825 start_y = 0;
00826 if ((new_x) >= ((VidSt->pels)-bs))
00827 stop_x = 0;
00828 if ((new_y) >= ((VidSt->lines)-bs))
00829 stop_y = 0;
00830 }
00831
00832 search[0].x = 0; search[0].y = 0;
00833 search[1].x = start_x; search[1].y = start_y; /* 1 2 3 */
00834 search[2].x = 0; search[2].y = start_y; /* 4 0 5 */
00835 search[3].x = stop_x; search[3].y = start_y; /* 6 7 8 */
00836 search[4].x = start_x; search[4].y = 0;
00837 search[5].x = stop_x; search[5].y = 0;
00838 search[6].x = start_x; search[6].y = stop_y;
00839 search[7].x = 0; search[7].y = stop_y;
00840 search[8].x = stop_x; search[8].y = stop_y;
00841
00842 AE_min = INT_MAX;
00843 min_pos = 0;
00844 for (i = 0; i < 9; i++) {
00845 AE = 0;
00846 for (n = 0; n < bs; n++) {
00847 for (m = 0; m < bs; m++) {
00848 /* Find absolute error */
00849 half_pel = *(prev + 2*new_x + 2*m + search[i].x +
00850 (2*new_y + 2*n + search[i].y)*lx*2);
00851 AE += abs(half_pel - *(curr + m + n*16));
00852 }
00853 }
00854 /*
00855 * if (i == 0 && fr->x == 0 && fr->y == 0 && bs == 16)
00856 * AE -= PREF_NULL_VEC;
00857 */
00858 if (AE < AE_min) {
00859 AE_min = AE;
00860 min_pos = i;
00861 }
00862 }
00863
00864 /* Store optimal values */
00865 fr->min_error = AE_min;
00866 fr->x_half = search[min_pos].x;
00867 fr->y_half = search[min_pos].y;
00868
00869 return;
00870 }
|
|
||||||||||||||||||||
|
Definition at line 490 of file vid_mot_est.c. References video_codec::pels, and VidSt. Referenced by MotionEstimatePicture(), Predict_B(), and Predict_P(). 00492 {
00493 int n;
00494 register int m;
00495
00496 for (n = 0; n < MB_SIZE; n++)
00497 for (m = 0; m < MB_SIZE; m++)
00498 MB[n][m] = *(image + x+m + (y+n)*(VidSt->pels));
00499 }
|
|
||||||||||||||||||||||||||||||||||||
|
Referenced by Count_sac_BitsVectors(), CountBitsVectors(), and MotionEstimatePicture(). |
|
||||||||||||||||||||||||||||||||
|
Definition at line 888 of file vid_pred.c. References video_codec::long_vectors, MotionVector, video_codec::mv_outside_frame, video_codec::pels, VidSt, motionvector::x, motionvector::x_half, motionvector::y, and motionvector::y_half. Referenced by Predict_P(). 00890 {
00891 int m, n;
00892 int new_x, new_y;
00893 int lx;
00894
00895 lx = ((VidSt->mv_outside_frame) ? (VidSt->pels) + ((VidSt->long_vectors)?64:32) : (VidSt->pels));
00896
00897 new_x = x + fr->x;
00898 new_y = y + fr->y;
00899
00900 new_x += ((comp&1)<<3);
00901 new_y += ((comp&2)<<2);
00902
00903
00904 /* Fill pred. data */
00905 for (n = 0; n < bs; n++) {
00906 for (m = 0; m < bs; m++) {
00907 /* Find interpolated pixel-value */
00908 *(pred + m + n*16) = *(prev + (new_x + m)*2 + fr->x_half +
00909 ((new_y + n)*2 + fr->y_half)*lx*2);
00910 }
00911 }
00912 return;
00913 }
|
|
||||||||||||||||||||||||||||||||
|
Referenced by MB_Recon_P(), and Predict_P(). |
|
|
Definition at line 232 of file vid_io.c. References pict_image::Cb, pict_image::Cr, pict_image::lum, and PictImage. Referenced by close_video_codec(), code_video(), and CodeOneOrTwo(). 00234 {
00235 free(image->lum);
00236 free(image->Cr);
00237 free(image->Cb);
00238 free(image);
00239 }
|
|
|
|
|
||||||||||||
|
Referenced by MB_Decode(). |
|
||||||||||||
|
Definition at line 313 of file vid_dct.c. Referenced by MB_Decode(). 00314 {
00315 int i, j, k, v;
00316 double partial_product;
00317 double tmp[64];
00318 int tmp2[64];
00319 extern int zigzag[8][8];
00320
00321 for (i=0; i<8; i++)
00322 for (j=0; j<8; j++)
00323 tmp2[j+i*8] = *(coeff + zigzag[i][j]);
00324
00325 for (i=0; i<8; i++)
00326 for (j=0; j<8; j++)
00327 {
00328 partial_product = 0.0;
00329
00330 for (k=0; k<8; k++)
00331 partial_product+= c[k][j]*tmp2[8*i+k];
00332
00333 tmp[8*i+j] = partial_product;
00334 }
00335
00336 /* Transpose operation is integrated into address mapping by switching
00337 loop order of i and j */
00338
00339 for (j=0; j<8; j++)
00340 for (i=0; i<8; i++)
00341 {
00342 partial_product = 0.0;
00343
00344 for (k=0; k<8; k++)
00345 partial_product+= c[k][i]*tmp[8*k+j];
00346
00347 v = (int)floor(partial_product+0.5);
00348 block[8*i+j] = (v<-256) ? -256 : ((v>255) ? 255 : v);
00349 }
00350
00351
00352 }
|
|
||||||||||||||||
|
Definition at line 233 of file vid_sac.c. Referenced by Code_sac_Coeff(), Count_sac_BitsMB(), and Count_sac_BitsVectors(). 00234 {
00235 int n=0;
00236
00237 while(1) {
00238 if (table[n++]==value) return n-1;
00239 if (n>max) return -1;
00240 }
00241
00242 }
|
|
|
Definition at line 298 of file vid_dct.c. Referenced by new_video_codec(). 00299 {
00300 int freq, time;
00301 double scale;
00302
00303 for (freq=0; freq < 8; freq++)
00304 {
00305 scale = (freq == 0) ? sqrt(0.125) : 0.5;
00306 for (time=0; time<8; time++)
00307 c[freq][time] = scale*cos((PI/8.0)*freq*(time + 0.5));
00308 }
00309 }
|
|
|
Definition at line 64 of file vid_putbits.c. References video_codec::bytecnt, video_codec::outcnt, and VidSt. Referenced by code_video().
|
|
||||||||||||||||||||
|
Definition at line 95 of file vid_ratectrl.c. References video_codec::B_prev, video_codec::B_target, video_codec::global_adj, mmax, mmin, and VidSt. Referenced by CodeOneOrTwo(). 00100 : */ 00101 /* int bitcount; */ 00102 /* AddBitsPicture(bits); */ 00103 /* bitcount = bits->total; */ 00104 00105 { 00106 int newQP; 00107 00108 if (pict_type == PCT_INTER) { 00109 00110 (VidSt->B_target) = bit_rate / target_frame_rate; 00111 00112 /* compute picture buffer descrepency as of the previous picture */ 00113 00114 if ((VidSt->B_prev) != 0.0) { 00115 (VidSt->global_adj) = ((VidSt->B_prev) - (VidSt->B_target)) / (2*(VidSt->B_target)); 00116 } 00117 else { 00118 (VidSt->global_adj) = (float)0.0; 00119 } 00120 newQP = (int)(QP_mean * (1 + (VidSt->global_adj)) + (float)0.5); 00121 newQP = mmax(1,mmin(31,newQP)); 00122 } 00123 else if (pict_type == PCT_INTRA) { 00124 fprintf(stderr,"No need to call InititializeQuantizer() for Intra picture\n"); 00125 exit(-1); 00126 } 00127 else { 00128 fprintf(stderr,"Error (InitializePictureRate): picture type unkown.\n"); 00129 exit(-1); 00130 } 00131 #if 1 00132 printf("Global adj = %.2f\n", (VidSt->global_adj)); 00133 printf("meanQP = %.2f newQP = %d\n", QP_mean, newQP); 00134 #endif 00135 fprintf(stdout,"Target no. of bits: %.2f\n", (VidSt->B_target)); 00136 00137 return newQP; 00138 }
|
|
|
Definition at line 85 of file vid_ratectrl.c. References video_codec::B_prev, and VidSt. Referenced by code_video().
|
|
|
Definition at line 191 of file vid_io.c. References PictImage. Referenced by code_video(), CodeOneIntra(), CodeOneOrTwo(), and FillImage(). 00192 {
00193 PictImage *new;
00194
00195 if ((new = (PictImage *)malloc(sizeof(PictImage))) == NULL) {
00196 fprintf(stderr,"Couldn't allocate (PictImage *)\n");
00197 exit(-1);
00198 }
00199 if ((new->lum = (unsigned char *)malloc(sizeof(char)*size))
00200 == NULL) {
00201 fprintf(stderr,"Couldn't allocate memory for luminance\n");
00202 exit(-1);
00203 }
00204 if ((new->Cr = (unsigned char *)malloc(sizeof(char)*size/4))
00205 == NULL) {
00206 fprintf(stderr,"Couldn't allocate memory for Cr\n");
00207 exit(-1);
00208 }
00209 if ((new->Cb = (unsigned char *)malloc(sizeof(char)*size/4))
00210 == NULL) {
00211 fprintf(stderr,"Couldn't allocate memory for Cb\n");
00212 exit(-1);
00213 }
00214
00215 return new;
00216 }
|
|
||||||||||||||||
|
|
|
||||||||||||||||
|
Definition at line 788 of file vid_coder.c. Referenced by CodeOneOrTwo(). 00789 {
00790 unsigned char *ipol_image, *ii, *oo;
00791 int i,j;
00792
00793 ipol_image = (unsigned char *)malloc(sizeof(char)*width*height*4);
00794 ii = ipol_image;
00795 oo = image;
00796
00797 /* main image */
00798 for (j = 0; j < height-1; j++) {
00799 for (i = 0; i < width-1; i++) {
00800 *(ii + (i<<1)) = *(oo + i);
00801 *(ii + (i<<1)+1) = (*(oo + i) + *(oo + i + 1) + 1)>>1;
00802 *(ii + (i<<1)+(width<<1)) = (*(oo + i) + *(oo + i + width) + 1)>>1;
00803 *(ii + (i<<1)+1+(width<<1)) = (*(oo+i) + *(oo+i+1) +
00804 *(oo+i+width) + *(oo+i+1+width) + 2)>>2;
00805 }
00806 /* last pels on each line */
00807 *(ii+ (width<<1) - 2) = *(oo + width - 1);
00808 *(ii+ (width<<1) - 1) = *(oo + width - 1);
00809 *(ii+ (width<<1)+ (width<<1)-2) = (*(oo+width-1)+*(oo+width+width-1)+1)>>1;
00810 *(ii+ (width<<1)+ (width<<1)-1) = (*(oo+width-1)+*(oo+width+width-1)+1)>>1;
00811 ii += (width<<2);
00812 oo += width;
00813 }
00814
00815 /* last lines */
00816 for (i = 0; i < width-1; i++) {
00817 *(ii+ (i<<1)) = *(oo + i);
00818 *(ii+ (i<<1)+1) = (*(oo + i) + *(oo + i + 1) + 1)>>1;
00819 *(ii+ (width<<1)+ (i<<1)) = *(oo + i);
00820 *(ii+ (width<<1)+ (i<<1)+1) = (*(oo + i) + *(oo + i + 1) + 1)>>1;
00821
00822 }
00823
00824 /* bottom right corner pels */
00825 *(ii + (width<<1) - 2) = *(oo + width -1);
00826 *(ii + (width<<1) - 1) = *(oo + width -1);
00827 *(ii + (width<<2) - 2) = *(oo + width -1);
00828 *(ii + (width<<2) - 1) = *(oo + width -1);
00829
00830 return ipol_image;
00831 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 330 of file vid_mot_est.c. Referenced by MotionEstimation(). 00332 {
00333 unsigned char *res = (unsigned char *)malloc(sizeof(char)*x_size*y_size);
00334 unsigned char *in;
00335 unsigned char *out;
00336 int i = x_size;
00337 int j = y_size;
00338
00339 in = im + (y*lx) + x;
00340 out = res;
00341
00342 while (j--) {
00343 while (i--)
00344 *out++ = *in++;
00345 i = x_size;
00346 in += lx - x_size;
00347 };
00348 return res;
00349 }
|
|
||||||||||||||||||||||||
|
Definition at line 997 of file vid_coder.c. Referenced by CodeOneOrTwo(). 00999 {
01000 int i,j;
01001 unsigned char *p1,*p2,*p3,*p4;
01002 unsigned char *o1,*o2,*o3,*o4;
01003
01004 /* center image */
01005 p1 = dst;
01006 o1 = src;
01007 for (j = 0; j < height;j++) {
01008 memcpy(p1,o1,width);
01009 p1 += width + (edge<<1);
01010 o1 += width;
01011 }
01012
01013 /* left and right edges */
01014 p1 = dst-1;
01015 o1 = src;
01016 for (j = 0; j < height;j++) {
01017 for (i = 0; i < edge; i++) {
01018 *(p1 - i) = *o1;
01019 *(p1 + width + i + 1) = *(o1 + width - 1);
01020 }
01021 p1 += width + (edge<<1);
01022 o1 += width;
01023 }
01024
01025 /* top and bottom edges */
01026 p1 = dst;
01027 p2 = dst + (width + (edge<<1))*(height-1);
01028 o1 = src;
01029 o2 = src + width*(height-1);
01030 for (j = 0; j < edge;j++) {
01031 p1 = p1 - (width + (edge<<1));
01032 p2 = p2 + (width + (edge<<1));
01033 for (i = 0; i < width; i++) {
01034 *(p1 + i) = *(o1 + i);
01035 *(p2 + i) = *(o2 + i);
01036 }
01037 }
01038
01039 /* corners */
01040 p1 = dst - (width+(edge<<1)) - 1;
01041 p2 = p1 + width + 1;
01042 p3 = dst + (width+(edge<<1))*(height)-1;
01043 p4 = p3 + width + 1;
01044
01045 o1 = src;
01046 o2 = o1 + width - 1;
01047 o3 = src + width*(height-1);
01048 o4 = o3 + width - 1;
01049 for (j = 0; j < edge; j++) {
01050 for (i = 0; i < edge; i++) {
01051 *(p1 - i) = *o1;
01052 *(p2 + i) = *o2;
01053 *(p3 - i) = *o3;
01054 *(p4 + i) = *o4;
01055 }
01056 p1 = p1 - (width + (edge<<1));
01057 p2 = p2 - (width + (edge<<1));
01058 p3 = p3 + width + (edge<<1);
01059 p4 = p4 + width + (edge<<1);
01060 }
01061 }
|
|
|
Definition at line 1118 of file vid_countbit.c. References MotionVector, motionvector::x, motionvector::x_half, motionvector::y, and motionvector::y_half. Referenced by CodeOneOrTwo(). 01119 {
01120 MV->x = NO_VEC;
01121 MV->y = NO_VEC;
01122 MV->x_half = 0;
01123 MV->y_half = 0;
01124 return;
01125 }
|
|
||||||||||||||||||||
|
Definition at line 566 of file vid_coder.c. References mb_structure::Cb, mb_structure::Cr, Dequant(), idct(), idctref(), mb_structure::lum, and MB_Structure. Referenced by CodeOneIntra(), and CodeOneOrTwo(). 00567 {
00568 int i, j, k, l, row, col;
00569 int *iblock;
00570 int *qcoeff_ind;
00571 int *rcoeff, *rcoeff_ind;
00572
00573 if ((iblock = (int *)malloc(sizeof(int)*64)) == NULL) {
00574 fprintf(stderr,"MB_Coder: Could not allocate space for iblock\n");
00575 exit(-1);
00576 }
00577 if ((rcoeff = (int *)malloc(sizeof(int)*384)) == NULL) {
00578 fprintf(stderr,"MB_Coder: Could not allocate space for rcoeff\n");
00579 exit(-1);
00580 }
00581
00582 /* For control purposes */
00583 /* Zero data */
00584 for (i = 0; i < 16; i++)
00585 for (j = 0; j < 16; j++)
00586 mb_recon->lum[j][i] = 0;
00587 for (i = 0; i < 8; i++)
00588 for (j = 0; j < 8; j++) {
00589 mb_recon->Cb[j][i] = 0;
00590 mb_recon->Cr[j][i] = 0;
00591 }
00592
00593 qcoeff_ind = qcoeff;
00594 rcoeff_ind = rcoeff;
00595
00596 for (k=0;k<16;k+=8) {
00597 for (l=0;l<16;l+=8) {
00598 Dequant(qcoeff_ind,rcoeff_ind,QP,I);
00599 #ifndef FASTIDCT
00600 idctref(rcoeff_ind,iblock);
00601 #else
00602 idct(rcoeff_ind,iblock);
00603 #endif
00604 qcoeff_ind += 64;
00605 rcoeff_ind += 64;
00606 for (i=k,row=0;row<64;i++,row+=8) {
00607 for (j=l,col=0;col<8;j++,col++) {
00608 mb_recon->lum[i][j] = *(iblock+row+col);
00609 }
00610 }
00611 }
00612 }
00613 Dequant(qcoeff_ind,rcoeff_ind,QP,I);
00614 #ifndef FASTIDCT
00615 idctref(rcoeff_ind,iblock);
00616 #else
00617 idct(rcoeff_ind,iblock);
00618 #endif
00619 qcoeff_ind += 64;
00620 rcoeff_ind += 64;
00621 for (i=0;i<8;i++) {
00622 for (j=0;j<8;j++) {
00623 mb_recon->Cb[i][j] = *(iblock+i*8+j);
00624 }
00625 }
00626 Dequant(qcoeff_ind,rcoeff_ind,QP,I);
00627 #ifndef FASTIDCT
00628 idctref(rcoeff_ind,iblock);
00629 #else
00630 idct(rcoeff_ind,iblock);
00631 #endif
00632 for (i=0;i<8;i++) {
00633 for (j=0;j<8;j++) {
00634 mb_recon->Cr[i][j] = *(iblock+i*8+j);
00635 }
00636 }
00637 free(iblock);
00638 free(rcoeff);
00639 return 0;
00640 }
|
|
||||||||||||||||
|
Definition at line 501 of file vid_coder.c. References mb_structure::Cb, mb_structure::Cr, Dct(), mb_structure::lum, MB_Structure, and Quant(). Referenced by CodeOneIntra(), and CodeOneOrTwo(). 00502 {
00503 int i, j, k, l, row, col;
00504 int fblock[64];
00505 int coeff[384];
00506 int *coeff_ind;
00507 int *qcoeff;
00508 int *qcoeff_ind;
00509
00510 if ((qcoeff=(int *)malloc(sizeof(int)*384)) == 0) {
00511 fprintf(stderr,"mb_encode(): Couldn't allocate qcoeff.\n");
00512 exit(-1);
00513 }
00514
00515 coeff_ind = coeff;
00516 qcoeff_ind = qcoeff;
00517 for (k=0;k<16;k+=8) {
00518 for (l=0;l<16;l+=8) {
00519 for (i=k,row=0;row<64;i++,row+=8) {
00520 for (j=l,col=0;col<8;j++,col++) {
00521 *(fblock+row+col) = mb_orig->lum[i][j];
00522 }
00523 }
00524 Dct(fblock,coeff_ind);
00525 Quant(coeff_ind,qcoeff_ind,QP,I);
00526 coeff_ind += 64;
00527 qcoeff_ind += 64;
00528 }
00529 }
00530 for (i=0;i<8;i++) {
00531 for (j=0;j<8;j++) {
00532 *(fblock+i*8+j) = mb_orig->Cb[i][j];
00533 }
00534 }
00535 Dct(fblock,coeff_ind);
00536 Quant(coeff_ind,qcoeff_ind,QP,I);
00537 coeff_ind += 64;
00538 qcoeff_ind += 64;
00539
00540 for (i=0;i<8;i++) {
00541 for (j=0;j<8;j++) {
00542 *(fblock+i*8+j) = mb_orig->Cr[i][j];
00543 }
00544 }
00545 Dct(fblock,coeff_ind);
00546 Quant(coeff_ind,qcoeff_ind,QP,I);
00547
00548 return qcoeff;
00549 }
|
|
||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||||||||||
|
Definition at line 360 of file vid_pred.c. References mb_structure::Cb, mb_structure::Cr, FindBiDirChrPredPB(), FindBiDirLumPredPB(), FindChromBlock_P(), FindForwLumPredPB(), mb_structure::lum, MB_SIZE, MB_Structure, motionvector::Mode, MotionVector, PictImage, roundtab, sign, motionvector::x, motionvector::x_half, motionvector::y, and motionvector::y_half. Referenced by CodeOneOrTwo(). 00364 {
00365 int i,j,k;
00366 int dx, dy, bdx, bdy, mvx, mvy, xvec, yvec;
00367 MB_Structure *recon_B = (MB_Structure *)malloc(sizeof(MB_Structure));
00368 MB_Structure *pred = (MB_Structure *)malloc(sizeof(MB_Structure));
00369 MotionVector *f[5];
00370
00371 for (k = 0; k <= 4; k++)
00372 f[k] = MV[k][y/MB_SIZE+1][x/MB_SIZE+1];
00373
00374 bdx = MV[5][y/MB_SIZE+1][x/MB_SIZE+1]->x;
00375 bdy = MV[5][y/MB_SIZE+1][x/MB_SIZE+1]->y;
00376
00377 if (f[0]->Mode == MODE_INTER4V) { /* Mode INTER4V */
00378 /* Find forward prediction */
00379
00380 /* Luma */
00381 FindForwLumPredPB(prev_ipol,x,y,f[1],&pred->lum[0][0],TRD,TRB,bdx,bdy,8,0);
00382 FindForwLumPredPB(prev_ipol,x,y,f[2],&pred->lum[0][8],TRD,TRB,bdx,bdy,8,1);
00383 FindForwLumPredPB(prev_ipol,x,y,f[3],&pred->lum[8][0],TRD,TRB,bdx,bdy,8,2);
00384 FindForwLumPredPB(prev_ipol,x,y,f[4],&pred->lum[8][8],TRD,TRB,bdx,bdy,8,3);
00385
00386 /* chroma vectors are sum of B luma vectors divided and rounded */
00387 xvec = yvec = 0;
00388 for (k = 1; k <= 4; k++) {
00389 xvec += TRB*(2*f[k]->x + f[k]->x_half)/TRD + bdx;
00390 yvec += TRB*(2*f[k]->y + f[k]->y_half)/TRD + bdy;
00391 }
00392
00393 /* round values according to TABLE 16/H.263 */
00394 dx = sign(xvec)*(roundtab[abs(xvec)%16] + (abs(xvec)/16)*2);
00395 dy = sign(yvec)*(roundtab[abs(yvec)%16] + (abs(yvec)/16)*2);
00396
00397 FindChromBlock_P(x, y, dx, dy, prev_image, pred);
00398
00399 /* Find bidirectional prediction */
00400 FindBiDirLumPredPB(&recon_P->lum[0][0], f[1], &pred->lum[0][0],
00401 TRD, TRB, bdx, bdy, 0, 0);
00402 FindBiDirLumPredPB(&recon_P->lum[0][8], f[2], &pred->lum[0][8],
00403 TRD, TRB, bdx, bdy, 1, 0);
00404 FindBiDirLumPredPB(&recon_P->lum[8][0], f[3], &pred->lum[8][0],
00405 TRD, TRB, bdx, bdy, 0, 1);
00406 FindBiDirLumPredPB(&recon_P->lum[8][8], f[4], &pred->lum[8][8],
00407 TRD, TRB, bdx, bdy, 1, 1);
00408
00409 /* chroma vectors are sum of B luma vectors divided and rounded */
00410 xvec = yvec = 0;
00411 for (k = 1; k <= 4; k++) {
00412 mvx = 2*f[k]->x + f[k]->x_half;
00413 mvy = 2*f[k]->y + f[k]->y_half;
00414 xvec += bdx == 0 ? (TRB-TRD) * mvx / TRD : TRB * mvx / TRD + bdx - mvx;
00415 yvec += bdy == 0 ? (TRB-TRD) * mvy / TRD : TRB * mvy / TRD + bdy - mvy;
00416 }
00417
00418 /* round values according to TABLE 16/H.263 */
00419 dx = sign(xvec)*(roundtab[abs(xvec)%16] + (abs(xvec)/16)*2);
00420 dy = sign(yvec)*(roundtab[abs(yvec)%16] + (abs(yvec)/16)*2);
00421
00422 FindBiDirChrPredPB(recon_P, dx, dy, pred);
00423
00424 }
00425 else { /* Mode INTER or INTER_Q */
00426 /* Find forward prediction */
00427
00428 FindForwLumPredPB(prev_ipol,x,y,f[0],&pred->lum[0][0],TRD,TRB,
00429 bdx,bdy,16,0);
00430
00431 xvec = 4 * (TRB*(2*f[0]->x + f[0]->x_half) / TRD + bdx);
00432 yvec = 4 * (TRB*(2*f[0]->y + f[0]->y_half) / TRD + bdy);
00433 /* round values according to TABLE 16/H.263 */
00434 dx = sign(xvec)*(roundtab[abs(xvec)%16] + (abs(xvec)/16)*2);
00435 dy = sign(yvec)*(roundtab[abs(yvec)%16] + (abs(yvec)/16)*2);
00436
00437 FindChromBlock_P(x, y, dx, dy, prev_image, pred);
00438
00439 /* Find bidirectional prediction */
00440 FindBiDirLumPredPB(&recon_P->lum[0][0], f[0], &pred->lum[0][0],
00441 TRD, TRB, bdx, bdy, 0, 0);
00442 FindBiDirLumPredPB(&recon_P->lum[0][8], f[0], &pred->lum[0][8],
00443 TRD, TRB, bdx, bdy, 1, 0);
00444 FindBiDirLumPredPB(&recon_P->lum[8][0], f[0], &pred->lum[8][0],
00445 TRD, TRB, bdx, bdy, 0, 1);
00446 FindBiDirLumPredPB(&recon_P->lum[8][8], f[0], &pred->lum[8][8],
00447 TRD, TRB, bdx, bdy, 1, 1);
00448
00449 /* chroma vectors */
00450 mvx = 2*f[0]->x + f[0]->x_half;
00451 xvec = bdx == 0 ? (TRB-TRD) * mvx / TRD : TRB * mvx / TRD + bdx - mvx;
00452 xvec *= 4;
00453
00454 mvy = 2*f[0]->y + f[0]->y_half;
00455 yvec = bdy == 0 ? (TRB-TRD) * mvy / TRD : TRB * mvy / TRD + bdy - mvy;
00456 yvec *= 4;
00457
00458 /* round values according to TABLE 16/H.263 */
00459 dx = sign(xvec)*(roundtab[abs(xvec)%16] + (abs(xvec)/16)*2);
00460 dy = sign(yvec)*(roundtab[abs(yvec)%16] + (abs(yvec)/16)*2);
00461
00462 FindBiDirChrPredPB(recon_P, dx, dy, pred);
00463
00464 }
00465
00466 /* Reconstruction */
00467 for (j = 0; j < MB_SIZE; j++)
00468 for (i = 0; i < MB_SIZE; i++)
00469 recon_B->lum[j][i] = pred->lum[j][i] + diff->lum[j][i];
00470
00471 for (j = 0; j < MB_SIZE>>1; j++)
00472 for (i = 0; i < MB_SIZE>>1; i++) {
00473 recon_B->Cr[j][i] = pred->Cr[j][i] + diff->Cr[j][i];
00474 recon_B->Cb[j][i] = pred->Cb[j][i] + diff->Cb[j][i];
00475 }
00476
00477 free(pred);
00478 return recon_B;
00479 }
|
|
||||||||||||||||||||||||||||||||
|
Referenced by CodeOneOrTwo(). |
|
||||||||||||
|
Definition at line 1535 of file vid_pred.c. Referenced by CodeOneOrTwo(). 01536 {
01537
01538 if (Mode == MODE_INTRA) {
01539 if(dquant!=0)
01540 return MODE_INTRA_Q;
01541 else
01542 return MODE_INTRA;
01543 }
01544 else{
01545 if(dquant!=0)
01546 return MODE_INTER_Q;
01547 else
01548 return Mode;
01549 }
01550 }
|
|
||||||||||||||||||||||||||||
|
Referenced by CodeOneOrTwo(). |
|
||||||||||||||||||||||||||||||||||||||||
|
Referenced by MotionEstimatePicture(), and NextTwoPB(). |
|
||||||||||||||||||||||||||||
|
Definition at line 75 of file vid_main.c. References video_codec::advanced, video_codec::lines, video_codec::long_vectors, pict_image::lum, MB_SIZE, MBC, MBR, motionvector::min_error, MotionEstimation(), MotionVector, video_codec::mv_outside_frame, video_codec::pels, PictImage, SAD_MB_Bidir(), VidSt, motionvector::x, and motionvector::y. Referenced by code_video(). 00077 {
00078 int adv_is_on = 0, mof_is_on = 0, lv_is_on = 0;
00079 int psad1, psad2, bsad, psad;
00080 MotionVector *MV[6][MBR+1][MBC+2];
00081 MotionVector *mvp, *mvbf, *mvbb;
00082 int x,y;
00083 int i,j,k,tmp;
00084
00085 /* Temporarily disable some options to simplify motion estimation */
00086 if ((VidSt->advanced)) {
00087 (VidSt->advanced) = OFF;
00088 adv_is_on = ON;
00089 }
00090 if ((VidSt->mv_outside_frame)) {
00091 (VidSt->mv_outside_frame) = OFF;
00092 mof_is_on = ON;
00093 }
00094 if ((VidSt->long_vectors)) {
00095 (VidSt->long_vectors) = OFF;
00096 lv_is_on = ON;
00097 }
00098
00099 for (j = 1; j <= ((VidSt->lines)>>4); j++)
00100 for (i = 1; i <= ((VidSt->pels)>>4); i++)
00101 for (k = 0; k < 3; k++) {
00102 MV[k][j][i] = (MotionVector *)calloc(1,sizeof(MotionVector));
00103 /* calloc to avoid Checker warnings about reading of
00104 unitizalized memory in the memcpy's below */
00105 }
00106
00107 mvbf = (MotionVector *)malloc(sizeof(MotionVector));
00108 mvbb = (MotionVector *)malloc(sizeof(MotionVector));
00109
00110 psad = 0;
00111 psad1 = 0;
00112 psad2 = 0;
00113 bsad = 0;
00114
00115 /* Integer motion estimation */
00116 for ( j = 1; j < (VidSt->lines)/MB_SIZE - 1; j++) {
00117 for ( i = 1; i < (VidSt->pels)/MB_SIZE - 1 ; i++) {
00118 x = i*MB_SIZE;
00119 y = j*MB_SIZE;
00120
00121 /* picture order: prev -> next1 -> next2 */
00122 /* next1 and next2 can be coded as PB or PP */
00123 /* prev is the previous encoded picture */
00124
00125 /* computes vectors (prev <- next2) */
00126 MotionEstimation(next2->lum,prev->lum,x,y,0,0,seek_dist,MV,&tmp);
00127 if (MV[0][j+1][i+1]->x == 0 && MV[0][j+1][i+1]->y == 0)
00128 MV[0][j+1][i+1]->min_error += PREF_NULL_VEC;
00129 /* not necessary to prefer zero vector here */
00130 memcpy(MV[2][j+1][i+1],MV[0][j+1][i+1],sizeof(MotionVector));
00131
00132 /* computes sad(prev <- next1) */
00133 MotionEstimation(next1->lum,prev->lum,x,y,0,0,seek_dist,MV,&tmp);
00134 if (MV[0][j+1][i+1]->x == 0 && MV[0][j+1][i+1]->y == 0)
00135 MV[0][j+1][i+1]->min_error += PREF_NULL_VEC;
00136 memcpy(MV[1][j+1][i+1],MV[0][j+1][i+1],sizeof(MotionVector));
00137
00138 /* computes vectors for (next1 <- next2) */
00139 MotionEstimation(next2->lum,next1->lum,x,y,0,0,seek_dist,MV,&tmp);
00140 if (MV[0][j+1][i+1]->x == 0 && MV[0][j+1][i+1]->y == 0)
00141 MV[0][j+1][i+1]->min_error += PREF_NULL_VEC;
00142
00143 /* scales vectors for (prev <- next2 ) */
00144 mvp = MV[2][j+1][i+1];
00145 mvbf->x = bskip * mvp->x / (bskip + pskip);
00146 mvbb->x = - pskip * mvp->x / (bskip + pskip);
00147 mvbf->y = bskip * mvp->y / (bskip + pskip);
00148 mvbb->y = - pskip * mvp->y / (bskip + pskip);
00149
00150 psad1 += MV[0][j+1][i+1]->min_error;
00151 psad2 += MV[1][j+1][i+1]->min_error;
00152 psad += mvp->min_error;
00153
00154 /* computes sad(prev <- next1 -> next2) */
00155 bsad += SAD_MB_Bidir(next1->lum + x + y*(VidSt->pels),
00156 next2->lum + x + mvbb->x + (y + mvbb->y)*(VidSt->pels),
00157 prev->lum + x + mvbf->x + (y + mvbf->y)*(VidSt->pels),
00158 (VidSt->pels), INT_MAX);
00159 }
00160 }
00161
00162 for (j = 1; j <= ((VidSt->lines)>>4); j++)
00163 for (i = 1; i <= ((VidSt->pels)>>4); i++)
00164 for (k = 0; k < 3; k++)
00165 free(MV[k][j][i]);
00166 free(mvbf);
00167 free(mvbb);
00168
00169 /* restore advanced parameters */
00170 (VidSt->advanced) = adv_is_on;
00171 (VidSt->mv_outside_frame) = mof_is_on;
00172 (VidSt->long_vectors) = lv_is_on;
00173
00174 /* do the decision */
00175 if (bsad < (psad1+psad2)/2)
00176 fprintf(stdout,"Chose PB - bsad %d, psad %d\n",
00177 bsad, (psad1+psad2)/2);
00178 else
00179 fprintf(stdout,"Chose PP - bsad %d, psad %d\n",
00180 bsad, (psad1+psad2)/2);
00181
00182 if (bsad < (psad1 + psad2)/2)
00183 return 1;
00184 else
00185 return 0;
00186 }
|
|
||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||||||||||
|
Definition at line 156 of file vid_pred.c. References pict_image::Cb, mb_structure::Cb, video_codec::cpels, pict_image::Cr, mb_structure::Cr, FindBiDirChrPredPB(), FindBiDirLumPredPB(), FindChromBlock_P(), FindForwLumPredPB(), FindMB(), video_codec::lines, mb_structure::lum, pict_image::lum, MB_SIZE, MB_Structure, motionvector::Mode, MODE_INTRA, MotionVector, video_codec::mv_outside_frame, video_codec::pels, PictImage, roundtab, SAD_MB_integer(), sign, VidSt, motionvector::x, motionvector::x_half, motionvector::y, and motionvector::y_half. Referenced by CodeOneOrTwo(). 00160 {
00161 int i,j,k;
00162 int dx, dy, sad, sad_min=INT_MAX, curr[16][16], bdx=0, bdy=0;
00163 MB_Structure *p_err = (MB_Structure *)malloc(sizeof(MB_Structure));
00164 MB_Structure *pred = (MB_Structure *)malloc(sizeof(MB_Structure));
00165 MotionVector *f[5];
00166 int xvec, yvec, mvx, mvy;
00167
00168 for (k = 0; k <= 4; k++)
00169 f[k] = MV[k][y/MB_SIZE+1][x/MB_SIZE+1];
00170
00171 /* Find MB in current image */
00172 FindMB(x, y, curr_image->lum, curr);
00173
00174 if (f[0]->Mode == MODE_INTER4V) { /* Mode INTER4V */
00175 /* Find forward prediction */
00176
00177 /* Luma */
00178 for (j = -DEF_PBDELTA_WIN; j <= DEF_PBDELTA_WIN; j++) {
00179 for (i = -DEF_PBDELTA_WIN; i <= DEF_PBDELTA_WIN; i++) {
00180
00181 FindForwLumPredPB(prev_ipol, x, y, f[1], &pred->lum[0][0],
00182 TRD, TRB, i, j, 8, 0);
00183 FindForwLumPredPB(prev_ipol, x, y, f[2], &pred->lum[0][8],
00184 TRD, TRB, i, j, 8, 1);
00185 FindForwLumPredPB(prev_ipol, x, y, f[3], &pred->lum[8][0],
00186 TRD, TRB, i, j, 8, 2);
00187 FindForwLumPredPB(prev_ipol, x, y, f[4], &pred->lum[8][8],
00188 TRD, TRB, i, j, 8, 3);
00189
00190 sad = SAD_MB_integer(&curr[0][0],&pred->lum[0][0], 16,INT_MAX);
00191 if (i == 0 && j == 0)
00192 sad -= PREF_PBDELTA_NULL_VEC;
00193 if (sad < sad_min) {
00194 sad_min = sad;
00195 bdx = i;
00196 bdy = j;
00197 }
00198 }
00199 }
00200
00201 FindForwLumPredPB(prev_ipol,x,y,f[1],&pred->lum[0][0],TRD,TRB,bdx,bdy,8,0);
00202 FindForwLumPredPB(prev_ipol,x,y,f[2],&pred->lum[0][8],TRD,TRB,bdx,bdy,8,1);
00203 FindForwLumPredPB(prev_ipol,x,y,f[3],&pred->lum[8][0],TRD,TRB,bdx,bdy,8,2);
00204 FindForwLumPredPB(prev_ipol,x,y,f[4],&pred->lum[8][8],TRD,TRB,bdx,bdy,8,3);
00205
00206 /* chroma vectors are sum of B luma vectors divided and rounded */
00207 xvec = yvec = 0;
00208 for (k = 1; k <= 4; k++) {
00209 xvec += TRB*(2*f[k]->x + f[k]->x_half)/TRD + bdx;
00210 yvec += TRB*(2*f[k]->y + f[k]->y_half)/TRD + bdy;
00211 }
00212
00213 /* round values according to TABLE 16/H.263 */
00214 dx = sign(xvec)*(roundtab[abs(xvec)%16] + (abs(xvec)/16)*2);
00215 dy = sign(yvec)*(roundtab[abs(yvec)%16] + (abs(yvec)/16)*2);
00216
00217 FindChromBlock_P(x, y, dx, dy, prev_image, pred);
00218
00219 /* Find bidirectional prediction */
00220 FindBiDirLumPredPB(&recon_P->lum[0][0], f[1], &pred->lum[0][0],
00221 TRD, TRB, bdx, bdy, 0, 0);
00222 FindBiDirLumPredPB(&recon_P->lum[0][8], f[2], &pred->lum[0][8],
00223 TRD, TRB, bdx, bdy, 1, 0);
00224 FindBiDirLumPredPB(&recon_P->lum[8][0], f[3], &pred->lum[8][0],
00225 TRD, TRB, bdx, bdy, 0, 1);
00226 FindBiDirLumPredPB(&recon_P->lum[8][8], f[4], &pred->lum[8][8],
00227 TRD, TRB, bdx, bdy, 1, 1);
00228
00229 /* chroma vectors are sum of B luma vectors divided and rounded */
00230 xvec = yvec = 0;
00231 for (k = 1; k <= 4; k++) {
00232 mvx = 2*f[k]->x + f[k]->x_half;
00233 mvy = 2*f[k]->y + f[k]->y_half;
00234 xvec += bdx == 0 ? (TRB-TRD) * mvx / TRD : TRB * mvx / TRD + bdx - mvx;
00235 yvec += bdy == 0 ? (TRB-TRD) * mvy / TRD : TRB * mvy / TRD + bdy - mvy;
00236 }
00237
00238 /* round values according to TABLE 16/H.263 */
00239 dx = sign(xvec)*(roundtab[abs(xvec)%16] + (abs(xvec)/16)*2);
00240 dy = sign(yvec)*(roundtab[abs(yvec)%16] + (abs(yvec)/16)*2);
00241
00242 FindBiDirChrPredPB(recon_P, dx, dy, pred);
00243 }
00244
00245 else { /* Mode INTER or INTER_Q */
00246 /* Find forward prediction */
00247
00248 for (j = -DEF_PBDELTA_WIN; j <= DEF_PBDELTA_WIN; j++) {
00249 for (i = -DEF_PBDELTA_WIN; i <= DEF_PBDELTA_WIN; i++) {
00250
00251 dx = i; dy = j;
00252 /* To keep things simple I turn off PB delta vectors at the edges */
00253 if (!(VidSt->mv_outside_frame)) {
00254 if (x == 0) dx = 0;
00255 if (x == (VidSt->pels) - MB_SIZE) dx = 0;
00256 if (y == 0) dy = 0;
00257 if (y == (VidSt->lines) - MB_SIZE) dy = 0;
00258 }
00259
00260 if (f[0]->Mode == MODE_INTRA || f[0]->Mode == MODE_INTRA_Q) {
00261 dx = dy = 0;
00262 }
00263
00264 if (f[0]->x == 0 && f[0]->y == 0 &&
00265 f[0]->x_half == 0 && f[0]->y_half == 0) {
00266 dx = dy = 0;
00267 }
00268
00269 FindForwLumPredPB(prev_ipol, x, y, f[0], &pred->lum[0][0],
00270 TRD, TRB, dx, dy, 16, 0);
00271
00272 sad = SAD_MB_integer(&curr[0][0],&pred->lum[0][0], 16, INT_MAX);
00273 if (i == 0 && j == 0)
00274 sad -= PREF_PBDELTA_NULL_VEC;
00275 if (sad < sad_min) {
00276 sad_min = sad;
00277 bdx = dx;
00278 bdy = dy;
00279 }
00280 }
00281 }
00282 FindForwLumPredPB(prev_ipol,x,y,f[0],&pred->lum[0][0],TRD,TRB,
00283 bdx,bdy,16,0);
00284
00285 xvec = 4 * (TRB*(2*f[0]->x + f[0]->x_half) / TRD + bdx);
00286 yvec = 4 * (TRB*(2*f[0]->y + f[0]->y_half) / TRD + bdy);
00287 /* round values according to TABLE 16/H.263 */
00288 dx = sign(xvec)*(roundtab[abs(xvec)%16] + (abs(xvec)/16)*2);
00289 dy = sign(yvec)*(roundtab[abs(yvec)%16] + (abs(yvec)/16)*2);
00290
00291 FindChromBlock_P(x, y, dx, dy, prev_image, pred);
00292
00293 /* Find bidirectional prediction */
00294 FindBiDirLumPredPB(&recon_P->lum[0][0], f[0], &pred->lum[0][0],
00295 TRD, TRB, bdx, bdy, 0, 0);
00296 FindBiDirLumPredPB(&recon_P->lum[0][8], f[0], &pred->lum[0][8],
00297 TRD, TRB, bdx, bdy, 1, 0);
00298 FindBiDirLumPredPB(&recon_P->lum[8][0], f[0], &pred->lum[8][0],
00299 TRD, TRB, bdx, bdy, 0, 1);
00300 FindBiDirLumPredPB(&recon_P->lum[8][8], f[0], &pred->lum[8][8],
00301 TRD, TRB, bdx, bdy, 1, 1);
00302
00303 /* chroma vectors */
00304 mvx = 2*f[0]->x + f[0]->x_half;
00305 xvec = bdx == 0 ? (TRB-TRD) * mvx / TRD : TRB * mvx / TRD + bdx - mvx;
00306 xvec *= 4;
00307
00308 mvy = 2*f[0]->y + f[0]->y_half;
00309 yvec = bdy == 0 ? (TRB-TRD) * mvy / TRD : TRB * mvy / TRD + bdy - mvy;
00310 yvec *= 4;
00311
00312 /* round values according to TABLE 16/H.263 */
00313 dx = sign(xvec)*(roundtab[abs(xvec)%16] + (abs(xvec)/16)*2);
00314 dy = sign(yvec)*(roundtab[abs(yvec)%16] + (abs(yvec)/16)*2);
00315
00316 FindBiDirChrPredPB(recon_P, dx, dy, pred);
00317 }
00318
00319 /* store PB-deltas */
00320 MV[5][y/MB_SIZE+1][x/MB_SIZE+1]->x = bdx; /* is in half pel format */
00321 MV[5][y/MB_SIZE+1][x/MB_SIZE+1]->y = bdy;
00322 MV[5][y/MB_SIZE+1][x/MB_SIZE+1]->x_half = 0;
00323 MV[5][y/MB_SIZE+1][x/MB_SIZE+1]->y_half = 0;
00324
00325
00326 /* Do the actual prediction */
00327 for (j = 0; j < MB_SIZE; j++)
00328 for (i = 0; i < MB_SIZE; i++)
00329 p_err->lum[j][i] =
00330 *(curr_image->lum+x+i + (y+j)*(VidSt->pels)) - pred->lum[j][i];
00331
00332 y >>= 1;
00333 x >>= 1;
00334 for (j = 0; j < MB_SIZE>>1; j++)
00335 for (i = 0; i < MB_SIZE>>1; i++) {
00336 p_err->Cr[j][i] = *(curr_image->Cr+x+i + (y+j)*(VidSt->cpels)) - pred->Cr[j][i];
00337 p_err->Cb[j][i] = *(curr_image->Cb+x+i + (y+j)*(VidSt->cpels)) - pred->Cb[j][i];
00338 }
00339
00340 free(pred);
00341 return p_err;
00342 }
|
|
||||||||||||||||||||||||||||||||
|
Referenced by CodeOneOrTwo(). |
|
||||||||||||||||
|
Definition at line 204 of file vid_main.c. References Bits, bits_counted::C, bits_counted::CBPB, bits_counted::CBPCM, bits_counted::CBPY, bits_counted::COD, bits_counted::DQUANT, bits_counted::header, bits_counted::MODB, bits_counted::no_inter, bits_counted::no_inter4v, bits_counted::no_intra, bits_counted::total, bits_counted::vec, and bits_counted::Y. Referenced by close_video_codec(), and code_video(). 00205 {
00206 fprintf(stdout,"# intra : %d\n", bits->no_intra/num_units);
00207 fprintf(stdout,"# inter : %d\n", bits->no_inter/num_units);
00208 fprintf(stdout,"# inter4v : %d\n", bits->no_inter4v/num_units);
00209 fprintf(stdout,"--------------\n");
00210 fprintf(stdout,"Coeff_Y: %d\n", bits->Y/num);
00211 fprintf(stdout,"Coeff_C: %d\n", bits->C/num);
00212 fprintf(stdout,"Vectors: %d\n", bits->vec/num);
00213 fprintf(stdout,"CBPY : %d\n", bits->CBPY/num);
00214 fprintf(stdout,"MCBPC : %d\n", bits->CBPCM/num);
00215 fprintf(stdout,"MODB : %d\n", bits->MODB/num);
00216 fprintf(stdout,"CBPB : %d\n", bits->CBPB/num);
00217 fprintf(stdout,"COD : %d\n", bits->COD/num);
00218 fprintf(stdout,"DQUANT : %d\n", bits->DQUANT/num);
00219 fprintf(stdout,"header : %d\n", bits->header/num);
00220 fprintf(stdout,"==============\n");
00221 fprintf(stdout,"Total : %d\n", bits->total/num);
00222 fprintf(stdout,"\n");
00223 return;
00224 }
|
|
||||||||||||
|
Definition at line 226 of file vid_main.c. References Results, results::SNR_Cb, results::SNR_Cr, and results::SNR_l. Referenced by close_video_codec(), and code_video(). 00227 {
00228 FILE *fp = fopen("snr.dat","a");
00229 assert(fp!=NULL);
00230 fprintf(fp,"%.2f %.2f %.2f\n",res->SNR_l/num,res->SNR_Cb/num,res->SNR_Cr/num);
00231 fclose(fp);
00232 fprintf(stdout,"SNR_Y : %.2f\n", res->SNR_l/num);
00233 fprintf(stdout,"SNR_Cb : %.2f\n", res->SNR_Cb/num);
00234 fprintf(stdout,"SNR_Cr : %.2f\n", res->SNR_Cr/num);
00235 fprintf(stdout,"--------------\n");
00236
00237 return;
00238 }
|
|
||||||||||||
|
Definition at line 73 of file vid_putbits.c. References al_send_byte(), BitPrint(), video_codec::bytecnt, video_codec::label, video_codec::outbfr, video_codec::outcnt, video_codec::output, video_codec::simbuffer, video_codec::streamfile, video_codec::tf, video_codec::trace, and VidSt. Referenced by alignbits(), bit_in_psc_layer(), CodeCoeff(), CountBitsMB(), CountBitsPicture(), CountBitsSlice(), put_cbpcm_inter(), put_cbpcm_intra(), put_cbpy(), put_coeff(), and put_mv(). 00074 {
00075 int i;
00076 unsigned int mask;
00077 char bitstring[32];
00078
00079 if ((VidSt->trace)) {
00080 if (n > 0) {
00081 BitPrint(n,val,bitstring);
00082 fprintf((VidSt->tf),bitstring);
00083 }
00084 }
00085
00086 mask = 1 << (n-1); /* selects first (leftmost) bit */
00087
00088 for (i=0; i<n; i++) {
00089 (VidSt->outbfr) <<= 1;
00090
00091 if (val & mask)
00092 (VidSt->outbfr)|= 1;
00093
00094 mask >>= 1; /* select next bit */
00095 (VidSt->outcnt)--;
00096
00097 if ((VidSt->outcnt)==0) /* 8 bit buffer full */ {
00098 putc((VidSt->outbfr),(VidSt->streamfile));
00099
00100 if (al_send_byte((VidSt->output), (VidSt->outbfr)) == 0)
00101 printf("!: \"%s\" overwrote AL-buffer!\n", (VidSt->label));
00102
00103 (VidSt->simbuffer)++;
00104
00105 (VidSt->outcnt) = 8;
00106 (VidSt->bytecnt)++;
00107 }
00108 }
00109 }
|
|
||||||||||||||||||||
|
Definition at line 61 of file vid_quant.c. References mmax, mmin, MODE_INTRA, and sign. Referenced by MB_Encode(). 00062 {
00063 int i;
00064 int level;
00065
00066 if (QP) {
00067 if (Mode == MODE_INTRA || Mode == MODE_INTRA_Q) { /* Intra */
00068 qcoeff[0] = mmax(1,mmin(254,coeff[0]/8));
00069
00070 for (i = 1; i < 64; i++) {
00071 level = (abs(coeff[i])) / (2*QP);
00072 qcoeff[i] = mmin(127,mmax(-127,sign(coeff[i]) * level));
00073 }
00074 }
00075 else { /* non Intra */
00076 for (i = 0; i < 64; i++) {
00077 level = (abs(coeff[i])-QP/2) / (2*QP);
00078 qcoeff[i] = mmin(127,mmax(-127,sign(coeff[i]) * level));
00079 }
00080 }
00081 }
00082 else {
00083 /* No quantizing.
00084 Used only for testing. Bitstream will not be decodable
00085 whether clipping is performed or not */
00086 for (i = 0; i < 64; i++) {
00087 qcoeff[i] = coeff[i];
00088 }
00089 }
00090 return;
00091 }
|
|
||||||||||||||||
|
Definition at line 62 of file vid_io.c. References video_codec::lines, video_codec::pels, and VidSt. Referenced by code_video(). 00064 {
00065 FILE *im_file = NULL;
00066 int im_size = (VidSt->pels)*(VidSt->lines)*3/2;
00067 unsigned char *raw;
00068 int status;
00069
00070 if ((raw = (unsigned char *)malloc(sizeof(char)*im_size)) == NULL) {
00071 fprintf(stderr,"Couldn't allocate memory to image\n");
00072 exit(-1);
00073 }
00074 if ((im_file = fopen(filename,"rb")) == NULL) {
00075 fprintf(stderr,"Unable to open image_file: %s\n",filename);
00076 exit(-1);
00077 }
00078 rewind(im_file);
00079 /* Find the correct image */
00080 status = fseek(im_file,headerlength + (frame_no) * im_size,0);
00081 if (status != 0) {
00082 fprintf(stderr,"Error in seeking image no: %d\n",frame_no);
00083 fprintf(stderr,"From file: %s\n",filename);
00084 exit(-1);
00085 }
00086 /* Read image */
00087 fprintf(stdout,"Reading image no: %d\n",frame_no);
00088 if ((status = fread(raw, sizeof(char),
00089 im_size, im_file)) != im_size) {
00090 fprintf(stderr,"Error in reading image no: %d\n",frame_no);
00091 fprintf(stderr,"From file: %s\n",filename);
00092 exit(-1);
00093 }
00094
00095 fclose(im_file);
00096 return raw;
00097 }
|
|
||||||||||||||||||||||||||||
|
Definition at line 1285 of file vid_pred.c. References mb_structure::Cb, pict_image::Cb, mb_structure::Cr, pict_image::Cr, data, video_codec::long_vectors, MB_Structure, video_codec::mv_outside_frame, video_codec::pels, PictImage, and VidSt. Referenced by MB_Recon_P(). 01288 {
01289 int m,n;
01290
01291 int x, y, ofx, ofy, pel,lx;
01292 int xint, yint;
01293 int xh, yh;
01294
01295 lx = ((VidSt->mv_outside_frame) ? (VidSt->pels)/2 + ((VidSt->long_vectors)?32:16) : (VidSt->pels)/2);
01296
01297 x = x_curr>>1;
01298 y = y_curr>>1;
01299
01300 xint = dx>>1;
01301 xh = dx & 1;
01302 yint = dy>>1;
01303 yh = dy & 1;
01304
01305 if (!xh && !yh) {
01306 for (n = 0; n < 8; n++) {
01307 for (m = 0; m < 8; m++) {
01308
01309 ofx = x + xint + m;
01310 ofy = y + yint + n;
01311 pel=*(prev->Cr+ofx + (ofy )*lx);
01312 data->Cr[n][m] += pel;
01313
01314 pel=*(prev->Cb+ofx + (ofy )*lx);
01315 data->Cb[n][m] += pel;
01316 }
01317 }
01318 }
01319 else if (!xh && yh) {
01320 for (n = 0; n < 8; n++) {
01321 for (m = 0; m < 8; m++) {
01322
01323 ofx = x + xint + m;
01324 ofy = y + yint + n;
01325 pel=(*(prev->Cr+ofx + (ofy )*lx)+
01326 *(prev->Cr+ofx + (ofy+yh)*lx) + 1)>>1;
01327
01328 data->Cr[n][m] += pel;
01329
01330 pel=(*(prev->Cb+ofx + (ofy )*lx)+
01331 *(prev->Cb+ofx + (ofy+yh)*lx) + 1)>>1;
01332
01333 data->Cb[n][m] += pel;
01334
01335 }
01336 }
01337 }
01338 else if (xh && !yh) {
01339 for (n = 0; n < 8; n++) {
01340 for (m = 0; m < 8; m++) {
01341
01342 ofx = x + xint + m;
01343 ofy = y + yint + n;
01344 pel=(*(prev->Cr+ofx + (ofy )*lx)+
01345 *(prev->Cr+ofx+xh + (ofy )*lx) + 1)>>1;
01346
01347 data->Cr[n][m] += pel;
01348
01349 pel=(*(prev->Cb+ofx + (ofy )*lx)+
01350 *(prev->Cb+ofx+xh + (ofy )*lx) + 1)>>1;
01351
01352 data->Cb[n][m] += pel;
01353
01354 }
01355 }
01356 }
01357 else { /* xh && yh */
01358 for (n = 0; n < 8; n++) {
01359 for (m = 0; m < 8; m++) {
01360 ofx = x + xint + m;
01361 ofy = y + yint + n;
01362 pel=(*(prev->Cr+ofx + (ofy )*lx)+
01363 *(prev->Cr+ofx+xh + (ofy )*lx)+
01364 *(prev->Cr+ofx + (ofy+yh)*lx)+
01365 *(prev->Cr+ofx+xh + (ofy+yh)*lx)+
01366 2)>>2;
01367
01368 data->Cr[n][m] += pel;
01369
01370 pel=(*(prev->Cb+ofx + (ofy )*lx)+
01371 *(prev->Cb+ofx+xh + (ofy )*lx)+
01372 *(prev->Cb+ofx + (ofy+yh)*lx)+
01373 *(prev->Cb+ofx+xh + (ofy+yh)*lx)+
01374 2)>>2;
01375
01376 data->Cb[n][m] += pel;
01377
01378 }
01379 }
01380 }
01381 return;
01382 }
|
|
||||||||||||||||||||
|
Definition at line 747 of file vid_coder.c. References mb_structure::Cb, pict_image::Cb, video_codec::cpels, mb_structure::Cr, pict_image::Cr, data, mb_structure::lum, pict_image::lum, MB_Structure, video_codec::pels, PictImage, and VidSt. Referenced by CodeOneIntra(), and CodeOneOrTwo(). 00748 {
00749 int n;
00750 register int m;
00751
00752 int x_curr, y_curr;
00753
00754 x_curr = i * MB_SIZE;
00755 y_curr = j * MB_SIZE;
00756
00757 /* Fill in luminance data */
00758 for (n = 0; n < MB_SIZE; n++)
00759 for (m= 0; m < MB_SIZE; m++) {
00760 *(recon->lum + x_curr+m + (y_curr+n)*(VidSt->pels)) = data->lum[n][m];
00761 }
00762
00763 /* Fill in chrominance data */
00764 for (n = 0; n < MB_SIZE>>1; n++)
00765 for (m = 0; m < MB_SIZE>>1; m++) {
00766 *(recon->Cr + (x_curr>>1)+m + ((y_curr>>1)+n)*(VidSt->cpels)) = data->Cr[n][m];
00767 *(recon->Cb + (x_curr>>1)+m + ((y_curr>>1)+n)*(VidSt->cpels)) = data->Cb[n][m];
00768 }
00769 return;
00770 }
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 1249 of file vid_pred.c. References data, video_codec::long_vectors, MotionVector, video_codec::mv_outside_frame, video_codec::pels, VidSt, motionvector::x, motionvector::x_half, motionvector::y, and motionvector::y_half. Referenced by MB_Recon_P(). 01251 {
01252 int m, n;
01253 int x1, y1, lx;
01254
01255 lx = ((VidSt->mv_outside_frame) ? (VidSt->pels) + ((VidSt->long_vectors)?64:32) : (VidSt->pels));
01256
01257 x1 = 2*(x + fr->x) + fr->x_half;
01258 y1 = 2*(y + fr->y) + fr->y_half;
01259
01260 x1 += ((comp&1)<<4);
01261 y1 += ((comp&2)<<3);
01262
01263 for (n = 0; n < bs; n++) {
01264 for (m = 0; m < bs; m++) {
01265 *(data+m+n*16) += (int)(*(prev+x1+2*m + (y1+2*n)*2*lx));
01266 }
01267 }
01268
01269 return;
01270 }
|
|
||||||||||||||||||||
|
Definition at line 394 of file vid_mot_est.c. Referenced by MotionEstimation(). 00396 {
00397 int i;
00398 int sad = 0;
00399 unsigned char *kk;
00400
00401 kk = act_block;
00402 i = 8;
00403 while (i--) {
00404 sad += (abs(*ii - *kk ) +abs(*(ii+1 ) - *(kk+1) )
00405 +abs(*(ii+2) - *(kk+2) ) +abs(*(ii+3 ) - *(kk+3) )
00406 +abs(*(ii+4) - *(kk+4) ) +abs(*(ii+5 ) - *(kk+5) )
00407 +abs(*(ii+6) - *(kk+6) ) +abs(*(ii+7 ) - *(kk+7) ));
00408
00409 ii += h_length;
00410 kk += 16;
00411 if (sad > min_sofar)
00412 return INT_MAX;
00413 }
00414 return sad;
00415 }
|
|
||||||||||||||||||||
|
Definition at line 367 of file vid_mot_est.c. Referenced by MotionEstimation(). 00369 {
00370 int i;
00371 int sad = 0;
00372 unsigned char *kk;
00373
00374 kk = act_block;
00375 i = 16;
00376 while (i--) {
00377 sad += (abs(*ii - *kk ) +abs(*(ii+1 ) - *(kk+1) )
00378 +abs(*(ii+2) - *(kk+2) ) +abs(*(ii+3 ) - *(kk+3) )
00379 +abs(*(ii+4) - *(kk+4) ) +abs(*(ii+5 ) - *(kk+5) )
00380 +abs(*(ii+6) - *(kk+6) ) +abs(*(ii+7 ) - *(kk+7) )
00381 +abs(*(ii+8) - *(kk+8) ) +abs(*(ii+9 ) - *(kk+9) )
00382 +abs(*(ii+10)- *(kk+10)) +abs(*(ii+11) - *(kk+11))
00383 +abs(*(ii+12)- *(kk+12)) +abs(*(ii+13) - *(kk+13))
00384 +abs(*(ii+14)- *(kk+14)) +abs(*(ii+15) - *(kk+15)) );
00385
00386 ii += h_length;
00387 kk += 16;
00388 if (sad > Min_FRAME)
00389 return INT_MAX;
00390 }
00391 return sad;
00392 }
|
|
||||||||||||||||||||||||
|
Definition at line 417 of file vid_mot_est.c. Referenced by NextTwoPB(). 00419 {
00420 int i, sad = 0;
00421 unsigned char *ll, *kk;
00422 kk = aa;
00423 ll = bb;
00424 i = 16;
00425 while (i--) {
00426 sad += (abs(*ii - ((*kk + *ll )>>1)) +
00427 abs(*(ii+1) - ((*(kk+1)+ *(ll+1))>>1)) +
00428 abs(*(ii+2) - ((*(kk+2)+ *(ll+2))>>1)) +
00429 abs(*(ii+3) - ((*(kk+3)+ *(ll+3))>>1)) +
00430 abs(*(ii+4) - ((*(kk+4)+ *(ll+4))>>1)) +
00431 abs(*(ii+5) - ((*(kk+5)+ *(ll+5))>>1)) +
00432 abs(*(ii+6) - ((*(kk+6)+ *(ll+6))>>1)) +
00433 abs(*(ii+7) - ((*(kk+7)+ *(ll+7))>>1)) +
00434 abs(*(ii+8) - ((*(kk+8)+ *(ll+8))>>1)) +
00435 abs(*(ii+9) - ((*(kk+9)+ *(ll+9))>>1)) +
00436 abs(*(ii+10) - ((*(kk+10)+ *(ll+10))>>1)) +
00437 abs(*(ii+11) - ((*(kk+11)+ *(ll+11))>>1)) +
00438 abs(*(ii+12) - ((*(kk+12)+ *(ll+12))>>1)) +
00439 abs(*(ii+13) - ((*(kk+13)+ *(ll+13))>>1)) +
00440 abs(*(ii+14) - ((*(kk+14)+ *(ll+14))>>1)) +
00441 abs(*(ii+15) - ((*(kk+15)+ *(ll+15))>>1)));
00442
00443 ii += width;
00444 kk += width;
00445 ll += width;
00446 if (sad > min_sofar)
00447 return INT_MAX;
00448 }
00449 return sad;
00450 }
|
|
||||||||||||||||||||
|
Definition at line 452 of file vid_mot_est.c. Referenced by Predict_B(). 00453 {
00454 int i, sad = 0, *kk;
00455
00456 kk = act_block;
00457 i = 16;
00458 while (i--) {
00459 sad += (abs(*ii - *kk ) +abs(*(ii+1 ) - *(kk+1) )
00460 +abs(*(ii+2) - *(kk+2) ) +abs(*(ii+3 ) - *(kk+3) )
00461 +abs(*(ii+4) - *(kk+4) ) +abs(*(ii+5 ) - *(kk+5) )
00462 +abs(*(ii+6) - *(kk+6) ) +abs(*(ii+7 ) - *(kk+7) )
00463 +abs(*(ii+8) - *(kk+8) ) +abs(*(ii+9 ) - *(kk+9) )
00464 +abs(*(ii+10)- *(kk+10)) +abs(*(ii+11) - *(kk+11))
00465 +abs(*(ii+12)- *(kk+12)) +abs(*(ii+13) - *(kk+13))
00466 +abs(*(ii+14)- *(kk+14)) +abs(*(ii+15) - *(kk+15)) );
00467
00468 ii += h_length;
00469 kk += 16;
00470 if (sad > min_sofar)
00471 return INT_MAX;
00472 }
00473 return sad;
00474 }
|
|
|
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 168 of file vid_ratectrl.c. References video_codec::B_target, bitcount(), video_codec::global_adj, mmax, mmin, and VidSt. Referenced by CodeOneOrTwo(). 00175 {
00176 int newQP=16;
00177 float local_adj, descrepency, projection;
00178
00179 if (pict_type == PCT_INTRA) {
00180 newQP = 16; /* Changed from newQP = 16;, BD 8/27/96 */
00181 }
00182 else if (pict_type == PCT_INTER) {
00183 /* compute expected buffer fullness */
00184
00185 projection = mb * ((VidSt->B_target) / (mb_width*mb_height));
00186
00187 /* measure descrepency between current fullness and projection */
00188 descrepency= (bitcount - projection);
00189
00190 /* scale */
00191
00192 local_adj = 12 * descrepency / bit_rate;
00193
00194 #if(0)
00195 printf("mb = %d\n",mb);
00196 printf("bit_count = %d projection = %.2f \n",bitcount,projection);
00197 printf("B_target = %.2f local_adj = %.2f \n",(VidSt->B_target),local_adj);
00198 #endif
00199
00200 newQP = (int)(QP_mean * (1 + (VidSt->global_adj) + local_adj) + 0.5);
00201
00202 /* the update equation for newQP in TMN4 document section 3.7 */
00203
00204 }
00205 else {
00206 fprintf(stderr,"Error (UpdateQuantizer): picture type unkown.\n");
00207 }
00208
00209 #if(0)
00210 printf("mb = %d newQP = %d \n",mb,newQP);
00211 #endif
00212
00213 newQP = mmax(1,mmin(31,newQP));
00214 return newQP;
00215 }
|
|
|
Definition at line 90 of file vid_ratectrl.c. References video_codec::B_prev, and VidSt. Referenced by code_video().
|
|
||||||||||||
|
Definition at line 142 of file vid_io.c. References pict_image::Cb, pict_image::Cr, video_codec::lines, pict_image::lum, video_codec::pels, PictImage, and VidSt. Referenced by code_video(). 00144 {
00145 int status;
00146 FILE *f_out;
00147
00148 /* Opening file */
00149 if ((f_out = fopen(filename,"ab")) == NULL) {
00150 fprintf(stderr,"%s%s\n","Error in opening file: ",filename);
00151 exit(-1);
00152 }
00153
00154 /* Writing lum to file */
00155 if ((status = fwrite(image->lum,sizeof(char),(VidSt->pels)*(VidSt->lines),f_out))
00156 != (VidSt->pels)*(VidSt->lines)) {
00157 fprintf(stderr,"%s%s\n","Error in writing to file: ",filename);
00158 exit(-1);
00159 }
00160 /* Writing Cb to file */
00161 if ((status = fwrite(image->Cb,sizeof(char),(VidSt->pels)*(VidSt->lines)/4,f_out))
00162 != (VidSt->pels)*(VidSt->lines)/4) {
00163 fprintf(stderr,"%s%s\n","Error in writing to file: ",filename);
00164 exit(-1);
00165 }
00166 /* Writing Cr to file */
00167 if ((status = fwrite(image->Cr,sizeof(char),(VidSt->pels)*(VidSt->lines)/4,f_out))
00168 != (VidSt->pels)*(VidSt->lines)/4) {
00169 fprintf(stderr,"%s%s\n","Error in writing to file: ",filename);
00170 exit(-1);
00171 }
00172
00173 fclose(f_out);
00174 return;
00175 }
|
|
|
Definition at line 1044 of file vid_countbit.c. References Bits, bits_counted::C, bits_counted::CBPB, bits_counted::CBPCM, bits_counted::CBPY, bits_counted::COD, bits_counted::DQUANT, bits_counted::header, bits_counted::MODB, bits_counted::no_inter, bits_counted::no_inter4v, bits_counted::no_intra, bits_counted::total, bits_counted::vec, and bits_counted::Y. Referenced by code_video(), CodeOneIntra(), and CodeOneOrTwo(). 01045 {
01046 bits->Y = 0;
01047 bits->C = 0;
01048 bits->vec = 0;
01049 bits->CBPY = 0;
01050 bits->CBPCM = 0;
01051 bits->MODB = 0;
01052 bits->CBPB = 0;
01053 bits->COD = 0;
01054 bits->DQUANT = 0;
01055 bits->header = 0;
01056 bits->total = 0;
01057 bits->no_inter = 0;
01058 bits->no_inter4v = 0;
01059 bits->no_intra = 0;
01060 return;
01061 }
|
|
|
Definition at line 717 of file vid_coder.c. References mb_structure::Cb, mb_structure::Cr, data, mb_structure::lum, and MB_Structure. Referenced by CodeOneOrTwo(). 00718 {
00719 int n;
00720 register int m;
00721
00722 for (n = 0; n < MB_SIZE; n++)
00723 for (m = 0; m < MB_SIZE; m++)
00724 data->lum[n][m] = 0;
00725 for (n = 0; n < (MB_SIZE>>1); n++)
00726 for (m = 0; m < (MB_SIZE>>1); m++) {
00727 data->Cr[n][m] = 0;
00728 data->Cb[n][m] = 0;
00729 }
00730 return;
00731 }
|
|
|
Definition at line 1062 of file vid_countbit.c. References results::QP_mean, Results, results::SNR_Cb, results::SNR_Cr, and results::SNR_l. Referenced by code_video(). 01063 {
01064 res->SNR_l = (float)0;
01065 res->SNR_Cr = (float)0;
01066 res->SNR_Cb = (float)0;
01067 res->QP_mean = (float)0;
01068 }
|
|
|
Definition at line 1110 of file vid_countbit.c. References MotionVector, motionvector::x, motionvector::x_half, motionvector::y, and motionvector::y_half. Referenced by CodeOneOrTwo(), and MotionEstimatePicture(). 01111 {
01112 MV->x = 0;
01113 MV->y = 0;
01114 MV->x_half = 0;
01115 MV->y_half = 0;
01116 return;
01117 }
|
1.3.9.1