[cvs] / xvidcore / examples / xvid_stat.c Repository:
ViewVC logotype

Diff of /xvidcore/examples/xvid_stat.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.4.2.1, Sun Jan 12 17:21:04 2003 UTC revision 1.12, Fri Sep 27 18:35:35 2002 UTC
# Line 44  Line 44 
44   *  -q integer     : quality ([0..5])   *  -q integer     : quality ([0..5])
45   *  -d boolean     : save decoder output (0 False*, !=0 True)   *  -d boolean     : save decoder output (0 False*, !=0 True)
46   *  -m boolean     : save mpeg4 raw stream (0 False*, !=0 True)   *  -m boolean     : save mpeg4 raw stream (0 False*, !=0 True)
  *  -mv integer    : Hinted Motion Estimation (0 none, 1 get hints, 2 set hints)  
47   *  -help          : prints this help message   *  -help          : prints this help message
48   *  -quant integer : fixed quantizer (disables -b setting)   *  -quant integer : fixed quantizer (disables -b setting)
49   *  (* means default)   *  (* means default)
# Line 100  Line 99 
99  static int enc_init(int use_assembler);  static int enc_init(int use_assembler);
100  static int enc_stop();  static int enc_stop();
101  static int enc_main(unsigned char* image, unsigned char* bitstream,  static int enc_main(unsigned char* image, unsigned char* bitstream,
102                                          unsigned char* hints_buffer,                                          int *streamlength, int* frametype);
                                         long *streamlength, long* frametype, long* hints_size);  
103    
104  /* Decoder related functions */  /* Decoder related functions */
105  static int dec_stop();  static int dec_stop();
# Line 114  Line 112 
112   ****************************************************************************/   ****************************************************************************/
113    
114  static int const motion_presets[7] = {  static int const motion_presets[7] = {
115          0,                                                        /* Q 0 */          0,                                                        // Q 0
116          PMV_EARLYSTOP16,                                          /* Q 1 */          PMV_EARLYSTOP16,                                          // Q 1
117          PMV_EARLYSTOP16,                                          /* Q 2 */          PMV_EARLYSTOP16,                                          // Q 2
118          PMV_EARLYSTOP16 | PMV_HALFPELREFINE16,                    /* Q 3 */          PMV_EARLYSTOP16 | PMV_HALFPELREFINE16,                    // Q 3
119          PMV_EARLYSTOP16 | PMV_HALFPELREFINE16,                    /* Q 4 */          PMV_EARLYSTOP16 | PMV_HALFPELREFINE16,                    // Q 4
120          PMV_EARLYSTOP16 | PMV_HALFPELREFINE16 | PMV_EARLYSTOP8 |  /* Q 5 */          PMV_EARLYSTOP16 | PMV_HALFPELREFINE16 | PMV_EARLYSTOP8 |  // Q 5
121          PMV_HALFPELREFINE8,          PMV_HALFPELREFINE8,
122          PMV_EARLYSTOP16 | PMV_HALFPELREFINE16 | PMV_EXTSEARCH16 | /* Q 6 */          PMV_EARLYSTOP16 | PMV_HALFPELREFINE16 | PMV_EXTSEARCH16 | // Q 6
123          PMV_USESQUARES16 | PMV_EARLYSTOP8 | PMV_HALFPELREFINE8          PMV_USESQUARES16 | PMV_EARLYSTOP8 | PMV_HALFPELREFINE8
124  };  };
125    
126  static int const general_presets[7] = {  static int const general_presets[7] = {
127          XVID_H263QUANT,                               /* Q 0 */          XVID_H263QUANT,                               // Q 0
128          XVID_MPEGQUANT,                               /* Q 1 */          XVID_MPEGQUANT,                               // Q 1
129          XVID_H263QUANT,                               /* Q 2 */          XVID_H263QUANT,                               // Q 2
130          XVID_H263QUANT | XVID_HALFPEL,                /* Q 3 */          XVID_H263QUANT | XVID_HALFPEL,                // Q 3
131          XVID_H263QUANT | XVID_HALFPEL | XVID_INTER4V, /* Q 4 */          XVID_H263QUANT | XVID_HALFPEL | XVID_INTER4V, // Q 4
132          XVID_H263QUANT | XVID_HALFPEL | XVID_INTER4V, /* Q 5 */          XVID_H263QUANT | XVID_HALFPEL | XVID_INTER4V, // Q 5
133          XVID_H263QUANT | XVID_HALFPEL | XVID_INTER4V  /* Q 6 */          XVID_H263QUANT | XVID_HALFPEL | XVID_INTER4V  // Q 6
134  };  };
135    
136    
# Line 143  Line 141 
141  /* Maximum number of frames to encode */  /* Maximum number of frames to encode */
142  #define ABS_MAXFRAMENR 9999  #define ABS_MAXFRAMENR 9999
143    
 /* HINTMODEs */  
 #define HINT_MODE_NONE 0  
 #define HINT_MODE_GET  1  
 #define HINT_MODE_SET  2  
 #define HINT_FILE "hints.mv"  
   
