[svn] / branches / dev-api-4 / xvidcore / examples / xvid_stat.c Repository:
ViewVC logotype

Diff of /branches/dev-api-4/xvidcore/examples/xvid_stat.c

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

revision 684, Wed Nov 27 21:09:10 2002 UTC revision 728, Wed Dec 18 20:48:25 2002 UTC
# Line 19  Line 19 
19   *  along with this program; if not, write to the Free Software   *  along with this program; if not, write to the Free Software
20   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA   *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21   *   *
22   * $Id: xvid_stat.c,v 1.16 2002-11-27 21:09:10 edgomez Exp $   * $Id: xvid_stat.c,v 1.17 2002-12-18 20:48:25 edgomez Exp $
23   *   *
24   ****************************************************************************/   ****************************************************************************/
25    
# 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)
47     *  -mv integer    : Hinted Motion Estimation (0 none, 1 get hints, 2 set hints)
48   *  -help          : prints this help message   *  -help          : prints this help message
49   *  -quant integer : fixed quantizer (disables -b setting)   *  -quant integer : fixed quantizer (disables -b setting)
50   *  (* means default)   *  (* means default)
# Line 99  Line 100 
100  static int enc_init(int use_assembler);  static int enc_init(int use_assembler);
101  static int enc_stop();  static int enc_stop();
102  static int enc_main(unsigned char* image, unsigned char* bitstream,  static int enc_main(unsigned char* image, unsigned char* bitstream,
103                                          int *streamlength, int* frametype);                                          unsigned char* hints_buffer,
104                                            long *streamlength, long* frametype, long* hints_size);
105    
106  /* Decoder related functions */  /* Decoder related functions */
107  static int dec_stop();  static int dec_stop();
# Line 141  Line 143 
143  /* Maximum number of frames to encode */  /* Maximum number of frames to encode */
144  #define ABS_MAXFRAMENR 9999  #define ABS_MAXFRAMENR 9999
145    
146    /* HINTMODEs */
147    #define HINT_MODE_NONE 0
148    #define HINT_MODE_GET  1
149    #define HINT_MODE_SET  2
150    #define HINT_FILE "hints.mv"
151    
152  static int   ARG_BITRATE = 900;  static int   ARG_BITRATE = 900;
153  static int   ARG_QUANTI = 0;  static int   ARG_QUANTI = 0;
154  static int   ARG_QUALITY = 6;  static int   ARG_QUALITY = 6;
# Line 152  Line 160 
160  static int   ARG_INPUTTYPE = 0;  static int   ARG_INPUTTYPE = 0;
161  static int   ARG_SAVEDECOUTPUT = 0;  static int   ARG_SAVEDECOUTPUT = 0;
162  static int   ARG_SAVEMPEGSTREAM = 0;  static int   ARG_SAVEMPEGSTREAM = 0;
163    static int   ARG_HINTMODE = HINT_MODE_NONE;
164  static int   XDIM = 0;  static int   XDIM = 0;
165  static int   YDIM = 0;  static int   YDIM = 0;
166  #define IMAGE_SIZE(x,y) ((x)*(y)*3/2)  #define IMAGE_SIZE(x,y) ((x)*(y)*3/2)
# Line 159  Line 168 
168  #define MAX(A,B) ( ((A)>(B)) ? (A) : (B) )  #define MAX(A,B) ( ((A)>(B)) ? (A) : (B) )
169  #define SMALL_EPS 1e-10  #define SMALL_EPS 1e-10
170    
171    #define LONG_PACK(a,b,c,d) ((long) (((long)(a))<<24) | (((long)(b))<<16) | \
172                                       (((long)(c))<<8)  |((long)(d)))
173    
174    #define SWAP(a) ( (((a)&0x000000ff)<<24) | (((a)&0x0000ff00)<<8) | \
175                      (((a)&0x00ff0000)>>8)  | (((a)&0xff000000)>>24) )
176    
177  /****************************************************************************  /****************************************************************************
178   *                     Nasty global vars ;-)   *                     Nasty global vars ;-)
179   ***************************************************************************/   ***************************************************************************/
# Line 183  Line 198 
198          unsigned char *divx_buffer = NULL;          unsigned char *divx_buffer = NULL;
199          unsigned char *in_buffer = NULL;          unsigned char *in_buffer = NULL;
200          unsigned char *out_buffer = NULL;          unsigned char *out_buffer = NULL;
201            unsigned char *hints_buffer = NULL;
202    
203          double enctime,dectime;          double enctime,dectime;
204          double totalenctime=0.;          double totalenctime=0.;
205          double totaldectime=0.;          double totaldectime=0.;
206    
207          long totalsize=0;          long totalsize=0;
208            long hints_size;
209          int status;          int status;
210            int bigendian;
211    
212          int m4v_size;          long m4v_size;
213          int frame_type[ABS_MAXFRAMENR];          long frame_type[ABS_MAXFRAMENR];
214          int Iframes=0, Pframes=0, use_assembler=0;          int Iframes=0, Pframes=0, use_assembler=0;
215          double framepsnr[ABS_MAXFRAMENR];          double framepsnr[ABS_MAXFRAMENR];
216    
# Line 203  Line 221 
221    
222          FILE *filehandle;          FILE *filehandle;
223          FILE *in_file = stdin;          FILE *in_file = stdin;
224            FILE *hints_file = NULL;
225    
226          printf("xvid_stat - XviD core library test program ");          printf("xvid_stat - XviD core library test program ");
227          printf("written by Christoph Lampert 2002\n\n");          printf("written by Christoph Lampert 2002\n\n");
# Line 260  Line 279 
279                          i++;                          i++;
280                          ARG_SAVEMPEGSTREAM = atoi(argv[i]);                          ARG_SAVEMPEGSTREAM = atoi(argv[i]);
281                  }                  }
282                    else if (strcmp("-mv", argv[i]) == 0 && i < argc - 1 ) {
283                            i++;
284                            ARG_HINTMODE = atoi(argv[i]);
285                    }
286                  else if (strcmp("-help", argv[i])) {                  else if (strcmp("-help", argv[i])) {
287                          usage();                          usage();
288                          return(0);                          return(0);
# Line 300  Line 323 
323                  return -1;                  return -1;
324          }          }
325    
326            if ( ARG_HINTMODE != HINT_MODE_NONE &&
327                     ARG_HINTMODE != HINT_MODE_GET &&
328                     ARG_HINTMODE != HINT_MODE_SET)
329                    ARG_HINTMODE = HINT_MODE_NONE;
330    
331            if( ARG_HINTMODE != HINT_MODE_NONE) {
332                    char *rights = "rb";
333    
334                    /*
335                     * If we are getting hints from core, we will have to write them to
336                     * hint file
337                     */
338                    if(ARG_HINTMODE == HINT_MODE_GET)
339                            rights = "w+b";
340    
341                    /* Open the hint file */
342                    hints_file = fopen(HINT_FILE, rights);
343                    if(hints_file == NULL) {
344                            fprintf(stderr, "Error opening input file %s\n", HINT_FILE);
345                            return -1;
346                    }
347    
348                    /* Allocate hint memory space, we will be using rawhints */
349                    /* NB : Hope 1Mb is enough */
350                    if((hints_buffer = malloc(1024*1024)) == NULL) {
351                            fprintf(stderr, "Memory allocation error\n");
352                            return -1;
353                    }
354    
355            }
356    
357          if ( ARG_INPUTFILE == NULL || strcmp(ARG_INPUTFILE, "stdin") == 0) {          if ( ARG_INPUTFILE == NULL || strcmp(ARG_INPUTFILE, "stdin") == 0) {
358                  in_file = stdin;                  in_file = stdin;
359          }          }
# Line 354  Line 408 
408                  goto release_all;                  goto release_all;
409          }          }
410    
411            totalsize = LONG_PACK('M','P','4','U');
412            if(*((char *)(&totalsize)) == 'M')
413                    bigendian = 1;
414            else
415                    bigendian = 0;
416    
417  /*****************************************************************************  /*****************************************************************************
418   *                            Main loop   *                            Main loop
# Line 390  Line 449 
449   */   */
450    
451  /*****************************************************************************  /*****************************************************************************
452     *                       Read hints from file
453     ****************************************************************************/
454    
455                    if(ARG_HINTMODE == HINT_MODE_SET) {
456                            fread(&hints_size, 1, sizeof(long), hints_file);
457                            hints_size = (!bigendian)?SWAP(hints_size):hints_size;
458                            fread(hints_buffer, 1, hints_size, hints_file);
459                    }
460    
461    /*****************************************************************************
462   *                       Encode and decode this frame   *                       Encode and decode this frame
463   ****************************************************************************/   ****************************************************************************/
464    
465                  enctime = msecond();                  enctime = msecond();
466                  status = enc_main(in_buffer, divx_buffer, &m4v_size, &frame_type[filenr]);                  status = enc_main(in_buffer, divx_buffer, hints_buffer,
467                                                      &m4v_size, &frame_type[filenr], &hints_size);
468                  enctime = msecond() - enctime;                  enctime = msecond() - enctime;
469    
470                  totalenctime += enctime;                  totalenctime += enctime;
# Line 403  Line 473 
473                  printf("Frame %5d: intra %1d, enctime=%6.1f ms, size=%6d bytes ",                  printf("Frame %5d: intra %1d, enctime=%6.1f ms, size=%6d bytes ",
474                             (int)filenr, (int)frame_type[filenr], (float)enctime, (int)m4v_size);                             (int)filenr, (int)frame_type[filenr], (float)enctime, (int)m4v_size);
475    
476    /*****************************************************************************
477     *                       Save hints to file
478     ****************************************************************************/
479    
480                    if(ARG_HINTMODE == HINT_MODE_GET) {
481                            hints_size = (!bigendian)?SWAP(hints_size):hints_size;
482                            fwrite(&hints_size, 1, sizeof(long), hints_file);
483                            hints_size = (!bigendian)?SWAP(hints_size):hints_size;
484                            fwrite(hints_buffer, 1, hints_size, hints_file);
485                    }
486    
487    /*****************************************************************************
488     *                       Save stream to file
489     ****************************************************************************/
490    
491                  if (ARG_SAVEMPEGSTREAM)                  if (ARG_SAVEMPEGSTREAM)
492                  {                  {
493                          sprintf(filename, "%sframe%05d.m4v", filepath, filenr);                          sprintf(filename, "%sframe%05d.m4v", filepath, filenr);
# Line 817  Line 902 
902  }  }
903    
904  static int enc_main(unsigned char* image, unsigned char* bitstream,  static int enc_main(unsigned char* image, unsigned char* bitstream,
905                                          int *streamlength, int* frametype)                                          unsigned char* hints_buffer,
906                                            long *streamlength, long* frametype, long* hints_size)
907  {  {
908          int xerr;          int xerr;
909    
# Line 838  Line 924 
924          xframe.general = general_presets[ARG_QUALITY];          xframe.general = general_presets[ARG_QUALITY];
925          xframe.quant_intra_matrix = xframe.quant_inter_matrix = NULL;          xframe.quant_intra_matrix = xframe.quant_inter_matrix = NULL;
926    
927            xframe.hint.hintstream = hints_buffer;
928    
929            if(ARG_HINTMODE == HINT_MODE_SET) {
930                    xframe.hint.hintlength = *hints_size;
931                    xframe.hint.rawhints = 0;
932                    xframe.general |= XVID_HINTEDME_SET;
933            }
934    
935            if(ARG_HINTMODE == HINT_MODE_GET) {
936                    xframe.hint.rawhints = 0;
937                    xframe.general |= XVID_HINTEDME_GET;
938            }
939    
940          xerr = xvid_encore(enc_handle, XVID_ENC_ENCODE, &xframe, &xstats);          xerr = xvid_encore(enc_handle, XVID_ENC_ENCODE, &xframe, &xstats);
941    
942            if(ARG_HINTMODE == HINT_MODE_GET)
943                    *hints_size = xframe.hint.hintlength;
944    
945          /*          /*
946           * 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
947           * interested in any of this, you can use NULL instead of &xstats           * interested in any of this, you can use NULL instead of &xstats

Legend:
Removed from v.684  
changed lines
  Added in v.728

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