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

Diff of /xvidcore/examples/xvid_decraw.c

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

revision 1.1.2.2, Mon Jan 13 00:37:20 2003 UTC revision 1.3, Fri Sep 27 20:58:30 2002 UTC
# Line 115  Line 115 
115          unsigned char *mp4_ptr    = NULL;          unsigned char *mp4_ptr    = NULL;
116          unsigned char *out_buffer = NULL;          unsigned char *out_buffer = NULL;
117          int bigendian = 0;          int bigendian = 0;
         int still_left_in_packet;  
118    
119          double totaldectime;          double totaldectime;
120    
# Line 230  Line 229 
229   *                               Main loop   *                               Main loop
230   ****************************************************************************/   ****************************************************************************/
231    
         totalsize = LONG_PACK('M','P','4','U');  
         mp4_ptr = (unsigned char *)&totalsize;  
         if(*mp4_ptr == 'M')  
                 bigendian = 1;  
         else  
                 bigendian = 0;  
   
232          if(ARG_STREAMTYPE) {          if(ARG_STREAMTYPE) {
233    
234                  unsigned char header[4];                  unsigned char header[4];
# Line 246  Line 238 
238                          goto release_all;                          goto release_all;
239                  fread(header, 4, 1, in_file);                  fread(header, 4, 1, in_file);
240    
241                  if(header[0] != 'M' || header[1] != 'P' ||                  if(header[0] != '2' || header[1] != 'M' ||
242                     header[2] != '4' || header[3] != 'U') {                     header[2] != 'O' || header[3] != 'G') {
243                          fprintf(stderr, "Error, this not a mp4u container file\n");                          fprintf(stderr, "Error, this not a mp4u container file\n");
244                          goto release_all;                          goto release_all;
245                  }                  }
246    
247          }          }
248          else {  
249                  fread(mp4_buffer, BUFFER_SIZE, 1, in_file);          totalsize = LONG_PACK('M','P','4','U');
250          }          mp4_ptr = (unsigned char *)&totalsize;
251            if(*mp4_ptr == 'M')
252                    bigendian = 1;
253            else
254                    bigendian = 0;
255    
256          totaldectime = 0;          totaldectime = 0;
257          totalsize = 0;          totalsize = 0;
258          filenr = 0;          filenr = 0;
         still_left_in_packet = 0;  
