--- trunk/xvidcore/examples/xvid_decraw.c 2004/04/15 19:44:06 1432 +++ trunk/xvidcore/examples/xvid_decraw.c 2010/03/09 09:20:05 1882 @@ -20,7 +20,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * $Id: xvid_decraw.c,v 1.14 2004-04-15 19:44:05 edgomez Exp $ + * $Id: xvid_decraw.c,v 1.27 2010-03-09 09:20:05 Isibaar Exp $ * ****************************************************************************/ @@ -54,11 +54,9 @@ * Global vars in module and constants ****************************************************************************/ -/* max number of frames */ -#define ABS_MAXFRAMENR 9999 - #define USE_PNM 0 #define USE_TGA 1 +#define USE_YUV 2 static int XDIM = 0; static int YDIM = 0; @@ -68,19 +66,22 @@ static int CSP = XVID_CSP_I420; static int BPP = 1; static int FORMAT = USE_PNM; +static int POSTPROC = 0; static char filepath[256] = "./"; static void *dec_handle = NULL; #define BUFFER_SIZE (2*1024*1024) +static const int display_buffer_bytes = 0; + +#define MIN_USEFUL_BYTES 1 + /***************************************************************************** * Local prototypes ****************************************************************************/ static double msecond(); -static int write_pgm(char *filename, - unsigned char *image); static int dec_init(int use_assembler, int debug_level); static int dec_main(unsigned char *istream, unsigned char *ostream, @@ -88,9 +89,10 @@ xvid_dec_stats_t *xvid_dec_stats); static int dec_stop(); static void usage(); -int write_image(char *prefix, unsigned char *image); -int write_pnm(char *filename, unsigned char *image); -int write_tga(char *filename, unsigned char *image); +static int write_image(char *prefix, unsigned char *image, int filenr); +static int write_pnm(char *filename, unsigned char *image); +static int write_tga(char *filename, unsigned char *image); +static int write_yuv(char *filename, unsigned char *image); const char * type2str(int type) { @@ -113,6 +115,7 @@ unsigned char *mp4_ptr = NULL; unsigned char *out_buffer = NULL; int useful_bytes; + int chunk; xvid_dec_stats_t xvid_dec_stats; double totaldectime; @@ -120,7 +123,7 @@ long totalsize; int status; - int use_assembler = 0; + int use_assembler = 1; int debug_level = 0; char filename[256]; @@ -130,7 +133,7 @@ int i; printf("xvid_decraw - raw mpeg4 bitstream decoder "); - printf("written by Christoph Lampert 2002-2003\n\n"); + printf("written by Christoph Lampert\n\n"); /***************************************************************************** * Command line parsing @@ -138,8 +141,8 @@ for (i=1; i< argc; i++) { - if (strcmp("-asm", argv[i]) == 0 ) { - use_assembler = 1; + if (strcmp("-noasm", argv[i]) == 0 ) { + use_assembler = 0; } else if (strcmp("-debug", argv[i]) == 0 && i < argc - 1 ) { i++; if (sscanf(argv[i], "0x%x", &debug_level) != 1) { @@ -170,10 +173,17 @@ CSP = XVID_CSP_I420; BPP = 1; } + } else if (strcmp("-postproc", argv[i]) == 0 && i < argc - 1 ) { + i++; + POSTPROC = atoi(argv[i]); + if (POSTPROC < 0) POSTPROC = 0; + if (POSTPROC > 2) POSTPROC = 2; } else if (strcmp("-f", argv[i]) == 0 && i < argc -1) { i++; if (strcmp(argv[i], "tga") == 0) { FORMAT = USE_TGA; + } else if (strcmp(argv[i], "yuv") == 0) { + FORMAT = USE_YUV; } else { FORMAT = USE_PNM; } @@ -212,6 +222,9 @@ if (BPP != 1 && BPP != 3 && FORMAT == USE_PNM) { FORMAT = USE_TGA; } + if (BPP != 1 && FORMAT == USE_YUV) { + FORMAT = USE_TGA; + } /***************************************************************************** * Memory allocation @@ -224,7 +237,7 @@ goto free_all_memory; /***************************************************************************** - * XviD PART Start + * Xvid PART Start ****************************************************************************/ status = dec_init(use_assembler, debug_level); @@ -246,7 +259,8 @@ totalsize = 0; filenr = 0; mp4_ptr = mp4_buffer; - + chunk = 0; + do { int used_bytes = 0; double dectime; @@ -266,13 +280,11 @@ mp4_ptr = mp4_buffer; /* read new data */ - if(feof(in_file)) - break; - - useful_bytes += fread(mp4_buffer + already_in_buffer, - 1, BUFFER_SIZE - already_in_buffer, - in_file); - + if(!feof(in_file)) { + useful_bytes += fread(mp4_buffer + already_in_buffer, + 1, BUFFER_SIZE - already_in_buffer, + in_file); + } } @@ -304,6 +316,22 @@ fprintf(stderr, "Resized frame buffer to %dx%d\n", XDIM, YDIM); } + + /* Save individual mpeg4 stream if required */ + if(ARG_SAVEMPEGSTREAM) { + FILE *filehandle = NULL; + + sprintf(filename, "%svolhdr.m4v", filepath); + filehandle = fopen(filename, "wb"); + if(!filehandle) { + fprintf(stderr, + "Error writing vol header mpeg4 stream to file %s\n", + filename); + } else { + fwrite(mp4_ptr, 1, used_bytes, filehandle); + fclose(filehandle); + } + } } /* Update buffer pointers */ @@ -315,7 +343,10 @@ totalsize += used_bytes; } - }while(xvid_dec_stats.type <= 0 && useful_bytes > 0); + if (display_buffer_bytes) { + printf("Data chunk %d: %d bytes consumed, %d bytes in buffer\n", chunk++, used_bytes, useful_bytes); + } + } while (xvid_dec_stats.type <= 0 && useful_bytes > MIN_USEFUL_BYTES); /* Check if there is a negative number of useful bytes left in buffer * This means we went too far */ @@ -326,9 +357,11 @@ totaldectime += dectime; - printf("Frame %5d: type = %s, dectime(ms) =%6.1f, length(bytes) =%7d\n", - filenr, type2str(xvid_dec_stats.type), dectime, used_bytes); - + if (!display_buffer_bytes) { + printf("Frame %5d: type = %s, dectime(ms) =%6.1f, length(bytes) =%7d\n", + filenr, type2str(xvid_dec_stats.type), dectime, used_bytes); + } + /* Save individual mpeg4 stream if required */ if(ARG_SAVEMPEGSTREAM) { FILE *filehandle = NULL; @@ -348,17 +381,20 @@ /* Save output frame if required */ if (ARG_SAVEDECOUTPUT) { - sprintf(filename, "%sdec%05d", filepath, filenr); - if(write_image(filename, out_buffer)) { + sprintf(filename, "%sdec", filepath); + + if(write_image(filename, out_buffer, filenr)) { fprintf(stderr, - "Error writing decoded PGM frame %s\n", + "Error writing decoded frame %s\n", filename); } } filenr++; - } while ( (status>=0) && (filenrMIN_USEFUL_BYTES || !feof(in_file)); + + useful_bytes = 0; /* Empty buffer */ /***************************************************************************** * Flush decoder buffers @@ -374,7 +410,10 @@ dectime = msecond(); used_bytes = dec_main(NULL, out_buffer, -1, &xvid_dec_stats); dectime = msecond() - dectime; - }while(used_bytes>=0 && xvid_dec_stats.type <= 0); + if (display_buffer_bytes) { + printf("Data chunk %d: %d bytes consumed, %d bytes in buffer\n", chunk++, used_bytes, useful_bytes); + } + } while(used_bytes>=0 && xvid_dec_stats.type <= 0); if (used_bytes < 0) { /* XVID_ERR_END */ break; @@ -384,13 +423,16 @@ totaldectime += dectime; /* Prints some decoding stats */ - printf("Frame %5d: type = %s, dectime(ms) =%6.1f, length(bytes) =%7d\n", - filenr, type2str(xvid_dec_stats.type), dectime, used_bytes); - + if (!display_buffer_bytes) { + printf("Frame %5d: type = %s, dectime(ms) =%6.1f, length(bytes) =%7d\n", + filenr, type2str(xvid_dec_stats.type), dectime, used_bytes); + } + /* Save output frame if required */ if (ARG_SAVEDECOUTPUT) { - sprintf(filename, "%sdec%05d", filepath, filenr); - if(write_image(filename, out_buffer)) { + sprintf(filename, "%sdec", filepath); + + if(write_image(filename, out_buffer, filenr)) { fprintf(stderr, "Error writing decoded frame %s\n", filename); @@ -415,7 +457,7 @@ } /***************************************************************************** - * XviD PART Stop + * Xvid PART Stop ****************************************************************************/ release_all: @@ -441,12 +483,13 @@ fprintf(stderr, "Usage : xvid_decraw [OPTIONS]\n"); fprintf(stderr, "Options :\n"); - fprintf(stderr, " -asm : use assembly optimizations (default=disabled)\n"); + fprintf(stderr, " -noasm : don't use assembly optimizations (default=enabled)\n"); fprintf(stderr, " -debug : debug level (debug=0)\n"); fprintf(stderr, " -i string : input filename (default=stdin)\n"); fprintf(stderr, " -d : save decoder output\n"); fprintf(stderr, " -c csp : choose colorspace output (rgb16, rgb24, rgb32, yv12, i420)\n"); - fprintf(stderr, " -f format : choose output file format (tga, pnm, pgm)\n"); + fprintf(stderr, " -f format : choose output file format (tga, pnm, pgm, yuv)\n"); + fprintf(stderr, " -postproc : postprocessing level (0=off, 1=deblock, 2=deblock+dering)\n"); fprintf(stderr, " -m : save mpeg4 raw stream to individual files\n"); fprintf(stderr, " -help : This help message\n"); fprintf(stderr, " (* means default)\n"); @@ -468,7 +511,7 @@ #else clock_t clk; clk = clock(); - return(clk * 1000 / CLOCKS_PER_SEC); + return(clk * 1000.0 / CLOCKS_PER_SEC); #endif } @@ -476,7 +519,7 @@ * output functions ****************************************************************************/ -int write_image(char *prefix, unsigned char *image) +static int write_image(char *prefix, unsigned char *image, int filenr) { char filename[1024]; char *ext; @@ -486,6 +529,8 @@ ext = "pgm"; } else if (FORMAT == USE_PNM && BPP == 3) { ext = "pnm"; + } else if (FORMAT == USE_YUV) { + ext = "yuv"; } else if (FORMAT == USE_TGA) { ext = "tga"; } else { @@ -493,10 +538,20 @@ exit(-1); } - sprintf(filename, "%s.%s", prefix, ext); + if (FORMAT == USE_YUV) { + sprintf(filename, "%s.%s", prefix, ext); + + if (!filenr) { + FILE *fp = fopen(filename, "wb"); + fclose(fp); + } + } else + sprintf(filename, "%s%05d.%s", prefix, filenr, ext); if (FORMAT == USE_PNM) { ret = write_pnm(filename, image); + } else if (FORMAT == USE_YUV) { + ret = write_yuv(filename, image); } else { ret = write_tga(filename, image); } @@ -504,7 +559,7 @@ return(ret); } -int write_tga(char *filename, unsigned char *image) +static int write_tga(char *filename, unsigned char *image) { FILE * f; char hdr[18]; @@ -547,21 +602,21 @@ #else { int i; - for (i=0; iversion = XVID_VERSION; /* No general flags to set */ - xvid_dec_frame.general = 0; + if (POSTPROC == 1) + xvid_dec_frame.general = XVID_DEBLOCKY | XVID_DEBLOCKUV; + else if (POSTPROC==2) + xvid_dec_frame.general = XVID_DEBLOCKY | XVID_DEBLOCKUV | XVID_DERINGY | XVID_DERINGUV; + else + xvid_dec_frame.general = 0; /* Input stream */ xvid_dec_frame.bitstream = istream;