144  static int   ARG_BITRATE = 900;  static int   ARG_BITRATE = 900;
145  static int   ARG_QUANTI = 0;  static int   ARG_QUANTI = 0;
146  static int   ARG_QUALITY = 6;  static int   ARG_QUALITY = 6;
# Line 160  Line 152 
152  static int   ARG_INPUTTYPE = 0;  static int   ARG_INPUTTYPE = 0;
153  static int   ARG_SAVEDECOUTPUT = 0;  static int   ARG_SAVEDECOUTPUT = 0;
154  static int   ARG_SAVEMPEGSTREAM = 0;  static int   ARG_SAVEMPEGSTREAM = 0;
 static int   ARG_HINTMODE = HINT_MODE_NONE;  
155  static int   XDIM = 0;  static int   XDIM = 0;
156  static int   YDIM = 0;  static int   YDIM = 0;
157  #define IMAGE_SIZE(x,y) ((x)*(y)*3/2)  #define IMAGE_SIZE(x,y) ((x)*(y)*3/2)
# Line 168  Line 159 
159  #define MAX(A,B) ( ((A)>(B)) ? (A) : (B) )  #define MAX(A,B) ( ((A)>(B)) ? (A) : (B) )
160  #define SMALL_EPS 1e-10  #define SMALL_EPS 1e-10
161    
 #define LONG_PACK(a,b,c,d) ((long) (((long)(a))<<24) | (((long)(b))<<16) | \  
                                    (((long)(c))<<8)  |((long)(d)))  
   
 #define SWAP(a) ( (((a)&0x000000ff)<<24) | (((a)&0x0000ff00)<<8) | \  
                   (((a)&0x00ff0000)>>8)  | (((a)&0xff000000)>>24) )  
   
162  /****************************************************************************  /****************************************************************************
163   *                     Nasty global vars ;-)   *                     Nasty global vars ;-)
164   ***************************************************************************/   ***************************************************************************/
# Line 198  Line 183 
183          unsigned char *divx_buffer = NULL;          unsigned char *divx_buffer = NULL;
184          unsigned char *in_buffer = NULL;          unsigned char *in_buffer = NULL;
185          unsigned char *out_buffer = NULL;          unsigned char *out_buffer = NULL;
         unsigned char *hints_buffer = NULL;  
186    
187          double enctime,dectime;          double enctime,dectime;
188          double totalenctime=0.;          double totalenctime=0.;
189          double totaldectime=0.;          double totaldectime=0.;
190    
191          long totalsize = 0;          long totalsize = 0;
         long hints_size = 0;  
192          int status;          int status;
         int bigendian = 0;  
193    
194          long m4v_size = 0;          int m4v_size;
195          long frame_type[ABS_MAXFRAMENR];          int frame_type[ABS_MAXFRAMENR];
196          int Iframes=0, Pframes=0, use_assembler=0;          int Iframes=0, Pframes=0, use_assembler=0;
197          double framepsnr[ABS_MAXFRAMENR];          double framepsnr[ABS_MAXFRAMENR];
198    
199          double Ipsnr=0.,Imaxpsnr=0.,Iminpsnr=999.,Ivarpsnr=0.;          double Ipsnr=0.,Imaxpsnr=0.,Iminpsnr=999.,Ivarpsnr=0.;
200          double Ppsnr=0.,Pmaxpsnr=0.,Pminpsnr=999.,Pvarpsnr=0.;          double Ppsnr=0.,Pmaxpsnr=0.,Pminpsnr=999.,Pvarpsnr=0.;
201            double Bpsnr=0.,Bmaxpsnr=0.,Bminpsnr=999.,Bvarpsnr=0.;
202    
203          char filename[256];          char filename[256];
204    
205          FILE *filehandle;          FILE *filehandle;
206          FILE *in_file = stdin;          FILE *in_file = stdin;
         FILE *hints_file = NULL;  