259          mp4_ptr = mp4_buffer;          mp4_ptr = mp4_buffer;
260    
261          do {          do {
# Line 272  Line 267 
267                  /* Read data from input file */                  /* Read data from input file */
268                  if(ARG_STREAMTYPE ) {                  if(ARG_STREAMTYPE ) {
269    
270                          /*                          /* MP4U container */
                          * MP4U container  
                          *  
                          * When dealing with mp4u, we have to take care about PBB...B packets  
                          * generated with some XviD options.  
                          *  
                          * We use the still_left_in_packet variable to keep trace of how many  
                          * bytes we loaded at a time.  
                          */  
   
                         /* Still real frames in loaded packet ? */  
                         if(still_left_in_packet < 7) {  
271    
272                                  /* Read stream size first */                                  /* Read stream size first */
273                                  if(feof(in_file))                                  if(feof(in_file))
274                                          break;                                          break;
275                                  fread(&still_left_in_packet, sizeof(long), 1, in_file);                          fread(&mp4_size, sizeof(long), 1, in_file);
276    
277                                  /* Mp4U container is big endian */                          if(bigendian)
278                                  if(!bigendian)                                  mp4_size = SWAP(mp4_size);
                                         mp4_size = SWAP(still_left_in_packet);  
279    
280                                  /* Read mp4_size_bytes */                                  /* Read mp4_size_bytes */
281                                  if(feof(in_file))                                  if(feof(in_file))
282                                          break;                                          break;
283                                  fread(mp4_buffer, still_left_in_packet, 1, in_file);                          fread(mp4_buffer, mp4_size, 1, in_file);
284    
285                                  /*                                  /*
286                                   * When reading mp4u, we don't have to care about buffer                                   * When reading mp4u, we don't have to care about buffer
# Line 307  Line 290 
290                                  mp4_ptr = mp4_buffer;                                  mp4_ptr = mp4_buffer;
291    
292                          }                          }
   
                 }  
293                  else {                  else {
294    
295                          /*                          /* Real raw stream */
                          * Real raw stream  
                          *  
                          * In raw stream mode,we don't have to care how many bytes there're  
                          * still in packet because we simply let the decore decode frames  
                          * without taking care of buffer overruns or underruns.  
                          *  
                          */  
                         still_left_in_packet = 0;  
296    
297                          /* buffer more than half empty -> Fill it */                          /* buffer more than half empty -> Fill it */
298                          if (mp4_ptr > mp4_buffer + BUFFER_SIZE/2) {                          if (mp4_ptr > mp4_buffer + BUFFER_SIZE/2) {
# Line 335  Line 308 
308                                  /* read new data */                                  /* read new data */
309                                  if(feof(in_file))                                  if(feof(in_file))
310                                          break;                                          break;
   
311                                  fread(mp4_buffer + rest, BUFFER_SIZE - rest, 1, in_file);                                  fread(mp4_buffer + rest, BUFFER_SIZE - rest, 1, in_file);
   
312                          }                          }
313    
314                  }                  }
315    
                  /* The do loop is just to flush NVOPS */  
                 do {  
   
316                          /* Decode frame */                          /* Decode frame */
317                          dectime = msecond();                          dectime = msecond();
318                          status = dec_main(mp4_ptr, out_buffer, mp4_size, &used_bytes);                          status = dec_main(mp4_ptr, out_buffer, mp4_size, &used_bytes);
# Line 359  Line 327 
327                           * mp4_ptr = mp4_buffer for each frame                           * mp4_ptr = mp4_buffer for each frame
328                           */                           */
329                          mp4_ptr += used_bytes;                          mp4_ptr += used_bytes;
                         still_left_in_packet -= used_bytes;  
330    
331                          /* Total size */                  /* Updated data */
332                          totalsize += used_bytes;                          totalsize += used_bytes;
   
                 }while(used_bytes <= 7); /* <= 7 bytes is a NVOPS */  
   
                 /* Updated data - Count only usefull decode time */  
333                  totaldectime += dectime;                  totaldectime += dectime;
334    
335                  /* Prints some decoding stats */                  /* Prints some decoding stats */
336                  printf("Frame %5d: dectime =%6.1f ms length=%7d bytes \n",                  printf("Frame %5d: dectime =%6.1f ms length=%7d bytes \n",
337                             filenr, dectime, used_bytes);                             filenr, dectime, used_bytes);
338    
339                  /* Save individual mpeg4 stream if required */                  /* Save individual mpeg4 strean if required */
340                  if (ARG_SAVEMPEGSTREAM) {                  if (ARG_SAVEMPEGSTREAM) {
341                          FILE *filehandle = NULL;                          FILE *filehandle = NULL;
342    
# Line 390  Line 353 
353                          }                          }
354                  }                  }
355    
356    
357                  /* Save output frame if required */                  /* Save output frame if required */
358                  if (ARG_SAVEDECOUTPUT) {                  if (ARG_SAVEDECOUTPUT) {
359                          sprintf(filename, "%sdec%05d.pgm", filepath, filenr);                          sprintf(filename, "%sdec%05d.pgm", filepath, filenr);
# Line 413  Line 377 
377          totaldectime /= filenr;          totaldectime /= filenr;
378    
379          printf("Avg: dectime %5.2f ms, %5.2f fps, mp4 stream size =%d\n",          printf("Avg: dectime %5.2f ms, %5.2f fps, mp4 stream size =%d\n",
380                  totaldectime, 1000/totaldectime, (int)totalsize);                  totaldectime, 1000/totaldectime, totalsize);
381    
382  /*****************************************************************************  /*****************************************************************************
383   *      XviD PART  Stop   *      XviD PART  Stop
384   ****************************************************************************/  /****************************************************************************/
385    
386   release_all:   release_all:
387          if (dec_handle) {          if (dec_handle) {
# Line 473  Line 437 
437  #endif  #endif
438  }  }
439    
440    
441  /*****************************************************************************  /*****************************************************************************
442   *              output functions   *              output functions
443   ****************************************************************************/   ****************************************************************************/
# Line 547  Line 512 
512          xparam.height = YDIM;          xparam.height = YDIM;
513    
514          xerr = xvid_decore(NULL, XVID_DEC_CREATE, &xparam, NULL);          xerr = xvid_decore(NULL, XVID_DEC_CREATE, &xparam, NULL);
   
515          dec_handle = xparam.handle;          dec_handle = xparam.handle;
516    
517          return xerr;          return xerr;

Legend:
Removed from v.1.1.2.2  
changed lines
  Added in v.1.3

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