#include "vid_sim.h"
#include "video_codec.h"
Go to the source code of this file.
Functions | |
int | NextTwoPB (PictImage *next2, PictImage *next1, PictImage *prev, int bskip, int pskip, int seek_dist) |
void | PrintResult (Bits *bits, int num_units, int num) |
void | PrintSNR (Results *res, int num) |
Variables | |
video_codec * | VidSt |
FILE * | streamfile |
|
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 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 52 of file vid_main.c. |
|
Definition at line 16 of file vid_wrapper.c. |