--- branches/dev-api-4/xvidcore/examples/xvid_encraw.c 2003/03/09 00:28:09 909 +++ branches/dev-api-4/xvidcore/examples/xvid_encraw.c 2003/03/11 23:39:47 918 @@ -19,15 +19,15 @@ * 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_encraw.c,v 1.11.2.1 2003-03-09 00:28:09 edgomez Exp $ + * $Id: xvid_encraw.c,v 1.11.2.4 2003-03-11 23:39:47 edgomez Exp $ * ****************************************************************************/ /***************************************************************************** * Application notes : * - * A sequence of YUV pics in PGM file format is encoded and decoded - * The speed is measured and PSNR of decoded picture is calculated. + * A sequence of raw YUV I420 pics or YUV I420 PGM file format is encoded + * The speed is measured and frames' PSNR are taken from core. * * The program is plain C and needs no libraries except for libxvidcore, * and maths-lib. @@ -56,7 +56,7 @@ PMV_HALFPELREFINE16, PMV_HALFPELREFINE16 | PMV_HALFPELREFINE8, PMV_HALFPELREFINE16 | PMV_HALFPELREFINE8 | PMV_EXTSEARCH16 | PMV_USESQUARES16, - PMV_HALFPELREFINE16 | PMV_HALFPELREFINE8 | PMV_EXTSEARCH16 | PMV_USESQUARES16, + PMV_HALFPELREFINE16 | PMV_HALFPELREFINE8 | PMV_EXTSEARCH16 | PMV_USESQUARES16 | PMV_CHROMA16 | PMV_CHROMA8, }; static xvid_vol_t const vol_presets[] = { @@ -84,6 +84,7 @@ /* Maximum number of frames to encode */ #define ABS_MAXFRAMENR 9999 +static int ARG_STATS = 0; static int ARG_BITRATE = 900; static int ARG_QUANTI = 0; static int ARG_QUALITY = 5; @@ -140,7 +141,8 @@ static int enc_stop(); static int enc_main(unsigned char* image, unsigned char* bitstream, - long *frametype); + long *frametype, + int stats[3]); /***************************************************************************** * Main function @@ -216,6 +218,9 @@ i++; ARG_INPUTFILE = argv[i]; } + else if (strcmp("-s", argv[i]) == 0) { + ARG_STATS = 1; + } else if (strcmp("-t", argv[i]) == 0 && i < argc - 1 ) { i++; ARG_INPUTTYPE = atoi(argv[i]); @@ -228,9 +233,8 @@ i++; ARG_QUANTI = atoi(argv[i]); } - else if (strcmp("-m", argv[i]) == 0 && i < argc - 1 ) { - i++; - ARG_SAVEMPEGSTREAM = atoi(argv[i]); + else if (strcmp("-m", argv[i]) == 0) { + ARG_SAVEMPEGSTREAM = 1; } else if (strcmp("-o", argv[i]) == 0 && i < argc - 1 ) { i++; @@ -341,13 +345,18 @@ do { - if (ARG_INPUTTYPE) - status = read_pgmdata(in_file, in_buffer); /* read PGM data (YUV-format) */ - else - status = read_yuvdata(in_file, in_buffer); /* read raw data (YUV-format) */ + char *type; + int stats[3]; + + if(ARG_INPUTTYPE) { + /* read PGM data (YUV-format) */ + status = read_pgmdata(in_file, in_buffer); + } else { + /* read raw data (YUV-format) */ + status = read_yuvdata(in_file, in_buffer); + } - if (status) - { + if(status) { /* Couldn't read image, most likely end-of-file */ continue; } @@ -357,38 +366,49 @@ ****************************************************************************/ enctime = msecond(); - m4v_size = enc_main(in_buffer, mp4_buffer, &frame_type); + m4v_size = enc_main(in_buffer, mp4_buffer, &frame_type, stats); enctime = msecond() - enctime; /* Not coded frames return 0 */ if(m4v_size == 0) goto next_frame; - { - char *type; - - switch(frame_type) { - case XVID_TYPE_IVOP: - type = "I"; - break; - case XVID_TYPE_PVOP: - type = "P"; - break; - case XVID_TYPE_BVOP: - type = "B"; - break; - case XVID_TYPE_SVOP: - type = "S"; - break; - default: - type = "Unknown"; - break; - } - - printf("Frame %5d: type = %s, enctime(ms) =%6.1f, length(bytes) =%7d\n", - (int)filenr, type, (float)enctime, (int)m4v_size); - + /* Write the Frame statistics */ + switch(frame_type) { + case XVID_TYPE_IVOP: + type = "I"; + break; + case XVID_TYPE_PVOP: + type = "P"; + break; + case XVID_TYPE_BVOP: + type = "B"; + break; + case XVID_TYPE_SVOP: + type = "S"; + break; + case XVID_TYPE_NOTHING: + type = "N"; + break; + default: + type = "U"; + break; + } + + printf("Frame %5d: type = %s, enctime(ms) =%6.1f, length(bytes) =%7d", + (int)filenr, + type, + (float)enctime, + (int)m4v_size); + + if(ARG_STATS) { + printf(", psnr y = %2.2f, psnr u = %2.2f, psnr v = %2.2f", + (stats[0] == 0)? 0.0f: 48.131f - 10*(float)log10((float)stats[0]/((float)(XDIM)*(YDIM))), + (stats[1] == 0)? 0.0f: 48.131f - 10*(float)log10((float)stats[1]/((float)(XDIM)*(YDIM)/4)), + (stats[2] == 0)? 0.0f: 48.131f - 10*(float)log10((float)stats[2]/((float)(XDIM)*(YDIM)/4))); } + printf("\n"); + /* Update encoding time stats */ totalenctime += enctime; totalsize += m4v_size; @@ -415,13 +435,13 @@ } } + filenr++; + next_frame: /* Read the header if it's pgm stream */ if (ARG_INPUTTYPE) status = read_pgmheader(in_file); - if(frame_type != 5) filenr++; - } while ( (!status) && (filenr0)\n"); fprintf(stderr, " -i string : input filename (default=stdin)\n"); + fprintf(stderr, " -s : print stats about encoded frames\n"); fprintf(stderr, " -t integer : input data type (yuv=0, pgm=1)\n"); fprintf(stderr, " -n integer : number of frames to encode\n"); fprintf(stderr, " -q integer : quality ([0..5])\n"); fprintf(stderr, " -d boolean : save decoder output (0 False*, !=0 True)\n"); - fprintf(stderr, " -m boolean : save mpeg4 raw stream (0 False*, !=0 True)\n"); + fprintf(stderr, " -m : save mpeg4 raw stream\n"); fprintf(stderr, " -o string : output container filename (only usefull when -m 1 is used) :\n"); fprintf(stderr, " When this option is not used : one file per encoded frame\n"); fprintf(stderr, " When this option is used : save to 'string' file\n"); @@ -662,7 +684,7 @@ xvid_enc_create.frame_drop_ratio = 0; /* Global encoder options */ - xvid_enc_create.global = 0; + xvid_enc_create.global = (ARG_STATS)?XVID_EXTRASTATS_ENABLE:0; /* I use a small value here, since will not encode whole movies, but short clips */ xerr = xvid_encore(NULL, XVID_ENC_CREATE, &xvid_enc_create, NULL); @@ -685,7 +707,8 @@ static int enc_main(unsigned char* image, unsigned char* bitstream, - long *frametype) + long *frametype, + int stats[3]) { int ret; @@ -726,9 +749,19 @@ xvid_enc_frame.quant_intra_matrix = NULL; xvid_enc_frame.quant_inter_matrix = NULL; + /* Foll proof */ + xvid_enc_stats[0].sse_y = 0; + xvid_enc_stats[0].sse_v = 0; + xvid_enc_stats[0].sse_u = 0; + + /* Encode the frame */ + xvid_enc_frame.vop_flags |= (ARG_STATS)?XVID_EXTRASTATS:0; ret = xvid_encore(enc_handle, XVID_ENC_ENCODE, &xvid_enc_frame, &xvid_enc_stats); *frametype = xvid_enc_stats[0].type; + stats[0] = xvid_enc_stats[0].sse_y; + stats[1] = xvid_enc_stats[0].sse_u; + stats[2] = xvid_enc_stats[0].sse_v; return(ret); }