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_decraw.c,v 1.1.2.1 2003-01-12 17:21:04 edgomez Exp $ |
* $Id: xvid_decraw.c,v 1.1.2.2 2003-01-13 00:37:20 edgomez Exp $ |
23 |
* |
* |
24 |
****************************************************************************/ |
****************************************************************************/ |
25 |
|
|
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; |
118 |
|
int still_left_in_packet; |
119 |
|
|
120 |
double totaldectime; |
double totaldectime; |
121 |
|
|
260 |
totaldectime = 0; |
totaldectime = 0; |
261 |
totalsize = 0; |
totalsize = 0; |
262 |
filenr = 0; |
filenr = 0; |
263 |
|
still_left_in_packet = 0; |
264 |
mp4_ptr = mp4_buffer; |
mp4_ptr = mp4_buffer; |
265 |
|
|
266 |
do { |
do { |
272 |
/* Read data from input file */ |
/* Read data from input file */ |
273 |
if(ARG_STREAMTYPE) { |
if(ARG_STREAMTYPE) { |
274 |
|
|
275 |
/* MP4U container */ |
/* |
276 |
|
* MP4U container |
277 |
|
* |
278 |
|
* When dealing with mp4u, we have to take care about PBB...B packets |
279 |
|
* generated with some XviD options. |
280 |
|
* |
281 |
|
* We use the still_left_in_packet variable to keep trace of how many |
282 |
|
* bytes we loaded at a time. |
283 |
|
*/ |
284 |
|
|
285 |
|
/* Still real frames in loaded packet ? */ |
286 |
|
if(still_left_in_packet < 7) { |
287 |
|
|
288 |
/* Read stream size first */ |
/* Read stream size first */ |
289 |
if(feof(in_file)) |
if(feof(in_file)) |
290 |
break; |
break; |
291 |
fread(&mp4_size, sizeof(long), 1, in_file); |
fread(&still_left_in_packet, sizeof(long), 1, in_file); |
292 |
|
|
293 |
/* Mp4U container is big endian */ |
/* Mp4U container is big endian */ |
294 |
if(!bigendian) |
if(!bigendian) |
295 |
mp4_size = SWAP(mp4_size); |
mp4_size = SWAP(still_left_in_packet); |
296 |
|
|
297 |
/* Read mp4_size_bytes */ |
/* Read mp4_size_bytes */ |
298 |
if(feof(in_file)) |
if(feof(in_file)) |
299 |
break; |
break; |
300 |
fread(mp4_buffer, mp4_size, 1, in_file); |
fread(mp4_buffer, still_left_in_packet, 1, in_file); |
301 |
|
|
302 |
/* |
/* |
303 |
* When reading mp4u, we don't have to care about buffer |
* When reading mp4u, we don't have to care about buffer |
307 |
mp4_ptr = mp4_buffer; |
mp4_ptr = mp4_buffer; |
308 |
|
|
309 |
} |
} |
310 |
|
|
311 |
|
} |
312 |
else { |
else { |
313 |
|
|
314 |
/* Real raw stream */ |
/* |
315 |
|
* Real raw stream |
316 |
|
* |
317 |
|
* In raw stream mode,we don't have to care how many bytes there're |
318 |
|
* still in packet because we simply let the decore decode frames |
319 |
|
* without taking care of buffer overruns or underruns. |
320 |
|
* |
321 |
|
*/ |
322 |
|
still_left_in_packet = 0; |
323 |
|
|
324 |
/* buffer more than half empty -> Fill it */ |
/* buffer more than half empty -> Fill it */ |
325 |
if (mp4_ptr > mp4_buffer + BUFFER_SIZE/2) { |
if (mp4_ptr > mp4_buffer + BUFFER_SIZE/2) { |
335 |
/* read new data */ |
/* read new data */ |
336 |
if(feof(in_file)) |
if(feof(in_file)) |
337 |
break; |
break; |
338 |
|
|
339 |
fread(mp4_buffer + rest, BUFFER_SIZE - rest, 1, in_file); |
fread(mp4_buffer + rest, BUFFER_SIZE - rest, 1, in_file); |
340 |
|
|
341 |
} |
} |
342 |
|
|
343 |
} |
} |
344 |
|
|
345 |
|
/* The do loop is just to flush NVOPS */ |
346 |
|
do { |
347 |
|
|
348 |
/* Decode frame */ |
/* Decode frame */ |
349 |
dectime = msecond(); |
dectime = msecond(); |
350 |
status = dec_main(mp4_ptr, out_buffer, mp4_size, &used_bytes); |
status = dec_main(mp4_ptr, out_buffer, mp4_size, &used_bytes); |
359 |
* mp4_ptr = mp4_buffer for each frame |
* mp4_ptr = mp4_buffer for each frame |
360 |
*/ |
*/ |
361 |
mp4_ptr += used_bytes; |
mp4_ptr += used_bytes; |
362 |
|
still_left_in_packet -= used_bytes; |
363 |
|
|
364 |
/* Updated data */ |
/* Total size */ |
365 |
totalsize += used_bytes; |
totalsize += used_bytes; |
366 |
|
|
367 |
|
}while(used_bytes <= 7); /* <= 7 bytes is a NVOPS */ |
368 |
|
|
369 |
|
/* Updated data - Count only usefull decode time */ |
370 |
totaldectime += dectime; |
totaldectime += dectime; |
371 |
|
|
372 |
/* Prints some decoding stats */ |
/* Prints some decoding stats */ |
373 |
printf("Frame %5d: dectime =%6.1f ms length=%7d bytes \n", |
printf("Frame %5d: dectime =%6.1f ms length=%7d bytes \n", |
374 |
filenr, dectime, used_bytes); |
filenr, dectime, used_bytes); |
375 |
|
|
376 |
/* Save individual mpeg4 strean if required */ |
/* Save individual mpeg4 stream if required */ |
377 |
if (ARG_SAVEMPEGSTREAM) { |
if (ARG_SAVEMPEGSTREAM) { |
378 |
FILE *filehandle = NULL; |
FILE *filehandle = NULL; |
379 |
|
|
390 |
} |
} |
391 |
} |
} |
392 |
|
|
|
|
|
393 |
/* Save output frame if required */ |
/* Save output frame if required */ |
394 |
if (ARG_SAVEDECOUTPUT) { |
if (ARG_SAVEDECOUTPUT) { |
395 |
sprintf(filename, "%sdec%05d.pgm", filepath, filenr); |
sprintf(filename, "%sdec%05d.pgm", filepath, filenr); |
547 |
xparam.height = YDIM; |
xparam.height = YDIM; |
548 |
|
|
549 |
xerr = xvid_decore(NULL, XVID_DEC_CREATE, &xparam, NULL); |
xerr = xvid_decore(NULL, XVID_DEC_CREATE, &xparam, NULL); |
550 |
|
|
551 |
dec_handle = xparam.handle; |
dec_handle = xparam.handle; |
552 |
|
|
553 |
return xerr; |
return xerr; |