207    
208          printf("xvid_stat - XviD core library test program ");          printf("xvid_stat - XviD core library test program ");
209          printf("written by Christoph Lampert 2002\n\n");          printf("written by Christoph Lampert 2002\n\n");
# Line 279  Line 261 
261                          i++;                          i++;
262                          ARG_SAVEMPEGSTREAM = atoi(argv[i]);                          ARG_SAVEMPEGSTREAM = atoi(argv[i]);
263                  }                  }
                 else if (strcmp("-mv", argv[i]) == 0 && i < argc - 1 ) {  
                         i++;  
                         ARG_HINTMODE = atoi(argv[i]);  
                 }  
264                  else if (strcmp("-help", argv[i])) {                  else if (strcmp("-help", argv[i])) {
265                          usage();                          usage();
266                          return(0);                          return(0);
# Line 299  Line 277 
277   ****************************************************************************/   ****************************************************************************/
278    
279          if (XDIM <= 0 || XDIM >= 2048 || YDIM <=0 || YDIM >= 2048 ) {          if (XDIM <= 0 || XDIM >= 2048 || YDIM <=0 || YDIM >= 2048 ) {
280                  fprintf(stderr, "Trying to retreive width and height from PGM header\n");                  fprintf(stderr,
281                                    "Trying to retreive width and height from PGM header\n",
282                                    XDIM,
283                                    YDIM);
284                  ARG_INPUTTYPE = 1; /* pgm */                  ARG_INPUTTYPE = 1; /* pgm */
285          }          }
286    
# Line 314  Line 295 
295          }          }
296    
297          if ( ARG_FRAMERATE <= 0) {          if ( ARG_FRAMERATE <= 0) {
298                  fprintf(stderr,"Wrong Framerate %s \n",argv[5]);                  fprintf(stderr,"Wrong Fraterate %s \n",argv[5]);
299                  return -1;                  return -1;
300          }          }
301    
# Line 323  Line 304 
304                  return -1;                  return -1;
305          }          }
306    
         if ( ARG_HINTMODE != HINT_MODE_NONE &&  
                  ARG_HINTMODE != HINT_MODE_GET &&  
                  ARG_HINTMODE != HINT_MODE_SET)  
                 ARG_HINTMODE = HINT_MODE_NONE;  
   
         if( ARG_HINTMODE != HINT_MODE_NONE) {  
                 char *rights = "rb";  
   
                 /*  
                  * If we are getting hints from core, we will have to write them to  
                  * hint file  
                  */  
                 if(ARG_HINTMODE == HINT_MODE_GET)  
                         rights = "w+b";  
   
                 /* Open the hint file */  
                 hints_file = fopen(HINT_FILE, rights);  
                 if(hints_file == NULL) {  
                         fprintf(stderr, "Error opening input file %s\n", HINT_FILE);  
                         return -1;  
                 }  
   
                 /* Allocate hint memory space, we will be using rawhints */  
                 /* NB : Hope 1Mb is enough */  
                 if((hints_buffer = malloc(1024*1024)) == NULL) {  
                         fprintf(stderr, "Memory allocation error\n");  
                         return -1;  
                 }  
   
         }  
   
307          if ( ARG_INPUTFILE == NULL || strcmp(ARG_INPUTFILE, "stdin") == 0) {          if ( ARG_INPUTFILE == NULL || strcmp(ARG_INPUTFILE, "stdin") == 0) {
308                  in_file = stdin;                  in_file = stdin;
309          }          }
# Line 408  Line 358 
358                  goto release_all;                  goto release_all;
359          }          }
360    
         totalsize = LONG_PACK('M','P','4','U');  
         if(*((char *)(&totalsize)) == 'M')  
                 bigendian = 1;  
         else  
                 bigendian = 0;  
         totalsize = 0;  
