20 |
* along with this program; if not, write to the Free Software |
* along with this program; if not, write to the Free Software |
21 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
22 |
* |
* |
23 |
* $Id: xvid_decraw.c,v 1.18 2004-07-26 19:31:30 edgomez Exp $ |
* $Id: xvid_decraw.c,v 1.19 2004-09-04 14:16:24 edgomez Exp $ |
24 |
* |
* |
25 |
****************************************************************************/ |
****************************************************************************/ |
26 |
|
|
54 |
* Global vars in module and constants |
* Global vars in module and constants |
55 |
****************************************************************************/ |
****************************************************************************/ |
56 |
|
|
|
/* max number of frames */ |
|
|
#define ABS_MAXFRAMENR 9999 |
|
|
|
|
57 |
#define USE_PNM 0 |
#define USE_PNM 0 |
58 |
#define USE_TGA 1 |
#define USE_TGA 1 |
59 |
|
|
71 |
|
|
72 |
#define BUFFER_SIZE (2*1024*1024) |
#define BUFFER_SIZE (2*1024*1024) |
73 |
|
|
74 |
|
static const int display_buffer_bytes = 0; |
75 |
|
|
76 |
/***************************************************************************** |
/***************************************************************************** |
77 |
* Local prototypes |
* Local prototypes |
78 |
****************************************************************************/ |
****************************************************************************/ |
110 |
unsigned char *mp4_ptr = NULL; |
unsigned char *mp4_ptr = NULL; |
111 |
unsigned char *out_buffer = NULL; |
unsigned char *out_buffer = NULL; |
112 |
int useful_bytes; |
int useful_bytes; |
113 |
|
int chunk; |
114 |
xvid_dec_stats_t xvid_dec_stats; |
xvid_dec_stats_t xvid_dec_stats; |
115 |
|
|
116 |
double totaldectime; |
double totaldectime; |
244 |
totalsize = 0; |
totalsize = 0; |
245 |
filenr = 0; |
filenr = 0; |
246 |
mp4_ptr = mp4_buffer; |
mp4_ptr = mp4_buffer; |
247 |
|
chunk = 0; |
248 |
|
|
249 |
do { |
do { |
250 |
int used_bytes = 0; |
int used_bytes = 0; |
303 |
|
|
304 |
fprintf(stderr, "Resized frame buffer to %dx%d\n", XDIM, YDIM); |
fprintf(stderr, "Resized frame buffer to %dx%d\n", XDIM, YDIM); |
305 |
} |
} |
306 |
|
|
307 |
|
/* Save individual mpeg4 stream if required */ |
308 |
|
if(ARG_SAVEMPEGSTREAM) { |
309 |
|
FILE *filehandle = NULL; |
310 |
|
|
311 |
|
sprintf(filename, "%svolhdr.m4v", filepath); |
312 |
|
filehandle = fopen(filename, "wb"); |
313 |
|
if(!filehandle) { |
314 |
|
fprintf(stderr, |
315 |
|
"Error writing vol header mpeg4 stream to file %s\n", |
316 |
|
filename); |
317 |
|
} else { |
318 |
|
fwrite(mp4_ptr, 1, used_bytes, filehandle); |
319 |
|
fclose(filehandle); |
320 |
|
} |
321 |
|
} |
322 |
} |
} |
323 |
|
|
324 |
/* Update buffer pointers */ |
/* Update buffer pointers */ |
330 |
totalsize += used_bytes; |
totalsize += used_bytes; |
331 |
} |
} |
332 |
|
|
333 |
|
if (display_buffer_bytes) { |
334 |
|
printf("Data chunk %d: %d bytes consumed, %d bytes in buffer\n", chunk++, used_bytes, useful_bytes); |
335 |
|
} |
336 |
}while(xvid_dec_stats.type <= 0 && useful_bytes > 0); |
}while(xvid_dec_stats.type <= 0 && useful_bytes > 0); |
337 |
|
|
338 |
/* Check if there is a negative number of useful bytes left in buffer |
/* Check if there is a negative number of useful bytes left in buffer |
344 |
totaldectime += dectime; |
totaldectime += dectime; |
345 |
|
|
346 |
|
|
347 |
|
if (!display_buffer_bytes) { |
348 |
printf("Frame %5d: type = %s, dectime(ms) =%6.1f, length(bytes) =%7d\n", |
printf("Frame %5d: type = %s, dectime(ms) =%6.1f, length(bytes) =%7d\n", |
349 |
filenr, type2str(xvid_dec_stats.type), dectime, used_bytes); |
filenr, type2str(xvid_dec_stats.type), dectime, used_bytes); |
350 |
|
} |
351 |
|
|
352 |
/* Save individual mpeg4 stream if required */ |
/* Save individual mpeg4 stream if required */ |
353 |
if(ARG_SAVEMPEGSTREAM) { |
if(ARG_SAVEMPEGSTREAM) { |
378 |
|
|
379 |
filenr++; |
filenr++; |
380 |
|
|
381 |
} while ( (status>=0) && (filenr<ABS_MAXFRAMENR)); |
} while (useful_bytes>0 || !feof(in_file)); |
382 |
|
|
383 |
|
useful_bytes = 0; /* Empty buffer */ |
384 |
|
|
385 |
/***************************************************************************** |
/***************************************************************************** |
386 |
* Flush decoder buffers |
* Flush decoder buffers |
396 |
dectime = msecond(); |
dectime = msecond(); |
397 |
used_bytes = dec_main(NULL, out_buffer, -1, &xvid_dec_stats); |
used_bytes = dec_main(NULL, out_buffer, -1, &xvid_dec_stats); |
398 |
dectime = msecond() - dectime; |
dectime = msecond() - dectime; |
399 |
|
if (display_buffer_bytes) { |
400 |
|
printf("Data chunk %d: %d bytes consumed, %d bytes in buffer\n", chunk++, used_bytes, useful_bytes); |
401 |
|
} |
402 |
}while(used_bytes>=0 && xvid_dec_stats.type <= 0); |
}while(used_bytes>=0 && xvid_dec_stats.type <= 0); |
403 |
|
|
404 |
if (used_bytes < 0) { /* XVID_ERR_END */ |
if (used_bytes < 0) { /* XVID_ERR_END */ |
409 |
totaldectime += dectime; |
totaldectime += dectime; |
410 |
|
|
411 |
/* Prints some decoding stats */ |
/* Prints some decoding stats */ |
412 |
|
if (!display_buffer_bytes) { |
413 |
printf("Frame %5d: type = %s, dectime(ms) =%6.1f, length(bytes) =%7d\n", |
printf("Frame %5d: type = %s, dectime(ms) =%6.1f, length(bytes) =%7d\n", |
414 |
filenr, type2str(xvid_dec_stats.type), dectime, used_bytes); |
filenr, type2str(xvid_dec_stats.type), dectime, used_bytes); |
415 |
|
} |
416 |
|
|
417 |
/* Save output frame if required */ |
/* Save output frame if required */ |
418 |
if (ARG_SAVEDECOUTPUT) { |
if (ARG_SAVEDECOUTPUT) { |