--- branches/release-1_3-branch/xvidcore/examples/xvid_encraw.c 2015/07/08 17:32:48 2128 +++ branches/release-1_3-branch/xvidcore/examples/xvid_encraw.c 2015/07/08 17:32:58 2129 @@ -163,6 +163,8 @@ int stop_num; char *outfilename; /* output filename */ + char *outavifilename; /* output avi filename */ + char *outmkvfilename; /* output mkv filename */ char *statsfilename1; /* pass1 statsfile */ int input_num; @@ -998,9 +1000,12 @@ return (-1); } #ifdef USE_APP_LEVEL_THREADING - fseek(in_file, 0, SEEK_END); /* Determine input size */ - pos = ftell(in_file); - ARG_MAXFRAMENR = pos / IMAGE_SIZE(XDIM, YDIM); /* PGM, header size ?? */ + { + int pos; + fseek(in_file, 0, SEEK_END); /* Determine input size */ + pos = ftell(in_file); + ARG_MAXFRAMENR = pos / IMAGE_SIZE(XDIM, YDIM); /* PGM, header size ?? */ + } #endif fclose(in_file); } @@ -1031,8 +1036,7 @@ #ifdef USE_APP_LEVEL_THREADING if (ARG_INPUTFILE == NULL || strcmp(ARG_INPUTFILE, "stdin") == 0 || ARG_NUM_APP_THREADS <= 1 || ARG_THREADS != 0 || - ARG_TIMECODEFILE != NULL || ARG_AVIOUTPUTFILE != NULL || - ARG_INPUTTYPE == 1 || ARG_MKVOUTPUTFILE != NULL) /* TODO: PGM input */ + ARG_TIMECODEFILE != NULL || ARG_INPUTTYPE == 1) /* TODO: PGM input */ #endif /* Spawn just one encoder instance */ { enc_sequence_data_t enc_data; @@ -1042,6 +1046,8 @@ ARG_NUM_APP_THREADS = 1; enc_data.outfilename = ARG_OUTPUTFILE; + enc_data.outavifilename = ARG_AVIOUTPUTFILE; + enc_data.outmkvfilename = ARG_MKVOUTPUTFILE; enc_data.statsfilename1 = ARG_PASS1; enc_data.start_num = ARG_STARTFRAMENR; enc_data.stop_num = ARG_MAXFRAMENR; @@ -1064,6 +1070,8 @@ enc_sequence_data_t enc_data[MAX_ENC_INSTANCES]; char outfile[MAX_ENC_INSTANCES][256]; + char outavifile[MAX_ENC_INSTANCES][256]; + char outmkvfile[MAX_ENC_INSTANCES][256]; char statsfilename[MAX_ENC_INSTANCES][256]; for (k = 0; k < MAX_ENC_INSTANCES; k++) @@ -1078,13 +1086,34 @@ ARG_THREADS = -1; enc_data[0].outfilename = ARG_OUTPUTFILE; + enc_data[0].outavifilename = ARG_AVIOUTPUTFILE; + enc_data[0].outmkvfilename = ARG_MKVOUTPUTFILE; enc_data[0].statsfilename1 = ARG_PASS1; enc_data[0].start_num = ARG_STARTFRAMENR; enc_data[0].stop_num = (ARG_MAXFRAMENR-ARG_STARTFRAMENR)/ARG_NUM_APP_THREADS; for (k = 1; k < ARG_NUM_APP_THREADS; k++) { - sprintf(outfile[k], "%s.%03d", ARG_OUTPUTFILE, k); - enc_data[k].outfilename = outfile[k]; + if (ARG_OUTPUTFILE) { + sprintf(outfile[k], "%s.%03d", ARG_OUTPUTFILE, k); + enc_data[k].outfilename = outfile[k]; + } + else + enc_data[k].outfilename = NULL; + + if (ARG_AVIOUTPUTFILE) { + sprintf(outavifile[k], "%.*s_%03d.avi", strlen(ARG_AVIOUTPUTFILE) - 4, ARG_AVIOUTPUTFILE, k); + enc_data[k].outavifilename = outavifile[k]; + } + else + enc_data[k].outavifilename = NULL; + + if (ARG_MKVOUTPUTFILE) { + sprintf(outmkvfile[k], "%.*s_%03d.mkv", strlen(ARG_MKVOUTPUTFILE) - 4, ARG_MKVOUTPUTFILE, k); + enc_data[k].outmkvfilename = outmkvfile[k]; + } + else + enc_data[k].outmkvfilename = NULL; + if (ARG_PASS1) { sprintf(statsfilename[k], "%s.%03d", ARG_PASS1, k); enc_data[k].statsfilename1 = statsfilename[k]; @@ -1229,6 +1258,8 @@ int start_num = h->start_num; int stop_num = h->stop_num; char *outfilename = h->outfilename; + char *outavifilename = h->outavifilename; + char *outmkvfilename = h->outmkvfilename; float *totalPSNR = h->totalPSNR; int input_num; @@ -1445,13 +1476,13 @@ } #ifdef XVID_AVI_OUTPUT - if (ARG_AVIOUTPUTFILE != NULL ) { + if (outavifilename != NULL ) { { /* Open the .avi output then close it */ /* Resets the file size to 0, which AVIFile doesn't seem to do */ FILE *scrub; - if ((scrub = fopen(ARG_AVIOUTPUTFILE, "w+b")) == NULL) { - fprintf(stderr, "Error opening output file %s\n", ARG_AVIOUTPUTFILE); + if ((scrub = fopen(outavifilename, "w+b")) == NULL) { + fprintf(stderr, "Error opening output file %s\n", outavifilename); goto release_all; } else @@ -1462,12 +1493,12 @@ myAVIStreamInfo.fccHandler = MAKEFOURCC('x', 'v', 'i', 'd'); myAVIStreamInfo.dwScale = ARG_DWSCALE; myAVIStreamInfo.dwRate = ARG_DWRATE; - myAVIStreamInfo.dwLength = ARG_MAXFRAMENR; + myAVIStreamInfo.dwLength = (h->stop_num - h->start_num); myAVIStreamInfo.dwQuality = 10000; SetRect(&myAVIStreamInfo.rcFrame, 0, 0, XDIM, YDIM); - if ((avierr=AVIFileOpen(&myAVIFile, ARG_AVIOUTPUTFILE, OF_CREATE|OF_WRITE, NULL))) { - fprintf(stderr, "AVIFileOpen failed opening output file %s, error code %d\n", ARG_AVIOUTPUTFILE, avierr); + if ((avierr=AVIFileOpen(&myAVIFile, outavifilename, OF_CREATE|OF_WRITE, NULL))) { + fprintf(stderr, "AVIFileOpen failed opening output file %s, error code %d\n", outavifilename, avierr); goto release_all; } @@ -1491,20 +1522,20 @@ } #endif #ifdef XVID_MKV_OUTPUT - if (ARG_MKVOUTPUTFILE != NULL) { + if (outmkvfilename != NULL) { { /* Open the .mkv output then close it */ /* Just to make sure we can write to it */ FILE *scrub; - if ((scrub = fopen(ARG_MKVOUTPUTFILE, "w+b")) == NULL) { - fprintf(stderr, "Error opening output file %s\n", ARG_MKVOUTPUTFILE); + if ((scrub = fopen(outmkvfilename, "w+b")) == NULL) { + fprintf(stderr, "Error opening output file %s\n", outmkvfilename); goto release_all; } else fclose(scrub); } - MKVFileOpen(&myMKVFile, ARG_MKVOUTPUTFILE, OF_CREATE|OF_WRITE, NULL); + MKVFileOpen(&myMKVFile, outmkvfilename, OF_CREATE|OF_WRITE, NULL); if (ARG_PAR) { myMKVStreamInfo.display_height = YDIM*height_ratios[ARG_PAR]; myMKVStreamInfo.display_width = XDIM*width_ratios[ARG_PAR]; @@ -1517,7 +1548,7 @@ myMKVStreamInfo.width = XDIM; myMKVStreamInfo.framerate = ARG_DWRATE; myMKVStreamInfo.framescale = ARG_DWSCALE; - myMKVStreamInfo.length = ARG_MAXFRAMENR; + myMKVStreamInfo.length = (h->stop_num - h->start_num); MKVFileCreateStream(myMKVFile, &myMKVStream, &myMKVStreamInfo); } #endif @@ -1557,7 +1588,7 @@ else in_buffer += ((DWORD*)in_buffer)[0]; } else { - if(AVIStreamRead(avi_in_stream, input_num+start_num, 1, in_buffer, 4*XDIM*YDIM, NULL, NULL ) != AVIERR_OK) + if (AVIStreamRead(avi_in_stream, input_num + start_num, 1, in_buffer, 4 * XDIM*YDIM, NULL, NULL) != AVIERR_OK) result = 1; } } else @@ -1683,7 +1714,7 @@ } } else - sprintf(timecode, "%f", ((double)ARG_DWSCALE/ARG_DWRATE)*1000*output_num); + sprintf(timecode, "%f", ((double)ARG_DWSCALE/ARG_DWRATE)*1000*(output_num-start_num)); /* Save single files */ if (ARG_SAVEINDIVIDUAL) { @@ -1694,11 +1725,11 @@ fclose(out); } #ifdef XVID_AVI_OUTPUT - if (ARG_AVIOUTPUTFILE && myAVIStream) { + if (outavifilename && myAVIStream) { int output_frame; if (time_file == NULL) - output_frame = output_num; + output_frame = (output_num-start_num); else { output_frame = (int)(atof(timecode)/1000/((double)ARG_DWSCALE/ARG_DWRATE)+.5); } @@ -1717,7 +1748,7 @@ fwrite(mp4_buffer, 1, m4v_size, out_file); } #ifdef XVID_MKV_OUTPUT - if (ARG_MKVOUTPUTFILE && myMKVStream) { + if (outmkvfilename && myMKVStream) { MKVStreamWrite(myMKVStream, atof(timecode), 1, (ARG_PACKED && fakenvop && (m4v_size <= 8)) ? NULL : mp4_buffer, m4v_size, key ? AVIIF_KEYFRAME : 0, NULL, NULL); } #endif @@ -1778,9 +1809,12 @@ #endif free_all_memory: - free(out_buffer); - free(mp4_buffer); - free(in_buffer); + if (out_buffer) + free(out_buffer); + if (mp4_buffer) + free(mp4_buffer); + if ((in_buffer) && (get_frame == NULL)) + free(in_buffer); } /*****************************************************************************