361    
362  /*****************************************************************************  /*****************************************************************************
363   *                            Main loop   *                            Main loop
# Line 422  Line 366 
366          do {          do {
367    
368                  if (ARG_INPUTTYPE)                  if (ARG_INPUTTYPE)
369                          status = read_pgmdata(in_file, in_buffer);      /* read PGM data (YUV-format) */                          status = read_pgmdata(in_file, in_buffer);      // read PGM data (YUV-format)
370                  else                  else
371                          status = read_yuvdata(in_file, in_buffer);      /* read raw data (YUV-format) */                          status = read_yuvdata(in_file, in_buffer);      // read raw data (YUV-format)
372    
373                  if (status)                  if (status)
374                  {                  {
# Line 450  Line 394 
394   */   */
395    
396  /*****************************************************************************  /*****************************************************************************
  *                       Read hints from file  
  ****************************************************************************/  
   
                 if(ARG_HINTMODE == HINT_MODE_SET) {  
                         fread(&hints_size, 1, sizeof(long), hints_file);  
                         hints_size = (!bigendian)?SWAP(hints_size):hints_size;  
                         fread(hints_buffer, 1, hints_size, hints_file);  
                 }  
   
 /*****************************************************************************  
397   *                       Encode and decode this frame   *                       Encode and decode this frame
398   ****************************************************************************/   ****************************************************************************/
399    
400                  enctime = msecond();                  enctime = msecond();
401                  status = enc_main(in_buffer, divx_buffer, hints_buffer,                  status = enc_main(in_buffer, divx_buffer, &m4v_size, &frame_type[filenr]);
                                                   &m4v_size, &frame_type[filenr], &hints_size);  
402                  enctime = msecond() - enctime;                  enctime = msecond() - enctime;
403    
404                  totalenctime += enctime;                  totalenctime += enctime;
# Line 474  Line 407 
407                  printf("Frame %5d: intra %1d, enctime=%6.1f ms, size=%6d bytes ",                  printf("Frame %5d: intra %1d, enctime=%6.1f ms, size=%6d bytes ",
408                             (int)filenr, (int)frame_type[filenr], (float)enctime, (int)m4v_size);                             (int)filenr, (int)frame_type[filenr], (float)enctime, (int)m4v_size);
409    
 /*****************************************************************************  
  *                       Save hints to file  
  ****************************************************************************/  
   
                 if(ARG_HINTMODE == HINT_MODE_GET) {  
                         hints_size = (!bigendian)?SWAP(hints_size):hints_size;  
                         fwrite(&hints_size, 1, sizeof(long), hints_file);  
                         hints_size = (!bigendian)?SWAP(hints_size):hints_size;  
                         fwrite(hints_buffer, 1, hints_size, hints_file);  
                 }  
   
 /*****************************************************************************  
  *                       Save stream to file  
  ****************************************************************************/  
   
410                  if (ARG_SAVEMPEGSTREAM)                  if (ARG_SAVEMPEGSTREAM)
411                  {                  {
412                          sprintf(filename, "%sframe%05d.m4v", filepath, filenr);                          sprintf(filename, "%sframe%05d.m4v", filepath, filenr);
# Line 585  Line 503 
503          printf("Avg. Q%1d %2s ",ARG_QUALITY, (ARG_QUANTI ? " q" : "br"));          printf("Avg. Q%1d %2s ",ARG_QUALITY, (ARG_QUANTI ? " q" : "br"));
504          printf("%04d ",(ARG_QUANTI)?ARG_QUANTI:ARG_BITRATE);          printf("%04d ",(ARG_QUANTI)?ARG_QUANTI:ARG_BITRATE);
505          printf("( %.2f bpp) ", (double)ARG_BITRATE*1000/XDIM/YDIM/ARG_FRAMERATE);          printf("( %.2f bpp) ", (double)ARG_BITRATE*1000/XDIM/YDIM/ARG_FRAMERATE);
506          printf("size %6d ", (int)totalsize);          printf("size %6d ",totalsize);
507          printf("( %4d kbps ",(int)(totalsize*8*ARG_FRAMERATE/1000));          printf("( %4d kbps ",(int)(totalsize*8*ARG_FRAMERATE/1000));
508          printf("/ %.2f bpp) ",(double)totalsize*8/XDIM/YDIM);          printf("/ %.2f bpp) ",(double)totalsize*8/XDIM/YDIM);
509          printf("enc: %6.1f fps, dec: %6.1f fps \n",1000/totalenctime, 1000/totaldectime);          printf("enc: %6.1f fps, dec: %6.1f fps \n",1000/totalenctime, 1000/totaldectime);
# Line 640  Line 558 
558  #ifndef _MSC_VER  #ifndef _MSC_VER
559          struct timeval  tv;          struct timeval  tv;
560          gettimeofday(&tv, 0);          gettimeofday(&tv, 0);
561          return tv.tv_sec*1.0e3 + tv.tv_usec * 1.0e-3;          return tv.tv_sec*10e3 + tv.tv_usec * 1.0e-3;
562  #else  #else
563          clock_t clk;          clock_t clk;
564          clk = clock();          clk = clock();
# Line 903  Line 821 
821  }  }
822    
823  static int enc_main(unsigned char* image, unsigned char* bitstream,  static int enc_main(unsigned char* image, unsigned char* bitstream,
824                                          unsigned char* hints_buffer,                                          int *streamlength, int* frametype)
                                         long *streamlength, long* frametype, long* hints_size)  
825  {  {
826          int xerr;          int xerr;
827    
# Line 912  Line 829 
829          XVID_ENC_STATS xstats;          XVID_ENC_STATS xstats;
830    
831          xframe.bitstream = bitstream;          xframe.bitstream = bitstream;
832          xframe.length = -1;     /* this is written by the routine */          xframe.length = -1;     // this is written by the routine
833    
834          xframe.image = image;          xframe.image = image;
835          xframe.colorspace = XVID_CSP_YV12;      /* defined in <xvid.h> */          xframe.colorspace = XVID_CSP_YV12;      // defined in <xvid.h>
836    
837          xframe.intra = -1; /* let the codec decide between I-frame (1) and P-frame (0) */          xframe.intra = -1; // let the codec decide between I-frame (1) and P-frame (0)
838    
839          xframe.quant = ARG_QUANTI;      /* is quant != 0, use a fixed quant (and ignore bitrate) */          xframe.quant = ARG_QUANTI;      // is quant != 0, use a fixed quant (and ignore bitrate)
840    
841          xframe.motion = motion_presets[ARG_QUALITY];          xframe.motion = motion_presets[ARG_QUALITY];
842          xframe.general = general_presets[ARG_QUALITY];          xframe.general = general_presets[ARG_QUALITY];
843          xframe.quant_intra_matrix = xframe.quant_inter_matrix = NULL;          xframe.quant_intra_matrix = xframe.quant_inter_matrix = NULL;
844    
         xframe.hint.hintstream = hints_buffer;  
   
         if(ARG_HINTMODE == HINT_MODE_SET) {  
                 xframe.hint.hintlength = *hints_size;  
                 xframe.hint.rawhints = 0;  
                 xframe.general |= XVID_HINTEDME_SET;  
         }  
   
         if(ARG_HINTMODE == HINT_MODE_GET) {  
                 xframe.hint.rawhints = 0;  
                 xframe.general |= XVID_HINTEDME_GET;  
         }  
   
845          xerr = xvid_encore(enc_handle, XVID_ENC_ENCODE, &xframe, &xstats);          xerr = xvid_encore(enc_handle, XVID_ENC_ENCODE, &xframe, &xstats);
846    
         if(ARG_HINTMODE == HINT_MODE_GET)  
                 *hints_size = xframe.hint.hintlength;  
   
847          /*          /*
848           * This is statictical data, e.g. for 2-pass. If you are not           * This is statictical data, e.g. for 2-pass. If you are not
849           * interested in any of this, you can use NULL instead of &xstats           * interested in any of this, you can use NULL instead of &xstats
# Line 997  Line 898 
898          xframe.length = m4v_size;          xframe.length = m4v_size;
899          xframe.image = out_buffer;          xframe.image = out_buffer;
900          xframe.stride = XDIM;          xframe.stride = XDIM;
901          xframe.colorspace = XVID_CSP_YV12;             /* XVID_CSP_USER is fastest (no memcopy involved) */          xframe.colorspace = XVID_CSP_YV12;             // XVID_CSP_USER is fastest (no memcopy involved)
902    
903          xerr = xvid_decore(dec_handle, XVID_DEC_DECODE, &xframe, NULL);          xerr = xvid_decore(dec_handle, XVID_DEC_DECODE, &xframe, NULL);
904    

Legend:
Removed from v.1.4.2.1  
changed lines
  Added in v.1.12

No admin address has been configured
ViewVC Help
Powered by ViewVC 1.0.4