55 #if HAVE_SYS_RESOURCE_H
57 #include <sys/types.h>
58 #include <sys/resource.h>
59 #elif HAVE_GETPROCESSTIMES
62 #if HAVE_GETPROCESSMEMORYINFO
68 #include <sys/select.h>
97 static int transcoding_finished;
100 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
153 for (j = 0; j < filtergraphs[i]->
nb_inputs; j++) {
158 for (j = 0; j < filtergraphs[i]->
nb_outputs; j++) {
163 av_freep(&filtergraphs[i]->graph_desc);
189 av_freep(&output_streams[i]->forced_keyframes);
190 av_freep(&output_streams[i]->avfilter);
191 av_freep(&output_streams[i]->logfile_prefix);
202 av_freep(&input_streams[i]->filters);
203 av_freep(&input_streams[i]->hwaccel_device);
238 const char *codec_string = encoder ?
"encoder" :
"decoder";
241 "results.\nAdd '-strict experimental' if you want to use it.\n",
242 codec_string, c->
name);
246 codec_string, codec->
name);
271 int min_dec = INT_MAX, min_inc = INT_MAX;
283 int fmt_diff = 32 * abs(dfmt - efmt);
290 }
else if (dfmt > efmt) {
291 if (fmt_diff < min_inc) {
296 if (fmt_diff < min_dec) {
359 "%d:%d; previous: %"PRId64
", current: %"PRId64
"; ",
366 "in incorrect timestamps in the output file.\n",
436 int subtitle_out_max_size = 1024 * 1024;
437 int subtitle_out_size, nb, i;
451 subtitle_out =
av_malloc(subtitle_out_max_size);
462 for (i = 0; i < nb; i++) {
473 subtitle_out_max_size, sub);
474 if (subtitle_out_size < 0) {
480 pkt.
data = subtitle_out;
481 pkt.
size = subtitle_out_size;
500 int ret, format_video_sync;
575 *frame_size = pkt.
size;
595 return -10.0 * log(d) / log(10.0);
602 double ti1, bitrate, avg_bitrate;
627 avg_bitrate = (double)(
video_size * 8) / ti1 / 1000.0;
628 fprintf(
vstats_file,
"s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
629 (
double)
video_size / 1024, ti1, bitrate, avg_bitrate);
704 int64_t min_pts = INT64_MAX;
708 int64_t pts = output_streams[i]->
sync_opts;
710 if (!output_streams[i]->
filter || output_streams[i]->finished)
713 pts =
av_rescale_q(pts, output_streams[i]->st->codec->time_base,
717 ost = output_streams[i];
737 }
else if (ret ==
AVERROR(EAGAIN))
751 int frame_number, vid, i;
752 double bitrate, ti1, pts;
753 static int64_t last_time = -1;
754 static int qp_histogram[52];
759 if (!is_last_report) {
763 if (last_time == -1) {
767 if ((cur_time - last_time) < 500000)
773 oc = output_files[0]->
ctx;
778 if (total_size < 0) {
782 "avio_tell() failed: %s\n", errbuf);
791 ost = output_streams[i];
796 snprintf(buf + strlen(buf),
sizeof(buf) - strlen(buf),
"q=%2.1f ", q);
799 float t = (
av_gettime() - timer_start) / 1000000.0;
802 snprintf(buf + strlen(buf),
sizeof(buf) - strlen(buf),
"frame=%5d fps=%3d q=%3.1f ",
803 frame_number, (t > 1) ? (
int)(frame_number / t + 0.5) : 0, q);
805 snprintf(buf + strlen(buf),
sizeof(buf) - strlen(buf),
"L");
811 for (j = 0; j < 32; j++)
812 snprintf(buf + strlen(buf),
sizeof(buf) - strlen(buf),
"%X", (
int)
lrintf(
log2(qp_histogram[j] + 1)));
816 double error, error_sum = 0;
817 double scale, scale_sum = 0;
818 char type[3] = {
'Y',
'U',
'V' };
819 snprintf(buf + strlen(buf),
sizeof(buf) - strlen(buf),
"PSNR=");
820 for (j = 0; j < 3; j++) {
821 if (is_last_report) {
822 error = enc->
error[j];
823 scale = enc->
width * enc->
height * 255.0 * 255.0 * frame_number;
832 snprintf(buf + strlen(buf),
sizeof(buf) - strlen(buf),
"%c:%2.2f ", type[j],
psnr(error / scale));
834 snprintf(buf + strlen(buf),
sizeof(buf) - strlen(buf),
"*:%2.2f ",
psnr(error_sum / scale_sum));
840 if ((pts < ti1) && (pts > 0))
846 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
848 snprintf(buf + strlen(buf),
sizeof(buf) - strlen(buf),
849 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
850 (
double)total_size / 1024, ti1, bitrate);
853 snprintf(buf + strlen(buf),
sizeof(buf) - strlen(buf),
" dup=%d drop=%d",
860 if (is_last_report) {
865 percent = 100.0 * (total_size - raw) / raw;
868 av_log(
NULL,
AV_LOG_INFO,
"video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
884 int stop_encoding = 0;
921 ret = encode(enc, &pkt,
NULL, &got_packet);
1013 opkt.
dts -= ost_tb_start_time;
1046 char layout_name[256];
1063 int i, ret, err = 0, resample_changed;
1072 if (!*got_output || ret < 0) {
1085 decoded_frame->
pts = pkt->
pts;
1093 if (resample_changed) {
1094 char layout1[64], layout2[64];
1098 "layout for Input Stream #%d.%d\n", ist->
file_index,
1110 "Input stream #%d:%d frame changed from rate:%d fmt:%s ch:%d chl:%s to rate:%d fmt:%s ch:%d chl:%s\n",
1134 for (i = 0; i < ist->nb_filters; i++) {
1135 if (i < ist->nb_filters - 1) {
1136 f = ist->filter_frame;
1150 return err < 0 ? err : ret;
1156 int i, ret = 0, err = 0, resample_changed;
1165 decoded_frame, got_output, pkt);
1166 if (!*got_output || ret < 0) {
1191 if (resample_changed) {
1193 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1215 if (i < ist->nb_filters - 1) {
1231 return err < 0 ? err : ret;
1238 &subtitle, got_output, pkt);
1289 "Multiple frames in a packet from stream %d\n", pkt->
stream_index);
1368 avc[i] = output_files[i]->ctx;
1371 printf(
"SDP:\n%s\n", sdp);
1380 if (
hwaccels[i].pix_fmt == pix_fmt)
1391 for (p = pix_fmts; *p != -1; p++) {
1404 ret = hwaccel->
init(s);
1408 "%s hwaccel requested for input stream #%d:%d, "
1409 "but cannot be initialized.\n", hwaccel->
name,
1440 snprintf(error, error_len,
"Decoder (codec id %d) not found for input stream #%d:%d",
1471 snprintf(error, error_len,
1472 "Error while opening decoder for input stream "
1512 for (p = kf; *p; p++)
1523 for (i = 0; i < n; i++) {
1524 char *next = strchr(p,
',');
1538 int ret = 0, i, j, k;
1556 oc = output_files[i]->
ctx;
1572 ost = output_streams[i];
1597 if (extra_size > INT_MAX) {
1671 snprintf(error,
sizeof(error),
"Automatic encoder selection "
1672 "failed for output stream #%d:%d. Default encoder for "
1673 "format %s is probably disabled. Please choose an "
1704 "for the output stream #%d:%d, but no information "
1705 "about the input framerate is available. Falling "
1706 "back to a default value of 25fps. Use the -r option "
1707 "if you want a different framerate.\n",
1771 snprintf(logfilename,
sizeof(logfilename),
"%s-%d.log",
1775 if (!strcmp(ost->
enc->
name,
"libx264")) {
1779 f = fopen(logfilename,
"wb");
1782 logfilename, strerror(errno));
1788 size_t logbuffer_size;
1803 ost = output_streams[i];
1824 snprintf(error,
sizeof(error),
"Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
1831 "It takes bits/s as argument, not kbits/s\n");
1861 oc = output_files[i]->
ctx;
1866 snprintf(error,
sizeof(error),
1867 "Could not write header for output file #%d "
1868 "(incorrect codec parameters ?): %s",
1883 av_dump_format(output_files[i]->ctx, i, output_files[i]->ctx->filename, 1);
1889 ist = input_streams[i];
1896 if (nb_filtergraphs > 1)
1904 ost = output_streams[i];
1916 if (nb_filtergraphs > 1)
1983 int64_t ipts_min = INT64_MAX;
1993 if (ipts < ipts_min) {
2004 static void *input_thread(
void *arg)
2009 while (!transcoding_finished && ret >= 0) {
2034 static void free_input_threads(
void)
2041 transcoding_finished = 1;
2047 if (!f->fifo || f->joined)
2069 static int init_input_threads(
void)
2073 if (nb_input_files == 1)
2127 if (nb_input_files > 1)
2128 return get_input_packet_mt(f, pkt);
2137 if (input_files[i]->eagain)
2146 input_files[i]->eagain = 0;
2198 ist = input_streams[ifile->
ist_index + i];
2224 goto discard_packet;
2228 goto discard_packet;
2248 "timestamp discontinuity %"PRId64
", new offset= %"PRId64
"\n",
2275 int ret, i, need_input = 1;
2279 int64_t timer_start;
2291 if ((ret = init_input_threads()) < 0)
2322 free_input_threads();
2327 ist = input_streams[i];
2339 os = output_files[i]->
ctx;
2348 ost = output_streams[i];
2357 ist = input_streams[i];
2370 free_input_threads();
2373 if (output_streams) {
2375 ost = output_streams[i];
2396 struct rusage rusage;
2398 getrusage(RUSAGE_SELF, &rusage);
2399 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
2400 #elif HAVE_GETPROCESSTIMES
2402 FILETIME c, e, k, u;
2403 proc = GetCurrentProcess();
2404 GetProcessTimes(proc, &c, &e, &k, &u);
2405 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
2413 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
2414 struct rusage rusage;
2415 getrusage(RUSAGE_SELF, &rusage);
2416 return (int64_t)rusage.ru_maxrss * 1024;
2417 #elif HAVE_GETPROCESSMEMORYINFO
2419 PROCESS_MEMORY_COUNTERS memcounters;
2420 proc = GetCurrentProcess();
2421 memcounters.cb =
sizeof(memcounters);
2422 GetProcessMemoryInfo(proc, &memcounters,
sizeof(memcounters));
2423 return memcounters.PeakPagefileUsage;
2462 fprintf(stderr,
"At least one output file must be specified\n");
2472 printf(
"bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);