2 * Copyright (c) 2000-2003 Fabrice Bellard
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * multimedia converter based on the FFmpeg libraries
33 #include <stdatomic.h>
43 #include "libavformat/avformat.h"
44 #include "libavdevice/avdevice.h"
45 #include "libswresample/swresample.h"
46 #include "libavutil/opt.h"
47 #include "libavutil/channel_layout.h"
48 #include "libavutil/parseutils.h"
49 #include "libavutil/samplefmt.h"
50 #include "libavutil/fifo.h"
51 #include "libavutil/hwcontext.h"
52 #include "libavutil/internal.h"
53 #include "libavutil/intreadwrite.h"
54 #include "libavutil/dict.h"
55 #include "libavutil/display.h"
56 #include "libavutil/mathematics.h"
57 #include "libavutil/pixdesc.h"
58 #include "libavutil/avstring.h"
59 #include "libavutil/libm.h"
60 #include "libavutil/imgutils.h"
61 #include "libavutil/timestamp.h"
62 #include "libavutil/bprint.h"
63 #include "libavutil/time.h"
64 #include "libavutil/thread.h"
65 #include "libavutil/threadmessage.h"
66 #include "libavcodec/mathops.h"
67 #include "libavformat/os_support.h"
69 # include "libavfilter/avfilter.h"
70 # include "libavfilter/buffersrc.h"
71 # include "libavfilter/buffersink.h"
73 #if HAVE_SYS_RESOURCE_H
75 #include <sys/types.h>
76 #include <sys/resource.h>
77 #elif HAVE_GETPROCESSTIMES
80 #if HAVE_GETPROCESSMEMORYINFO
84 #if HAVE_SETCONSOLECTRLHANDLER
90 #include <sys/select.h>
95 #include <sys/ioctl.h>
105 #include "cmdutils.h"
107 #include "libavutil/avassert.h"
109 const char program_name[] = "ffmpeg";
110 const int program_birth_year = 2000;
112 static FILE *vstats_file;
114 const char *const forced_keyframes_const_names[] = {
123 static void do_video_stats(OutputStream *ost, int frame_size);
124 static int64_t getutime(void);
125 static int64_t getmaxrss(void);
126 static int ifilter_has_all_input_formats(FilterGraph *fg);
128 static int run_as_daemon = 0;
129 static int nb_frames_dup = 0;
130 static unsigned dup_warning = 1000;
131 static int nb_frames_drop = 0;
132 static int64_t decode_error_stat[2];
134 static int want_sdp = 1;
136 static int current_time;
137 AVIOContext *progress_avio = NULL;
139 static uint8_t *subtitle_out;
141 InputStream **input_streams = NULL;
142 int nb_input_streams = 0;
143 InputFile **input_files = NULL;
144 int nb_input_files = 0;
146 OutputStream **output_streams = NULL;
147 int nb_output_streams = 0;
148 OutputFile **output_files = NULL;
149 int nb_output_files = 0;
151 FilterGraph **filtergraphs;
156 /* init terminal so that we can grab keys */
157 static struct termios oldtty;
158 static int restore_tty;
162 static void free_input_threads(void);
166 Convert subtitles to video with alpha to insert them in filter graphs.
167 This is a temporary solution until libavfilter gets real subtitles support.
170 static int sub2video_get_blank_frame(InputStream *ist)
173 AVFrame *frame = ist->sub2video.frame;
175 av_frame_unref(frame);
176 ist->sub2video.frame->width = ist->dec_ctx->width ? ist->dec_ctx->width : ist->sub2video.w;
177 ist->sub2video.frame->height = ist->dec_ctx->height ? ist->dec_ctx->height : ist->sub2video.h;
178 ist->sub2video.frame->format = AV_PIX_FMT_RGB32;
179 if ((ret = av_frame_get_buffer(frame, 32)) < 0)
181 memset(frame->data[0], 0, frame->height * frame->linesize[0]);
185 static void sub2video_copy_rect(uint8_t *dst, int dst_linesize, int w, int h,
188 uint32_t *pal, *dst2;
192 if (r->type != SUBTITLE_BITMAP) {
193 av_log(NULL, AV_LOG_WARNING, "sub2video: non-bitmap subtitle\n");
196 if (r->x < 0 || r->x + r->w > w || r->y < 0 || r->y + r->h > h) {
197 av_log(NULL, AV_LOG_WARNING, "sub2video: rectangle (%d %d %d %d) overflowing %d %d\n",
198 r->x, r->y, r->w, r->h, w, h
203 dst += r->y * dst_linesize + r->x * 4;
205 pal = (uint32_t *)r->data[1];
206 for (y = 0; y < r->h; y++) {
207 dst2 = (uint32_t *)dst;
209 for (x = 0; x < r->w; x++)
210 *(dst2++) = pal[*(src2++)];
212 src += r->linesize[0];
216 static void sub2video_push_ref(InputStream *ist, int64_t pts)
218 AVFrame *frame = ist->sub2video.frame;
222 av_assert1(frame->data[0]);
223 ist->sub2video.last_pts = frame->pts = pts;
224 for (i = 0; i < ist->nb_filters; i++) {
225 ret = av_buffersrc_add_frame_flags(ist->filters[i]->filter, frame,
226 AV_BUFFERSRC_FLAG_KEEP_REF |
227 AV_BUFFERSRC_FLAG_PUSH);
228 if (ret != AVERROR_EOF && ret < 0)
229 av_log(NULL, AV_LOG_WARNING, "Error while add the frame to buffer source(%s).\n",
234 void sub2video_update(InputStream *ist, AVSubtitle *sub)
236 AVFrame *frame = ist->sub2video.frame;
240 int64_t pts, end_pts;
245 pts = av_rescale_q(sub->pts + sub->start_display_time * 1000LL,
246 AV_TIME_BASE_Q, ist->st->time_base);
247 end_pts = av_rescale_q(sub->pts + sub->end_display_time * 1000LL,
248 AV_TIME_BASE_Q, ist->st->time_base);
249 num_rects = sub->num_rects;
251 pts = ist->sub2video.end_pts;
255 if (sub2video_get_blank_frame(ist) < 0) {
256 av_log(ist->dec_ctx, AV_LOG_ERROR,
257 "Impossible to get a blank canvas.\n");
260 dst = frame->data [0];
261 dst_linesize = frame->linesize[0];
262 for (i = 0; i < num_rects; i++)
263 sub2video_copy_rect(dst, dst_linesize, frame->width, frame->height, sub->rects[i]);
264 sub2video_push_ref(ist, pts);
265 ist->sub2video.end_pts = end_pts;
268 static void sub2video_heartbeat(InputStream *ist, int64_t pts)
270 InputFile *infile = input_files[ist->file_index];
274 /* When a frame is read from a file, examine all sub2video streams in
275 the same file and send the sub2video frame again. Otherwise, decoded
276 video frames could be accumulating in the filter graph while a filter
277 (possibly overlay) is desperately waiting for a subtitle frame. */
278 for (i = 0; i < infile->nb_streams; i++) {
279 InputStream *ist2 = input_streams[infile->ist_index + i];
280 if (!ist2->sub2video.frame)
282 /* subtitles seem to be usually muxed ahead of other streams;
283 if not, subtracting a larger time here is necessary */
284 pts2 = av_rescale_q(pts, ist->st->time_base, ist2->st->time_base) - 1;
285 /* do not send the heartbeat frame if the subtitle is already ahead */
286 if (pts2 <= ist2->sub2video.last_pts)
288 if (pts2 >= ist2->sub2video.end_pts || !ist2->sub2video.frame->data[0])
289 sub2video_update(ist2, NULL);
290 for (j = 0, nb_reqs = 0; j < ist2->nb_filters; j++)
291 nb_reqs += av_buffersrc_get_nb_failed_requests(ist2->filters[j]->filter);
293 sub2video_push_ref(ist2, pts2);
297 static void sub2video_flush(InputStream *ist)
302 if (ist->sub2video.end_pts < INT64_MAX)
303 sub2video_update(ist, NULL);
304 for (i = 0; i < ist->nb_filters; i++) {
305 ret = av_buffersrc_add_frame(ist->filters[i]->filter, NULL);
306 if (ret != AVERROR_EOF && ret < 0)
307 av_log(NULL, AV_LOG_WARNING, "Flush the frame error.\n");
311 /* end of sub2video hack */
313 static void term_exit_sigsafe(void)
317 tcsetattr (0, TCSANOW, &oldtty);
323 av_log(NULL, AV_LOG_QUIET, "%s", "");
327 static volatile int received_sigterm = 0;
328 static volatile int received_nb_signals = 0;
329 static atomic_int transcode_init_done = ATOMIC_VAR_INIT(0);
330 static volatile int ffmpeg_exited = 0;
331 static int main_return_code = 0;
334 sigterm_handler(int sig)
337 received_sigterm = sig;
338 received_nb_signals++;
340 if(received_nb_signals > 3) {
341 ret = write(2/*STDERR_FILENO*/, "Received > 3 system signals, hard exiting\n",
342 strlen("Received > 3 system signals, hard exiting\n"));
343 if (ret < 0) { /* Do nothing */ };
348 #if HAVE_SETCONSOLECTRLHANDLER
349 static BOOL WINAPI CtrlHandler(DWORD fdwCtrlType)
351 av_log(NULL, AV_LOG_DEBUG, "\nReceived windows signal %ld\n", fdwCtrlType);
356 case CTRL_BREAK_EVENT:
357 sigterm_handler(SIGINT);
360 case CTRL_CLOSE_EVENT:
361 case CTRL_LOGOFF_EVENT:
362 case CTRL_SHUTDOWN_EVENT:
363 sigterm_handler(SIGTERM);
364 /* Basically, with these 3 events, when we return from this method the
365 process is hard terminated, so stall as long as we need to
366 to try and let the main thread(s) clean up and gracefully terminate
367 (we have at most 5 seconds, but should be done far before that). */
368 while (!ffmpeg_exited) {
374 av_log(NULL, AV_LOG_ERROR, "Received unknown windows signal %ld\n", fdwCtrlType);
383 if (!run_as_daemon && stdin_interaction) {
385 if (tcgetattr (0, &tty) == 0) {
389 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
390 |INLCR|IGNCR|ICRNL|IXON);
391 tty.c_oflag |= OPOST;
392 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
393 tty.c_cflag &= ~(CSIZE|PARENB);
398 tcsetattr (0, TCSANOW, &tty);
400 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
404 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
405 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
407 signal(SIGXCPU, sigterm_handler);
410 signal(SIGPIPE, SIG_IGN); /* Broken pipe (POSIX). */
412 #if HAVE_SETCONSOLECTRLHANDLER
413 SetConsoleCtrlHandler((PHANDLER_ROUTINE) CtrlHandler, TRUE);
417 /* read a key without blocking */
418 static int read_key(void)
430 n = select(1, &rfds, NULL, NULL, &tv);
439 # if HAVE_PEEKNAMEDPIPE
441 static HANDLE input_handle;
444 input_handle = GetStdHandle(STD_INPUT_HANDLE);
445 is_pipe = !GetConsoleMode(input_handle, &dw);
449 /* When running under a GUI, you will end here. */
450 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL)) {
451 // input pipe may have been closed by the program that ran ffmpeg
469 static int decode_interrupt_cb(void *ctx)
471 return received_nb_signals > atomic_load(&transcode_init_done);
474 const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
476 static void ffmpeg_cleanup(int ret)
481 int maxrss = getmaxrss() / 1024;
482 av_log(NULL, AV_LOG_INFO, "bench: maxrss=%ikB\n", maxrss);
485 for (i = 0; i < nb_filtergraphs; i++) {
486 FilterGraph *fg = filtergraphs[i];
487 avfilter_graph_free(&fg->graph);
488 for (j = 0; j < fg->nb_inputs; j++) {
489 while (av_fifo_size(fg->inputs[j]->frame_queue)) {
491 av_fifo_generic_read(fg->inputs[j]->frame_queue, &frame,
492 sizeof(frame), NULL);
493 av_frame_free(&frame);
495 av_fifo_freep(&fg->inputs[j]->frame_queue);
496 if (fg->inputs[j]->ist->sub2video.sub_queue) {
497 while (av_fifo_size(fg->inputs[j]->ist->sub2video.sub_queue)) {
499 av_fifo_generic_read(fg->inputs[j]->ist->sub2video.sub_queue,
500 &sub, sizeof(sub), NULL);
501 avsubtitle_free(&sub);
503 av_fifo_freep(&fg->inputs[j]->ist->sub2video.sub_queue);
505 av_buffer_unref(&fg->inputs[j]->hw_frames_ctx);
506 av_freep(&fg->inputs[j]->name);
507 av_freep(&fg->inputs[j]);
509 av_freep(&fg->inputs);
510 for (j = 0; j < fg->nb_outputs; j++) {
511 av_freep(&fg->outputs[j]->name);
512 av_freep(&fg->outputs[j]->formats);
513 av_freep(&fg->outputs[j]->channel_layouts);
514 av_freep(&fg->outputs[j]->sample_rates);
515 av_freep(&fg->outputs[j]);
517 av_freep(&fg->outputs);
518 av_freep(&fg->graph_desc);
520 av_freep(&filtergraphs[i]);
522 av_freep(&filtergraphs);
524 av_freep(&subtitle_out);
527 for (i = 0; i < nb_output_files; i++) {
528 OutputFile *of = output_files[i];
533 if (s && s->oformat && !(s->oformat->flags & AVFMT_NOFILE))
535 avformat_free_context(s);
536 av_dict_free(&of->opts);
538 av_freep(&output_files[i]);
540 for (i = 0; i < nb_output_streams; i++) {
541 OutputStream *ost = output_streams[i];
546 for (j = 0; j < ost->nb_bitstream_filters; j++)
547 av_bsf_free(&ost->bsf_ctx[j]);
548 av_freep(&ost->bsf_ctx);
550 av_frame_free(&ost->filtered_frame);
551 av_frame_free(&ost->last_frame);
552 av_dict_free(&ost->encoder_opts);
554 av_freep(&ost->forced_keyframes);
555 av_expr_free(ost->forced_keyframes_pexpr);
556 av_freep(&ost->avfilter);
557 av_freep(&ost->logfile_prefix);
559 av_freep(&ost->audio_channels_map);
560 ost->audio_channels_mapped = 0;
562 av_dict_free(&ost->sws_dict);
564 avcodec_free_context(&ost->enc_ctx);
565 avcodec_parameters_free(&ost->ref_par);
567 if (ost->muxing_queue) {
568 while (av_fifo_size(ost->muxing_queue)) {
570 av_fifo_generic_read(ost->muxing_queue, &pkt, sizeof(pkt), NULL);
571 av_packet_unref(&pkt);
573 av_fifo_freep(&ost->muxing_queue);
576 av_freep(&output_streams[i]);
579 free_input_threads();
581 for (i = 0; i < nb_input_files; i++) {
582 avformat_close_input(&input_files[i]->ctx);
583 av_freep(&input_files[i]);
585 for (i = 0; i < nb_input_streams; i++) {
586 InputStream *ist = input_streams[i];
588 av_frame_free(&ist->decoded_frame);
589 av_frame_free(&ist->filter_frame);
590 av_dict_free(&ist->decoder_opts);
591 avsubtitle_free(&ist->prev_sub.subtitle);
592 av_frame_free(&ist->sub2video.frame);
593 av_freep(&ist->filters);
594 av_freep(&ist->hwaccel_device);
595 av_freep(&ist->dts_buffer);
597 avcodec_free_context(&ist->dec_ctx);
599 av_freep(&input_streams[i]);
603 if (fclose(vstats_file))
604 av_log(NULL, AV_LOG_ERROR,
605 "Error closing vstats file, loss of information possible: %s\n",
606 av_err2str(AVERROR(errno)));
608 av_freep(&vstats_filename);
610 av_freep(&input_streams);
611 av_freep(&input_files);
612 av_freep(&output_streams);
613 av_freep(&output_files);
617 avformat_network_deinit();
619 if (received_sigterm) {
620 av_log(NULL, AV_LOG_INFO, "Exiting normally, received signal %d.\n",
621 (int) received_sigterm);
622 } else if (ret && atomic_load(&transcode_init_done)) {
623 av_log(NULL, AV_LOG_INFO, "Conversion failed!\n");
629 void remove_avoptions(AVDictionary **a, AVDictionary *b)
631 AVDictionaryEntry *t = NULL;
633 while ((t = av_dict_get(b, "", t, AV_DICT_IGNORE_SUFFIX))) {
634 av_dict_set(a, t->key, NULL, AV_DICT_MATCH_CASE);
638 void assert_avoptions(AVDictionary *m)
640 AVDictionaryEntry *t;
641 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
642 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
647 static void abort_codec_experimental(AVCodec *c, int encoder)
652 static void update_benchmark(const char *fmt, ...)
654 if (do_benchmark_all) {
655 int64_t t = getutime();
661 vsnprintf(buf, sizeof(buf), fmt, va);
663 av_log(NULL, AV_LOG_INFO, "bench: %8"PRIu64" %s \n", t - current_time, buf);
669 static void close_all_output_streams(OutputStream *ost, OSTFinished this_stream, OSTFinished others)
672 for (i = 0; i < nb_output_streams; i++) {
673 OutputStream *ost2 = output_streams[i];
674 ost2->finished |= ost == ost2 ? this_stream : others;
678 static void write_packet(OutputFile *of, AVPacket *pkt, OutputStream *ost, int unqueue)
680 AVFormatContext *s = of->ctx;
681 AVStream *st = ost->st;
685 * Audio encoders may split the packets -- #frames in != #packets out.
686 * But there is no reordering, so we can limit the number of output packets
687 * by simply dropping them here.
688 * Counting encoded video frames needs to be done separately because of
689 * reordering, see do_video_out().
690 * Do not count the packet when unqueued because it has been counted when queued.
692 if (!(st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && ost->encoding_needed) && !unqueue) {
693 if (ost->frame_number >= ost->max_frames) {
694 av_packet_unref(pkt);
700 if (!of->header_written) {
701 AVPacket tmp_pkt = {0};
702 /* the muxer is not initialized yet, buffer the packet */
703 if (!av_fifo_space(ost->muxing_queue)) {
704 int new_size = FFMIN(2 * av_fifo_size(ost->muxing_queue),
705 ost->max_muxing_queue_size);
706 if (new_size <= av_fifo_size(ost->muxing_queue)) {
707 av_log(NULL, AV_LOG_ERROR,
708 "Too many packets buffered for output stream %d:%d.\n",
709 ost->file_index, ost->st->index);
712 ret = av_fifo_realloc2(ost->muxing_queue, new_size);
716 ret = av_packet_ref(&tmp_pkt, pkt);
719 av_fifo_generic_write(ost->muxing_queue, &tmp_pkt, sizeof(tmp_pkt), NULL);
720 av_packet_unref(pkt);
724 if ((st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && video_sync_method == VSYNC_DROP) ||
725 (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0))
726 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
728 if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) {
730 uint8_t *sd = av_packet_get_side_data(pkt, AV_PKT_DATA_QUALITY_STATS,
732 ost->quality = sd ? AV_RL32(sd) : -1;
733 ost->pict_type = sd ? sd[4] : AV_PICTURE_TYPE_NONE;
735 for (i = 0; i<FF_ARRAY_ELEMS(ost->error); i++) {
737 ost->error[i] = AV_RL64(sd + 8 + 8*i);
742 if (ost->frame_rate.num && ost->is_cfr) {
743 if (pkt->duration > 0)
744 av_log(NULL, AV_LOG_WARNING, "Overriding packet duration by frame rate, this should not happen\n");
745 pkt->duration = av_rescale_q(1, av_inv_q(ost->frame_rate),
750 av_packet_rescale_ts(pkt, ost->mux_timebase, ost->st->time_base);
752 if (!(s->oformat->flags & AVFMT_NOTIMESTAMPS)) {
753 if (pkt->dts != AV_NOPTS_VALUE &&
754 pkt->pts != AV_NOPTS_VALUE &&
755 pkt->dts > pkt->pts) {
756 av_log(s, AV_LOG_WARNING, "Invalid DTS: %"PRId64" PTS: %"PRId64" in output stream %d:%d, replacing by guess\n",
758 ost->file_index, ost->st->index);
760 pkt->dts = pkt->pts + pkt->dts + ost->last_mux_dts + 1
761 - FFMIN3(pkt->pts, pkt->dts, ost->last_mux_dts + 1)
762 - FFMAX3(pkt->pts, pkt->dts, ost->last_mux_dts + 1);
764 if ((st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO || st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) &&
765 pkt->dts != AV_NOPTS_VALUE &&
766 !(st->codecpar->codec_id == AV_CODEC_ID_VP9 && ost->stream_copy) &&
767 ost->last_mux_dts != AV_NOPTS_VALUE) {
768 int64_t max = ost->last_mux_dts + !(s->oformat->flags & AVFMT_TS_NONSTRICT);
769 if (pkt->dts < max) {
770 int loglevel = max - pkt->dts > 2 || st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO ? AV_LOG_WARNING : AV_LOG_DEBUG;
771 av_log(s, loglevel, "Non-monotonous DTS in output stream "
772 "%d:%d; previous: %"PRId64", current: %"PRId64"; ",
773 ost->file_index, ost->st->index, ost->last_mux_dts, pkt->dts);
775 av_log(NULL, AV_LOG_FATAL, "aborting.\n");
778 av_log(s, loglevel, "changing to %"PRId64". This may result "
779 "in incorrect timestamps in the output file.\n",
781 if (pkt->pts >= pkt->dts)
782 pkt->pts = FFMAX(pkt->pts, max);
787 ost->last_mux_dts = pkt->dts;
789 ost->data_size += pkt->size;
790 ost->packets_written++;
792 pkt->stream_index = ost->index;
795 av_log(NULL, AV_LOG_INFO, "muxer <- type:%s "
796 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s size:%d\n",
797 av_get_media_type_string(ost->enc_ctx->codec_type),
798 av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &ost->st->time_base),
799 av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &ost->st->time_base),
804 ret = av_interleaved_write_frame(s, pkt);
806 print_error("av_interleaved_write_frame()", ret);
807 main_return_code = 1;
808 close_all_output_streams(ost, MUXER_FINISHED | ENCODER_FINISHED, ENCODER_FINISHED);
810 av_packet_unref(pkt);
813 static void close_output_stream(OutputStream *ost)
815 OutputFile *of = output_files[ost->file_index];
817 ost->finished |= ENCODER_FINISHED;
819 int64_t end = av_rescale_q(ost->sync_opts - ost->first_pts, ost->enc_ctx->time_base, AV_TIME_BASE_Q);
820 of->recording_time = FFMIN(of->recording_time, end);
825 * Send a single packet to the output, applying any bitstream filters
826 * associated with the output stream. This may result in any number
827 * of packets actually being written, depending on what bitstream
828 * filters are applied. The supplied packet is consumed and will be
829 * blank (as if newly-allocated) when this function returns.
831 * If eof is set, instead indicate EOF to all bitstream filters and
832 * therefore flush any delayed packets to the output. A blank packet
833 * must be supplied in this case.
835 static void output_packet(OutputFile *of, AVPacket *pkt,
836 OutputStream *ost, int eof)
840 /* apply the output bitstream filters, if any */
841 if (ost->nb_bitstream_filters) {
844 ret = av_bsf_send_packet(ost->bsf_ctx[0], eof ? NULL : pkt);
851 /* get a packet from the previous filter up the chain */
852 ret = av_bsf_receive_packet(ost->bsf_ctx[idx - 1], pkt);
853 if (ret == AVERROR(EAGAIN)) {
857 } else if (ret == AVERROR_EOF) {
862 /* send it to the next filter down the chain or to the muxer */
863 if (idx < ost->nb_bitstream_filters) {
864 ret = av_bsf_send_packet(ost->bsf_ctx[idx], eof ? NULL : pkt);
872 write_packet(of, pkt, ost, 0);
875 write_packet(of, pkt, ost, 0);
878 if (ret < 0 && ret != AVERROR_EOF) {
879 av_log(NULL, AV_LOG_ERROR, "Error applying bitstream filters to an output "
880 "packet for stream #%d:%d.\n", ost->file_index, ost->index);
886 static int check_recording_time(OutputStream *ost)
888 OutputFile *of = output_files[ost->file_index];
890 if (of->recording_time != INT64_MAX &&
891 av_compare_ts(ost->sync_opts - ost->first_pts, ost->enc_ctx->time_base, of->recording_time,
892 AV_TIME_BASE_Q) >= 0) {
893 close_output_stream(ost);
899 static void do_audio_out(OutputFile *of, OutputStream *ost,
902 AVCodecContext *enc = ost->enc_ctx;
906 av_init_packet(&pkt);
910 if (!check_recording_time(ost))
913 if (frame->pts == AV_NOPTS_VALUE || audio_sync_method < 0)
914 frame->pts = ost->sync_opts;
915 ost->sync_opts = frame->pts + frame->nb_samples;
916 ost->samples_encoded += frame->nb_samples;
917 ost->frames_encoded++;
919 av_assert0(pkt.size || !pkt.data);
920 update_benchmark(NULL);
922 av_log(NULL, AV_LOG_INFO, "encoder <- type:audio "
923 "frame_pts:%s frame_pts_time:%s time_base:%d/%d\n",
924 av_ts2str(frame->pts), av_ts2timestr(frame->pts, &enc->time_base),
925 enc->time_base.num, enc->time_base.den);
928 ret = avcodec_send_frame(enc, frame);
933 ret = avcodec_receive_packet(enc, &pkt);
934 if (ret == AVERROR(EAGAIN))
939 update_benchmark("encode_audio %d.%d", ost->file_index, ost->index);
941 av_packet_rescale_ts(&pkt, enc->time_base, ost->mux_timebase);
944 av_log(NULL, AV_LOG_INFO, "encoder -> type:audio "
945 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
946 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &enc->time_base),
947 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &enc->time_base));
950 output_packet(of, &pkt, ost, 0);
955 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
959 static void do_subtitle_out(OutputFile *of,
963 int subtitle_out_max_size = 1024 * 1024;
964 int subtitle_out_size, nb, i;
969 if (sub->pts == AV_NOPTS_VALUE) {
970 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
979 subtitle_out = av_malloc(subtitle_out_max_size);
981 av_log(NULL, AV_LOG_FATAL, "Failed to allocate subtitle_out\n");
986 /* Note: DVB subtitle need one packet to draw them and one other
987 packet to clear them */
988 /* XXX: signal it in the codec context ? */
989 if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE)
994 /* shift timestamp to honor -ss and make check_recording_time() work with -t */
996 if (output_files[ost->file_index]->start_time != AV_NOPTS_VALUE)
997 pts -= output_files[ost->file_index]->start_time;
998 for (i = 0; i < nb; i++) {
999 unsigned save_num_rects = sub->num_rects;
1001 ost->sync_opts = av_rescale_q(pts, AV_TIME_BASE_Q, enc->time_base);
1002 if (!check_recording_time(ost))
1006 // start_display_time is required to be 0
1007 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1008 sub->end_display_time -= sub->start_display_time;
1009 sub->start_display_time = 0;
1013 ost->frames_encoded++;
1015 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1016 subtitle_out_max_size, sub);
1018 sub->num_rects = save_num_rects;
1019 if (subtitle_out_size < 0) {
1020 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1024 av_init_packet(&pkt);
1025 pkt.data = subtitle_out;
1026 pkt.size = subtitle_out_size;
1027 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->mux_timebase);
1028 pkt.duration = av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, ost->mux_timebase);
1029 if (enc->codec_id == AV_CODEC_ID_DVB_SUBTITLE) {
1030 /* XXX: the pts correction is handled here. Maybe handling
1031 it in the codec would be better */
1033 pkt.pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, ost->mux_timebase);
1035 pkt.pts += av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, ost->mux_timebase);
1038 output_packet(of, &pkt, ost, 0);
1042 static void do_video_out(OutputFile *of,
1044 AVFrame *next_picture,
1047 int ret, format_video_sync;
1049 AVCodecContext *enc = ost->enc_ctx;
1050 AVCodecParameters *mux_par = ost->st->codecpar;
1051 AVRational frame_rate;
1052 int nb_frames, nb0_frames, i;
1053 double delta, delta0;
1054 double duration = 0;
1056 InputStream *ist = NULL;
1057 AVFilterContext *filter = ost->filter->filter;
1059 if (ost->source_index >= 0)
1060 ist = input_streams[ost->source_index];
1062 frame_rate = av_buffersink_get_frame_rate(filter);
1063 if (frame_rate.num > 0 && frame_rate.den > 0)
1064 duration = 1/(av_q2d(frame_rate) * av_q2d(enc->time_base));
1066 if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num)
1067 duration = FFMIN(duration, 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base)));
1069 if (!ost->filters_script &&
1073 lrintf(next_picture->pkt_duration * av_q2d(ist->st->time_base) / av_q2d(enc->time_base)) > 0) {
1074 duration = lrintf(next_picture->pkt_duration * av_q2d(ist->st->time_base) / av_q2d(enc->time_base));
1077 if (!next_picture) {
1079 nb0_frames = nb_frames = mid_pred(ost->last_nb0_frames[0],
1080 ost->last_nb0_frames[1],
1081 ost->last_nb0_frames[2]);
1083 delta0 = sync_ipts - ost->sync_opts; // delta0 is the "drift" between the input frame (next_picture) and where it would fall in the output.
1084 delta = delta0 + duration;
1086 /* by default, we output a single frame */
1087 nb0_frames = 0; // tracks the number of times the PREVIOUS frame should be duplicated, mostly for variable framerate (VFR)
1090 format_video_sync = video_sync_method;
1091 if (format_video_sync == VSYNC_AUTO) {
1092 if(!strcmp(of->ctx->oformat->name, "avi")) {
1093 format_video_sync = VSYNC_VFR;
1095 format_video_sync = (of->ctx->oformat->flags & AVFMT_VARIABLE_FPS) ? ((of->ctx->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : VSYNC_CFR;
1097 && format_video_sync == VSYNC_CFR
1098 && input_files[ist->file_index]->ctx->nb_streams == 1
1099 && input_files[ist->file_index]->input_ts_offset == 0) {
1100 format_video_sync = VSYNC_VSCFR;
1102 if (format_video_sync == VSYNC_CFR && copy_ts) {
1103 format_video_sync = VSYNC_VSCFR;
1106 ost->is_cfr = (format_video_sync == VSYNC_CFR || format_video_sync == VSYNC_VSCFR);
1110 format_video_sync != VSYNC_PASSTHROUGH &&
1111 format_video_sync != VSYNC_DROP) {
1112 if (delta0 < -0.6) {
1113 av_log(NULL, AV_LOG_WARNING, "Past duration %f too large\n", -delta0);
1115 av_log(NULL, AV_LOG_DEBUG, "Clipping frame in rate conversion by %f\n", -delta0);
1116 sync_ipts = ost->sync_opts;
1121 switch (format_video_sync) {
1123 if (ost->frame_number == 0 && delta0 >= 0.5) {
1124 av_log(NULL, AV_LOG_DEBUG, "Not duplicating %d initial frames\n", (int)lrintf(delta0));
1127 ost->sync_opts = lrint(sync_ipts);
1130 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1131 if (frame_drop_threshold && delta < frame_drop_threshold && ost->frame_number) {
1133 } else if (delta < -1.1)
1135 else if (delta > 1.1) {
1136 nb_frames = lrintf(delta);
1138 nb0_frames = lrintf(delta0 - 0.6);
1144 else if (delta > 0.6)
1145 ost->sync_opts = lrint(sync_ipts);
1148 case VSYNC_PASSTHROUGH:
1149 ost->sync_opts = lrint(sync_ipts);
1156 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1157 nb0_frames = FFMIN(nb0_frames, nb_frames);
1159 memmove(ost->last_nb0_frames + 1,
1160 ost->last_nb0_frames,
1161 sizeof(ost->last_nb0_frames[0]) * (FF_ARRAY_ELEMS(ost->last_nb0_frames) - 1));
1162 ost->last_nb0_frames[0] = nb0_frames;
1164 if (nb0_frames == 0 && ost->last_dropped) {
1166 av_log(NULL, AV_LOG_VERBOSE,
1167 "*** dropping frame %d from stream %d at ts %"PRId64"\n",
1168 ost->frame_number, ost->st->index, ost->last_frame->pts);
1170 if (nb_frames > (nb0_frames && ost->last_dropped) + (nb_frames > nb0_frames)) {
1171 if (nb_frames > dts_error_threshold * 30) {
1172 av_log(NULL, AV_LOG_ERROR, "%d frame duplication too large, skipping\n", nb_frames - 1);
1176 nb_frames_dup += nb_frames - (nb0_frames && ost->last_dropped) - (nb_frames > nb0_frames);
1177 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1178 if (nb_frames_dup > dup_warning) {
1179 av_log(NULL, AV_LOG_WARNING, "More than %d frames duplicated\n", dup_warning);
1183 ost->last_dropped = nb_frames == nb0_frames && next_picture;
1185 /* duplicates frame if needed */
1186 for (i = 0; i < nb_frames; i++) {
1187 AVFrame *in_picture;
1188 av_init_packet(&pkt);
1192 if (i < nb0_frames && ost->last_frame) {
1193 in_picture = ost->last_frame;
1195 in_picture = next_picture;
1200 in_picture->pts = ost->sync_opts;
1203 if (!check_recording_time(ost))
1205 if (ost->frame_number >= ost->max_frames)
1210 int forced_keyframe = 0;
1213 if (enc->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME) &&
1214 ost->top_field_first >= 0)
1215 in_picture->top_field_first = !!ost->top_field_first;
1217 if (in_picture->interlaced_frame) {
1218 if (enc->codec->id == AV_CODEC_ID_MJPEG)
1219 mux_par->field_order = in_picture->top_field_first ? AV_FIELD_TT:AV_FIELD_BB;
1221 mux_par->field_order = in_picture->top_field_first ? AV_FIELD_TB:AV_FIELD_BT;
1223 mux_par->field_order = AV_FIELD_PROGRESSIVE;
1225 in_picture->quality = enc->global_quality;
1226 in_picture->pict_type = 0;
1228 pts_time = in_picture->pts != AV_NOPTS_VALUE ?
1229 in_picture->pts * av_q2d(enc->time_base) : NAN;
1230 if (ost->forced_kf_index < ost->forced_kf_count &&
1231 in_picture->pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1232 ost->forced_kf_index++;
1233 forced_keyframe = 1;
1234 } else if (ost->forced_keyframes_pexpr) {
1236 ost->forced_keyframes_expr_const_values[FKF_T] = pts_time;
1237 res = av_expr_eval(ost->forced_keyframes_pexpr,
1238 ost->forced_keyframes_expr_const_values, NULL);
1239 ff_dlog(NULL, "force_key_frame: n:%f n_forced:%f prev_forced_n:%f t:%f prev_forced_t:%f -> res:%f\n",
1240 ost->forced_keyframes_expr_const_values[FKF_N],
1241 ost->forced_keyframes_expr_const_values[FKF_N_FORCED],
1242 ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_N],
1243 ost->forced_keyframes_expr_const_values[FKF_T],
1244 ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_T],
1247 forced_keyframe = 1;
1248 ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_N] =
1249 ost->forced_keyframes_expr_const_values[FKF_N];
1250 ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_T] =
1251 ost->forced_keyframes_expr_const_values[FKF_T];
1252 ost->forced_keyframes_expr_const_values[FKF_N_FORCED] += 1;
1255 ost->forced_keyframes_expr_const_values[FKF_N] += 1;
1256 } else if ( ost->forced_keyframes
1257 && !strncmp(ost->forced_keyframes, "source", 6)
1258 && in_picture->key_frame==1) {
1259 forced_keyframe = 1;
1262 if (forced_keyframe) {
1263 in_picture->pict_type = AV_PICTURE_TYPE_I;
1264 av_log(NULL, AV_LOG_DEBUG, "Forced keyframe at time %f\n", pts_time);
1267 update_benchmark(NULL);
1269 av_log(NULL, AV_LOG_INFO, "encoder <- type:video "
1270 "frame_pts:%s frame_pts_time:%s time_base:%d/%d\n",
1271 av_ts2str(in_picture->pts), av_ts2timestr(in_picture->pts, &enc->time_base),
1272 enc->time_base.num, enc->time_base.den);
1275 ost->frames_encoded++;
1277 ret = avcodec_send_frame(enc, in_picture);
1282 ret = avcodec_receive_packet(enc, &pkt);
1283 update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
1284 if (ret == AVERROR(EAGAIN))
1290 av_log(NULL, AV_LOG_INFO, "encoder -> type:video "
1291 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1292 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &enc->time_base),
1293 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &enc->time_base));
1296 if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & AV_CODEC_CAP_DELAY))
1297 pkt.pts = ost->sync_opts;
1299 av_packet_rescale_ts(&pkt, enc->time_base, ost->mux_timebase);
1302 av_log(NULL, AV_LOG_INFO, "encoder -> type:video "
1303 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1304 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->mux_timebase),
1305 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->mux_timebase));
1308 frame_size = pkt.size;
1309 output_packet(of, &pkt, ost, 0);
1311 /* if two pass, output log */
1312 if (ost->logfile && enc->stats_out) {
1313 fprintf(ost->logfile, "%s", enc->stats_out);
1319 * For video, number of frames in == number of packets out.
1320 * But there may be reordering, so we can't throw away frames on encoder
1321 * flush, we need to limit them here, before they go into encoder.
1323 ost->frame_number++;
1325 if (vstats_filename && frame_size)
1326 do_video_stats(ost, frame_size);
1329 if (!ost->last_frame)
1330 ost->last_frame = av_frame_alloc();
1331 av_frame_unref(ost->last_frame);
1332 if (next_picture && ost->last_frame)
1333 av_frame_ref(ost->last_frame, next_picture);
1335 av_frame_free(&ost->last_frame);
1339 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1343 static double psnr(double d)
1345 return -10.0 * log10(d);
1348 static void do_video_stats(OutputStream *ost, int frame_size)
1350 AVCodecContext *enc;
1352 double ti1, bitrate, avg_bitrate;
1354 /* this is executed just the first time do_video_stats is called */
1356 vstats_file = fopen(vstats_filename, "w");
1364 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1365 frame_number = ost->st->nb_frames;
1366 if (vstats_version <= 1) {
1367 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number,
1368 ost->quality / (float)FF_QP2LAMBDA);
1370 fprintf(vstats_file, "out= %2d st= %2d frame= %5d q= %2.1f ", ost->file_index, ost->index, frame_number,
1371 ost->quality / (float)FF_QP2LAMBDA);
1374 if (ost->error[0]>=0 && (enc->flags & AV_CODEC_FLAG_PSNR))
1375 fprintf(vstats_file, "PSNR= %6.2f ", psnr(ost->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1377 fprintf(vstats_file,"f_size= %6d ", frame_size);
1378 /* compute pts value */
1379 ti1 = av_stream_get_end_pts(ost->st) * av_q2d(ost->st->time_base);
1383 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1384 avg_bitrate = (double)(ost->data_size * 8) / ti1 / 1000.0;
1385 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1386 (double)ost->data_size / 1024, ti1, bitrate, avg_bitrate);
1387 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(ost->pict_type));
1391 static int init_output_stream(OutputStream *ost, char *error, int error_len);
1393 static void finish_output_stream(OutputStream *ost)
1395 OutputFile *of = output_files[ost->file_index];
1398 ost->finished = ENCODER_FINISHED | MUXER_FINISHED;
1401 for (i = 0; i < of->ctx->nb_streams; i++)
1402 output_streams[of->ost_index + i]->finished = ENCODER_FINISHED | MUXER_FINISHED;
1407 * Get and encode new output from any of the filtergraphs, without causing
1410 * @return 0 for success, <0 for severe errors
1412 static int reap_filters(int flush)
1414 AVFrame *filtered_frame = NULL;
1417 /* Reap all buffers present in the buffer sinks */
1418 for (i = 0; i < nb_output_streams; i++) {
1419 OutputStream *ost = output_streams[i];
1420 OutputFile *of = output_files[ost->file_index];
1421 AVFilterContext *filter;
1422 AVCodecContext *enc = ost->enc_ctx;
1425 if (!ost->filter || !ost->filter->graph->graph)
1427 filter = ost->filter->filter;
1429 if (!ost->initialized) {
1430 char error[1024] = "";
1431 ret = init_output_stream(ost, error, sizeof(error));
1433 av_log(NULL, AV_LOG_ERROR, "Error initializing output stream %d:%d -- %s\n",
1434 ost->file_index, ost->index, error);
1439 if (!ost->filtered_frame && !(ost->filtered_frame = av_frame_alloc())) {
1440 return AVERROR(ENOMEM);
1442 filtered_frame = ost->filtered_frame;
1445 double float_pts = AV_NOPTS_VALUE; // this is identical to filtered_frame.pts but with higher precision
1446 ret = av_buffersink_get_frame_flags(filter, filtered_frame,
1447 AV_BUFFERSINK_FLAG_NO_REQUEST);
1449 if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) {
1450 av_log(NULL, AV_LOG_WARNING,
1451 "Error in av_buffersink_get_frame_flags(): %s\n", av_err2str(ret));
1452 } else if (flush && ret == AVERROR_EOF) {
1453 if (av_buffersink_get_type(filter) == AVMEDIA_TYPE_VIDEO)
1454 do_video_out(of, ost, NULL, AV_NOPTS_VALUE);
1458 if (ost->finished) {
1459 av_frame_unref(filtered_frame);
1462 if (filtered_frame->pts != AV_NOPTS_VALUE) {
1463 int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time;
1464 AVRational filter_tb = av_buffersink_get_time_base(filter);
1465 AVRational tb = enc->time_base;
1466 int extra_bits = av_clip(29 - av_log2(tb.den), 0, 16);
1468 tb.den <<= extra_bits;
1470 av_rescale_q(filtered_frame->pts, filter_tb, tb) -
1471 av_rescale_q(start_time, AV_TIME_BASE_Q, tb);
1472 float_pts /= 1 << extra_bits;
1473 // avoid exact midoints to reduce the chance of rounding differences, this can be removed in case the fps code is changed to work with integers
1474 float_pts += FFSIGN(float_pts) * 1.0 / (1<<17);
1476 filtered_frame->pts =
1477 av_rescale_q(filtered_frame->pts, filter_tb, enc->time_base) -
1478 av_rescale_q(start_time, AV_TIME_BASE_Q, enc->time_base);
1480 //if (ost->source_index >= 0)
1481 // *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold
1483 switch (av_buffersink_get_type(filter)) {
1484 case AVMEDIA_TYPE_VIDEO:
1485 if (!ost->frame_aspect_ratio.num)
1486 enc->sample_aspect_ratio = filtered_frame->sample_aspect_ratio;
1489 av_log(NULL, AV_LOG_INFO, "filter -> pts:%s pts_time:%s exact:%f time_base:%d/%d\n",
1490 av_ts2str(filtered_frame->pts), av_ts2timestr(filtered_frame->pts, &enc->time_base),
1492 enc->time_base.num, enc->time_base.den);
1495 do_video_out(of, ost, filtered_frame, float_pts);
1497 case AVMEDIA_TYPE_AUDIO:
1498 if (!(enc->codec->capabilities & AV_CODEC_CAP_PARAM_CHANGE) &&
1499 enc->channels != filtered_frame->channels) {
1500 av_log(NULL, AV_LOG_ERROR,
1501 "Audio filter graph output is not normalized and encoder does not support parameter changes\n");
1504 do_audio_out(of, ost, filtered_frame);
1507 // TODO support subtitle filters
1511 av_frame_unref(filtered_frame);
1518 static void print_final_stats(int64_t total_size)
1520 uint64_t video_size = 0, audio_size = 0, extra_size = 0, other_size = 0;
1521 uint64_t subtitle_size = 0;
1522 uint64_t data_size = 0;
1523 float percent = -1.0;
1527 for (i = 0; i < nb_output_streams; i++) {
1528 OutputStream *ost = output_streams[i];
1529 switch (ost->enc_ctx->codec_type) {
1530 case AVMEDIA_TYPE_VIDEO: video_size += ost->data_size; break;
1531 case AVMEDIA_TYPE_AUDIO: audio_size += ost->data_size; break;
1532 case AVMEDIA_TYPE_SUBTITLE: subtitle_size += ost->data_size; break;
1533 default: other_size += ost->data_size; break;
1535 extra_size += ost->enc_ctx->extradata_size;
1536 data_size += ost->data_size;
1537 if ( (ost->enc_ctx->flags & (AV_CODEC_FLAG_PASS1 | AV_CODEC_FLAG_PASS2))
1538 != AV_CODEC_FLAG_PASS1)
1542 if (data_size && total_size>0 && total_size >= data_size)
1543 percent = 100.0 * (total_size - data_size) / data_size;
1545 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB subtitle:%1.0fkB other streams:%1.0fkB global headers:%1.0fkB muxing overhead: ",
1546 video_size / 1024.0,
1547 audio_size / 1024.0,
1548 subtitle_size / 1024.0,
1549 other_size / 1024.0,
1550 extra_size / 1024.0);
1552 av_log(NULL, AV_LOG_INFO, "%f%%", percent);
1554 av_log(NULL, AV_LOG_INFO, "unknown");
1555 av_log(NULL, AV_LOG_INFO, "\n");
1557 /* print verbose per-stream stats */
1558 for (i = 0; i < nb_input_files; i++) {
1559 InputFile *f = input_files[i];
1560 uint64_t total_packets = 0, total_size = 0;
1562 av_log(NULL, AV_LOG_VERBOSE, "Input file #%d (%s):\n",
1565 for (j = 0; j < f->nb_streams; j++) {
1566 InputStream *ist = input_streams[f->ist_index + j];
1567 enum AVMediaType type = ist->dec_ctx->codec_type;
1569 total_size += ist->data_size;
1570 total_packets += ist->nb_packets;
1572 av_log(NULL, AV_LOG_VERBOSE, " Input stream #%d:%d (%s): ",
1573 i, j, media_type_string(type));
1574 av_log(NULL, AV_LOG_VERBOSE, "%"PRIu64" packets read (%"PRIu64" bytes); ",
1575 ist->nb_packets, ist->data_size);
1577 if (ist->decoding_needed) {
1578 av_log(NULL, AV_LOG_VERBOSE, "%"PRIu64" frames decoded",
1579 ist->frames_decoded);
1580 if (type == AVMEDIA_TYPE_AUDIO)
1581 av_log(NULL, AV_LOG_VERBOSE, " (%"PRIu64" samples)", ist->samples_decoded);
1582 av_log(NULL, AV_LOG_VERBOSE, "; ");
1585 av_log(NULL, AV_LOG_VERBOSE, "\n");
1588 av_log(NULL, AV_LOG_VERBOSE, " Total: %"PRIu64" packets (%"PRIu64" bytes) demuxed\n",
1589 total_packets, total_size);
1592 for (i = 0; i < nb_output_files; i++) {
1593 OutputFile *of = output_files[i];
1594 uint64_t total_packets = 0, total_size = 0;
1596 av_log(NULL, AV_LOG_VERBOSE, "Output file #%d (%s):\n",
1599 for (j = 0; j < of->ctx->nb_streams; j++) {
1600 OutputStream *ost = output_streams[of->ost_index + j];
1601 enum AVMediaType type = ost->enc_ctx->codec_type;
1603 total_size += ost->data_size;
1604 total_packets += ost->packets_written;
1606 av_log(NULL, AV_LOG_VERBOSE, " Output stream #%d:%d (%s): ",
1607 i, j, media_type_string(type));
1608 if (ost->encoding_needed) {
1609 av_log(NULL, AV_LOG_VERBOSE, "%"PRIu64" frames encoded",
1610 ost->frames_encoded);
1611 if (type == AVMEDIA_TYPE_AUDIO)
1612 av_log(NULL, AV_LOG_VERBOSE, " (%"PRIu64" samples)", ost->samples_encoded);
1613 av_log(NULL, AV_LOG_VERBOSE, "; ");
1616 av_log(NULL, AV_LOG_VERBOSE, "%"PRIu64" packets muxed (%"PRIu64" bytes); ",
1617 ost->packets_written, ost->data_size);
1619 av_log(NULL, AV_LOG_VERBOSE, "\n");
1622 av_log(NULL, AV_LOG_VERBOSE, " Total: %"PRIu64" packets (%"PRIu64" bytes) muxed\n",
1623 total_packets, total_size);
1625 if(video_size + data_size + audio_size + subtitle_size + extra_size == 0){
1626 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded ");
1628 av_log(NULL, AV_LOG_WARNING, "\n");
1630 av_log(NULL, AV_LOG_WARNING, "(check -ss / -t / -frames parameters if used)\n");
1635 static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time)
1637 AVBPrint buf, buf_script;
1639 AVFormatContext *oc;
1641 AVCodecContext *enc;
1642 int frame_number, vid, i;
1645 int64_t pts = INT64_MIN + 1;
1646 static int64_t last_time = -1;
1647 static int qp_histogram[52];
1648 int hours, mins, secs, us;
1649 const char *hours_sign;
1653 if (!print_stats && !is_last_report && !progress_avio)
1656 if (!is_last_report) {
1657 if (last_time == -1) {
1658 last_time = cur_time;
1661 if ((cur_time - last_time) < 500000)
1663 last_time = cur_time;
1666 t = (cur_time-timer_start) / 1000000.0;
1669 oc = output_files[0]->ctx;
1671 total_size = avio_size(oc->pb);
1672 if (total_size <= 0) // FIXME improve avio_size() so it works with non seekable output too
1673 total_size = avio_tell(oc->pb);
1676 av_bprint_init(&buf, 0, AV_BPRINT_SIZE_AUTOMATIC);
1677 av_bprint_init(&buf_script, 0, 1);
1678 for (i = 0; i < nb_output_streams; i++) {
1680 ost = output_streams[i];
1682 if (!ost->stream_copy)
1683 q = ost->quality / (float) FF_QP2LAMBDA;
1685 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1686 av_bprintf(&buf, "q=%2.1f ", q);
1687 av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
1688 ost->file_index, ost->index, q);
1690 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1693 frame_number = ost->frame_number;
1694 fps = t > 1 ? frame_number / t : 0;
1695 av_bprintf(&buf, "frame=%5d fps=%3.*f q=%3.1f ",
1696 frame_number, fps < 9.95, fps, q);
1697 av_bprintf(&buf_script, "frame=%d\n", frame_number);
1698 av_bprintf(&buf_script, "fps=%.1f\n", fps);
1699 av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
1700 ost->file_index, ost->index, q);
1702 av_bprintf(&buf, "L");
1706 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
1708 for (j = 0; j < 32; j++)
1709 av_bprintf(&buf, "%X", av_log2(qp_histogram[j] + 1));
1712 if ((enc->flags & AV_CODEC_FLAG_PSNR) && (ost->pict_type != AV_PICTURE_TYPE_NONE || is_last_report)) {
1714 double error, error_sum = 0;
1715 double scale, scale_sum = 0;
1717 char type[3] = { 'Y','U','V' };
1718 av_bprintf(&buf, "PSNR=");
1719 for (j = 0; j < 3; j++) {
1720 if (is_last_report) {
1721 error = enc->error[j];
1722 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
1724 error = ost->error[j];
1725 scale = enc->width * enc->height * 255.0 * 255.0;
1731 p = psnr(error / scale);
1732 av_bprintf(&buf, "%c:%2.2f ", type[j], p);
1733 av_bprintf(&buf_script, "stream_%d_%d_psnr_%c=%2.2f\n",
1734 ost->file_index, ost->index, type[j] | 32, p);
1736 p = psnr(error_sum / scale_sum);
1737 av_bprintf(&buf, "*:%2.2f ", psnr(error_sum / scale_sum));
1738 av_bprintf(&buf_script, "stream_%d_%d_psnr_all=%2.2f\n",
1739 ost->file_index, ost->index, p);
1743 /* compute min output value */
1744 if (av_stream_get_end_pts(ost->st) != AV_NOPTS_VALUE)
1745 pts = FFMAX(pts, av_rescale_q(av_stream_get_end_pts(ost->st),
1746 ost->st->time_base, AV_TIME_BASE_Q));
1748 nb_frames_drop += ost->last_dropped;
1751 secs = FFABS(pts) / AV_TIME_BASE;
1752 us = FFABS(pts) % AV_TIME_BASE;
1757 hours_sign = (pts < 0) ? "-" : "";
1759 bitrate = pts && total_size >= 0 ? total_size * 8 / (pts / 1000.0) : -1;
1760 speed = t != 0.0 ? (double)pts / AV_TIME_BASE / t : -1;
1762 if (total_size < 0) av_bprintf(&buf, "size=N/A time=");
1763 else av_bprintf(&buf, "size=%8.0fkB time=", total_size / 1024.0);
1764 if (pts == AV_NOPTS_VALUE) {
1765 av_bprintf(&buf, "N/A ");
1767 av_bprintf(&buf, "%s%02d:%02d:%02d.%02d ",
1768 hours_sign, hours, mins, secs, (100 * us) / AV_TIME_BASE);
1772 av_bprintf(&buf, "bitrate=N/A");
1773 av_bprintf(&buf_script, "bitrate=N/A\n");
1775 av_bprintf(&buf, "bitrate=%6.1fkbits/s", bitrate);
1776 av_bprintf(&buf_script, "bitrate=%6.1fkbits/s\n", bitrate);
1779 if (total_size < 0) av_bprintf(&buf_script, "total_size=N/A\n");
1780 else av_bprintf(&buf_script, "total_size=%"PRId64"\n", total_size);
1781 if (pts == AV_NOPTS_VALUE) {
1782 av_bprintf(&buf_script, "out_time_ms=N/A\n");
1783 av_bprintf(&buf_script, "out_time=N/A\n");
1785 av_bprintf(&buf_script, "out_time_ms=%"PRId64"\n", pts);
1786 av_bprintf(&buf_script, "out_time=%s%02d:%02d:%02d.%06d\n",
1787 hours_sign, hours, mins, secs, us);
1790 if (nb_frames_dup || nb_frames_drop)
1791 av_bprintf(&buf, " dup=%d drop=%d", nb_frames_dup, nb_frames_drop);
1792 av_bprintf(&buf_script, "dup_frames=%d\n", nb_frames_dup);
1793 av_bprintf(&buf_script, "drop_frames=%d\n", nb_frames_drop);
1796 av_bprintf(&buf, " speed=N/A");
1797 av_bprintf(&buf_script, "speed=N/A\n");
1799 av_bprintf(&buf, " speed=%4.3gx", speed);
1800 av_bprintf(&buf_script, "speed=%4.3gx\n", speed);
1803 if (print_stats || is_last_report) {
1804 const char end = is_last_report ? '\n' : '\r';
1805 if (print_stats==1 && AV_LOG_INFO > av_log_get_level()) {
1806 fprintf(stderr, "%s %c", buf.str, end);
1808 av_log(NULL, AV_LOG_INFO, "%s %c", buf.str, end);
1812 av_bprint_finalize(&buf, NULL);
1814 if (progress_avio) {
1815 av_bprintf(&buf_script, "progress=%s\n",
1816 is_last_report ? "end" : "continue");
1817 avio_write(progress_avio, buf_script.str,
1818 FFMIN(buf_script.len, buf_script.size - 1));
1819 avio_flush(progress_avio);
1820 av_bprint_finalize(&buf_script, NULL);
1821 if (is_last_report) {
1822 if ((ret = avio_closep(&progress_avio)) < 0)
1823 av_log(NULL, AV_LOG_ERROR,
1824 "Error closing progress log, loss of information possible: %s\n", av_err2str(ret));
1829 print_final_stats(total_size);
1832 static void ifilter_parameters_from_codecpar(InputFilter *ifilter, AVCodecParameters *par)
1834 // We never got any input. Set a fake format, which will
1835 // come from libavformat.
1836 ifilter->format = par->format;
1837 ifilter->sample_rate = par->sample_rate;
1838 ifilter->channels = par->channels;
1839 ifilter->channel_layout = par->channel_layout;
1840 ifilter->width = par->width;
1841 ifilter->height = par->height;
1842 ifilter->sample_aspect_ratio = par->sample_aspect_ratio;
1845 static void flush_encoders(void)
1849 for (i = 0; i < nb_output_streams; i++) {
1850 OutputStream *ost = output_streams[i];
1851 AVCodecContext *enc = ost->enc_ctx;
1852 OutputFile *of = output_files[ost->file_index];
1854 if (!ost->encoding_needed)
1857 // Try to enable encoding with no input frames.
1858 // Maybe we should just let encoding fail instead.
1859 if (!ost->initialized) {
1860 FilterGraph *fg = ost->filter->graph;
1861 char error[1024] = "";
1863 av_log(NULL, AV_LOG_WARNING,
1864 "Finishing stream %d:%d without any data written to it.\n",
1865 ost->file_index, ost->st->index);
1867 if (ost->filter && !fg->graph) {
1869 for (x = 0; x < fg->nb_inputs; x++) {
1870 InputFilter *ifilter = fg->inputs[x];
1871 if (ifilter->format < 0)
1872 ifilter_parameters_from_codecpar(ifilter, ifilter->ist->st->codecpar);
1875 if (!ifilter_has_all_input_formats(fg))
1878 ret = configure_filtergraph(fg);
1880 av_log(NULL, AV_LOG_ERROR, "Error configuring filter graph\n");
1884 finish_output_stream(ost);
1887 ret = init_output_stream(ost, error, sizeof(error));
1889 av_log(NULL, AV_LOG_ERROR, "Error initializing output stream %d:%d -- %s\n",
1890 ost->file_index, ost->index, error);
1895 if (enc->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
1898 if (enc->codec_type != AVMEDIA_TYPE_VIDEO && enc->codec_type != AVMEDIA_TYPE_AUDIO)
1902 const char *desc = NULL;
1906 switch (enc->codec_type) {
1907 case AVMEDIA_TYPE_AUDIO:
1910 case AVMEDIA_TYPE_VIDEO:
1917 av_init_packet(&pkt);
1921 update_benchmark(NULL);
1923 while ((ret = avcodec_receive_packet(enc, &pkt)) == AVERROR(EAGAIN)) {
1924 ret = avcodec_send_frame(enc, NULL);
1926 av_log(NULL, AV_LOG_FATAL, "%s encoding failed: %s\n",
1933 update_benchmark("flush_%s %d.%d", desc, ost->file_index, ost->index);
1934 if (ret < 0 && ret != AVERROR_EOF) {
1935 av_log(NULL, AV_LOG_FATAL, "%s encoding failed: %s\n",
1940 if (ost->logfile && enc->stats_out) {
1941 fprintf(ost->logfile, "%s", enc->stats_out);
1943 if (ret == AVERROR_EOF) {
1944 output_packet(of, &pkt, ost, 1);
1947 if (ost->finished & MUXER_FINISHED) {
1948 av_packet_unref(&pkt);
1951 av_packet_rescale_ts(&pkt, enc->time_base, ost->mux_timebase);
1952 pkt_size = pkt.size;
1953 output_packet(of, &pkt, ost, 0);
1954 if (ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO && vstats_filename) {
1955 do_video_stats(ost, pkt_size);
1962 * Check whether a packet from ist should be written into ost at this time
1964 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1966 OutputFile *of = output_files[ost->file_index];
1967 int ist_index = input_files[ist->file_index]->ist_index + ist->st->index;
1969 if (ost->source_index != ist_index)
1975 if (of->start_time != AV_NOPTS_VALUE && ist->pts < of->start_time)
1981 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1983 OutputFile *of = output_files[ost->file_index];
1984 InputFile *f = input_files [ist->file_index];
1985 int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time;
1986 int64_t ost_tb_start_time = av_rescale_q(start_time, AV_TIME_BASE_Q, ost->mux_timebase);
1987 AVPacket opkt = { 0 };
1989 av_init_packet(&opkt);
1991 // EOF: flush output bitstream filters.
1993 output_packet(of, &opkt, ost, 1);
1997 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1998 !ost->copy_initial_nonkeyframes)
2001 if (!ost->frame_number && !ost->copy_prior_start) {
2002 int64_t comp_start = start_time;
2003 if (copy_ts && f->start_time != AV_NOPTS_VALUE)
2004 comp_start = FFMAX(start_time, f->start_time + f->ts_offset);
2005 if (pkt->pts == AV_NOPTS_VALUE ?
2006 ist->pts < comp_start :
2007 pkt->pts < av_rescale_q(comp_start, AV_TIME_BASE_Q, ist->st->time_base))
2011 if (of->recording_time != INT64_MAX &&
2012 ist->pts >= of->recording_time + start_time) {
2013 close_output_stream(ost);
2017 if (f->recording_time != INT64_MAX) {
2018 start_time = f->ctx->start_time;
2019 if (f->start_time != AV_NOPTS_VALUE && copy_ts)
2020 start_time += f->start_time;
2021 if (ist->pts >= f->recording_time + start_time) {
2022 close_output_stream(ost);
2027 /* force the input stream PTS */
2028 if (ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO)
2031 if (pkt->pts != AV_NOPTS_VALUE)
2032 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->mux_timebase) - ost_tb_start_time;
2034 opkt.pts = AV_NOPTS_VALUE;
2036 if (pkt->dts == AV_NOPTS_VALUE)
2037 opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->mux_timebase);
2039 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->mux_timebase);
2040 opkt.dts -= ost_tb_start_time;
2042 if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && pkt->dts != AV_NOPTS_VALUE) {
2043 int duration = av_get_audio_frame_duration(ist->dec_ctx, pkt->size);
2045 duration = ist->dec_ctx->frame_size;
2046 opkt.dts = opkt.pts = av_rescale_delta(ist->st->time_base, pkt->dts,
2047 (AVRational){1, ist->dec_ctx->sample_rate}, duration, &ist->filter_in_rescale_delta_last,
2048 ost->mux_timebase) - ost_tb_start_time;
2051 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->mux_timebase);
2053 opkt.flags = pkt->flags;
2056 opkt.buf = av_buffer_ref(pkt->buf);
2060 opkt.data = pkt->data;
2061 opkt.size = pkt->size;
2063 av_copy_packet_side_data(&opkt, pkt);
2065 output_packet(of, &opkt, ost, 0);
2068 int guess_input_channel_layout(InputStream *ist)
2070 AVCodecContext *dec = ist->dec_ctx;
2072 if (!dec->channel_layout) {
2073 char layout_name[256];
2075 if (dec->channels > ist->guess_layout_max)
2077 dec->channel_layout = av_get_default_channel_layout(dec->channels);
2078 if (!dec->channel_layout)
2080 av_get_channel_layout_string(layout_name, sizeof(layout_name),
2081 dec->channels, dec->channel_layout);
2082 av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Input Stream "
2083 "#%d.%d : %s\n", ist->file_index, ist->st->index, layout_name);
2088 static void check_decode_result(InputStream *ist, int *got_output, int ret)
2090 if (*got_output || ret<0)
2091 decode_error_stat[ret<0] ++;
2093 if (ret < 0 && exit_on_error)
2096 if (exit_on_error && *got_output && ist) {
2097 if (ist->decoded_frame->decode_error_flags || (ist->decoded_frame->flags & AV_FRAME_FLAG_CORRUPT)) {
2098 av_log(NULL, AV_LOG_FATAL, "%s: corrupt decoded frame in stream %d\n", input_files[ist->file_index]->ctx->url, ist->st->index);
2104 // Filters can be configured only if the formats of all inputs are known.
2105 static int ifilter_has_all_input_formats(FilterGraph *fg)
2108 for (i = 0; i < fg->nb_inputs; i++) {
2109 if (fg->inputs[i]->format < 0 && (fg->inputs[i]->type == AVMEDIA_TYPE_AUDIO ||
2110 fg->inputs[i]->type == AVMEDIA_TYPE_VIDEO))
2116 static int ifilter_send_frame(InputFilter *ifilter, AVFrame *frame)
2118 FilterGraph *fg = ifilter->graph;
2119 int need_reinit, ret, i;
2121 /* determine if the parameters for this input changed */
2122 need_reinit = ifilter->format != frame->format;
2123 if (!!ifilter->hw_frames_ctx != !!frame->hw_frames_ctx ||
2124 (ifilter->hw_frames_ctx && ifilter->hw_frames_ctx->data != frame->hw_frames_ctx->data))
2127 switch (ifilter->ist->st->codecpar->codec_type) {
2128 case AVMEDIA_TYPE_AUDIO:
2129 need_reinit |= ifilter->sample_rate != frame->sample_rate ||
2130 ifilter->channels != frame->channels ||
2131 ifilter->channel_layout != frame->channel_layout;
2133 case AVMEDIA_TYPE_VIDEO:
2134 need_reinit |= ifilter->width != frame->width ||
2135 ifilter->height != frame->height;
2140 ret = ifilter_parameters_from_frame(ifilter, frame);
2145 /* (re)init the graph if possible, otherwise buffer the frame and return */
2146 if (need_reinit || !fg->graph) {
2147 for (i = 0; i < fg->nb_inputs; i++) {
2148 if (!ifilter_has_all_input_formats(fg)) {
2149 AVFrame *tmp = av_frame_clone(frame);
2151 return AVERROR(ENOMEM);
2152 av_frame_unref(frame);
2154 if (!av_fifo_space(ifilter->frame_queue)) {
2155 ret = av_fifo_realloc2(ifilter->frame_queue, 2 * av_fifo_size(ifilter->frame_queue));
2157 av_frame_free(&tmp);
2161 av_fifo_generic_write(ifilter->frame_queue, &tmp, sizeof(tmp), NULL);
2166 ret = reap_filters(1);
2167 if (ret < 0 && ret != AVERROR_EOF) {
2168 av_log(NULL, AV_LOG_ERROR, "Error while filtering: %s\n", av_err2str(ret));
2172 ret = configure_filtergraph(fg);
2174 av_log(NULL, AV_LOG_ERROR, "Error reinitializing filters!\n");
2179 ret = av_buffersrc_add_frame_flags(ifilter->filter, frame, AV_BUFFERSRC_FLAG_PUSH);
2181 if (ret != AVERROR_EOF)
2182 av_log(NULL, AV_LOG_ERROR, "Error while filtering: %s\n", av_err2str(ret));
2189 static int ifilter_send_eof(InputFilter *ifilter, int64_t pts)
2195 if (ifilter->filter) {
2196 ret = av_buffersrc_close(ifilter->filter, pts, AV_BUFFERSRC_FLAG_PUSH);
2200 // the filtergraph was never configured
2201 FilterGraph *fg = ifilter->graph;
2202 if (ifilter->format < 0)
2203 ifilter_parameters_from_codecpar(ifilter, ifilter->ist->st->codecpar);
2204 if (ifilter->format < 0 && (ifilter->type == AVMEDIA_TYPE_AUDIO || ifilter->type == AVMEDIA_TYPE_VIDEO)) {
2205 av_log(NULL, AV_LOG_ERROR, "Cannot determine format of input stream %d:%d after EOF\n", ifilter->ist->file_index, ifilter->ist->st->index);
2206 return AVERROR_INVALIDDATA;
2213 // This does not quite work like avcodec_decode_audio4/avcodec_decode_video2.
2214 // There is the following difference: if you got a frame, you must call
2215 // it again with pkt=NULL. pkt==NULL is treated differently from pkt->size==0
2216 // (pkt==NULL means get more output, pkt->size==0 is a flush/drain packet)
2217 static int decode(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *pkt)
2224 ret = avcodec_send_packet(avctx, pkt);
2225 // In particular, we don't expect AVERROR(EAGAIN), because we read all
2226 // decoded frames with avcodec_receive_frame() until done.
2227 if (ret < 0 && ret != AVERROR_EOF)
2231 ret = avcodec_receive_frame(avctx, frame);
2232 if (ret < 0 && ret != AVERROR(EAGAIN))
2240 static int send_frame_to_filters(InputStream *ist, AVFrame *decoded_frame)
2245 av_assert1(ist->nb_filters > 0); /* ensure ret is initialized */
2246 for (i = 0; i < ist->nb_filters; i++) {
2247 if (i < ist->nb_filters - 1) {
2248 f = ist->filter_frame;
2249 ret = av_frame_ref(f, decoded_frame);
2254 ret = ifilter_send_frame(ist->filters[i], f);
2255 if (ret == AVERROR_EOF)
2256 ret = 0; /* ignore */
2258 av_log(NULL, AV_LOG_ERROR,
2259 "Failed to inject frame into filter network: %s\n", av_err2str(ret));
2266 static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output,
2269 AVFrame *decoded_frame;
2270 AVCodecContext *avctx = ist->dec_ctx;
2272 AVRational decoded_frame_tb;
2274 if (!ist->decoded_frame && !(ist->decoded_frame = av_frame_alloc()))
2275 return AVERROR(ENOMEM);
2276 if (!ist->filter_frame && !(ist->filter_frame = av_frame_alloc()))
2277 return AVERROR(ENOMEM);
2278 decoded_frame = ist->decoded_frame;
2280 update_benchmark(NULL);
2281 ret = decode(avctx, decoded_frame, got_output, pkt);
2282 update_benchmark("decode_audio %d.%d", ist->file_index, ist->st->index);
2286 if (ret >= 0 && avctx->sample_rate <= 0) {
2287 av_log(avctx, AV_LOG_ERROR, "Sample rate %d invalid\n", avctx->sample_rate);
2288 ret = AVERROR_INVALIDDATA;
2291 if (ret != AVERROR_EOF)
2292 check_decode_result(ist, got_output, ret);
2294 if (!*got_output || ret < 0)
2297 ist->samples_decoded += decoded_frame->nb_samples;
2298 ist->frames_decoded++;
2301 /* increment next_dts to use for the case where the input stream does not
2302 have timestamps or there are multiple frames in the packet */
2303 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2305 ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2309 if (decoded_frame->pts != AV_NOPTS_VALUE) {
2310 decoded_frame_tb = ist->st->time_base;
2311 } else if (pkt && pkt->pts != AV_NOPTS_VALUE) {
2312 decoded_frame->pts = pkt->pts;
2313 decoded_frame_tb = ist->st->time_base;
2315 decoded_frame->pts = ist->dts;
2316 decoded_frame_tb = AV_TIME_BASE_Q;
2318 if (decoded_frame->pts != AV_NOPTS_VALUE)
2319 decoded_frame->pts = av_rescale_delta(decoded_frame_tb, decoded_frame->pts,
2320 (AVRational){1, avctx->sample_rate}, decoded_frame->nb_samples, &ist->filter_in_rescale_delta_last,
2321 (AVRational){1, avctx->sample_rate});
2322 ist->nb_samples = decoded_frame->nb_samples;
2323 err = send_frame_to_filters(ist, decoded_frame);
2325 av_frame_unref(ist->filter_frame);
2326 av_frame_unref(decoded_frame);
2327 return err < 0 ? err : ret;
2330 static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *duration_pts, int eof,
2333 AVFrame *decoded_frame;
2334 int i, ret = 0, err = 0;
2335 int64_t best_effort_timestamp;
2336 int64_t dts = AV_NOPTS_VALUE;
2339 // With fate-indeo3-2, we're getting 0-sized packets before EOF for some
2340 // reason. This seems like a semi-critical bug. Don't trigger EOF, and
2342 if (!eof && pkt && pkt->size == 0)
2345 if (!ist->decoded_frame && !(ist->decoded_frame = av_frame_alloc()))
2346 return AVERROR(ENOMEM);
2347 if (!ist->filter_frame && !(ist->filter_frame = av_frame_alloc()))
2348 return AVERROR(ENOMEM);
2349 decoded_frame = ist->decoded_frame;
2350 if (ist->dts != AV_NOPTS_VALUE)
2351 dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
2354 avpkt.dts = dts; // ffmpeg.c probably shouldn't do this
2357 // The old code used to set dts on the drain packet, which does not work
2358 // with the new API anymore.
2360 void *new = av_realloc_array(ist->dts_buffer, ist->nb_dts_buffer + 1, sizeof(ist->dts_buffer[0]));
2362 return AVERROR(ENOMEM);
2363 ist->dts_buffer = new;
2364 ist->dts_buffer[ist->nb_dts_buffer++] = dts;
2367 update_benchmark(NULL);
2368 ret = decode(ist->dec_ctx, decoded_frame, got_output, pkt ? &avpkt : NULL);
2369 update_benchmark("decode_video %d.%d", ist->file_index, ist->st->index);
2373 // The following line may be required in some cases where there is no parser
2374 // or the parser does not has_b_frames correctly
2375 if (ist->st->codecpar->video_delay < ist->dec_ctx->has_b_frames) {
2376 if (ist->dec_ctx->codec_id == AV_CODEC_ID_H264) {
2377 ist->st->codecpar->video_delay = ist->dec_ctx->has_b_frames;
2379 av_log(ist->dec_ctx, AV_LOG_WARNING,
2380 "video_delay is larger in decoder than demuxer %d > %d.\n"
2381 "If you want to help, upload a sample "
2382 "of this file to ftp://upload.ffmpeg.org/incoming/ "
2383 "and contact the ffmpeg-devel mailing list. (ffmpeg-devel@ffmpeg.org)\n",
2384 ist->dec_ctx->has_b_frames,
2385 ist->st->codecpar->video_delay);
2388 if (ret != AVERROR_EOF)
2389 check_decode_result(ist, got_output, ret);
2391 if (*got_output && ret >= 0) {
2392 if (ist->dec_ctx->width != decoded_frame->width ||
2393 ist->dec_ctx->height != decoded_frame->height ||
2394 ist->dec_ctx->pix_fmt != decoded_frame->format) {
2395 av_log(NULL, AV_LOG_DEBUG, "Frame parameters mismatch context %d,%d,%d != %d,%d,%d\n",
2396 decoded_frame->width,
2397 decoded_frame->height,
2398 decoded_frame->format,
2399 ist->dec_ctx->width,
2400 ist->dec_ctx->height,
2401 ist->dec_ctx->pix_fmt);
2405 if (!*got_output || ret < 0)
2408 if(ist->top_field_first>=0)
2409 decoded_frame->top_field_first = ist->top_field_first;
2411 ist->frames_decoded++;
2413 if (ist->hwaccel_retrieve_data && decoded_frame->format == ist->hwaccel_pix_fmt) {
2414 err = ist->hwaccel_retrieve_data(ist->dec_ctx, decoded_frame);
2418 ist->hwaccel_retrieved_pix_fmt = decoded_frame->format;
2420 best_effort_timestamp= decoded_frame->best_effort_timestamp;
2421 *duration_pts = decoded_frame->pkt_duration;
2423 if (ist->framerate.num)
2424 best_effort_timestamp = ist->cfr_next_pts++;
2426 if (eof && best_effort_timestamp == AV_NOPTS_VALUE && ist->nb_dts_buffer > 0) {
2427 best_effort_timestamp = ist->dts_buffer[0];
2429 for (i = 0; i < ist->nb_dts_buffer - 1; i++)
2430 ist->dts_buffer[i] = ist->dts_buffer[i + 1];
2431 ist->nb_dts_buffer--;
2434 if(best_effort_timestamp != AV_NOPTS_VALUE) {
2435 int64_t ts = av_rescale_q(decoded_frame->pts = best_effort_timestamp, ist->st->time_base, AV_TIME_BASE_Q);
2437 if (ts != AV_NOPTS_VALUE)
2438 ist->next_pts = ist->pts = ts;
2442 av_log(NULL, AV_LOG_INFO, "decoder -> ist_index:%d type:video "
2443 "frame_pts:%s frame_pts_time:%s best_effort_ts:%"PRId64" best_effort_ts_time:%s keyframe:%d frame_type:%d time_base:%d/%d\n",
2444 ist->st->index, av_ts2str(decoded_frame->pts),
2445 av_ts2timestr(decoded_frame->pts, &ist->st->time_base),
2446 best_effort_timestamp,
2447 av_ts2timestr(best_effort_timestamp, &ist->st->time_base),
2448 decoded_frame->key_frame, decoded_frame->pict_type,
2449 ist->st->time_base.num, ist->st->time_base.den);
2452 if (ist->st->sample_aspect_ratio.num)
2453 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
2455 err = send_frame_to_filters(ist, decoded_frame);
2458 av_frame_unref(ist->filter_frame);
2459 av_frame_unref(decoded_frame);
2460 return err < 0 ? err : ret;
2463 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output,
2466 AVSubtitle subtitle;
2468 int i, ret = avcodec_decode_subtitle2(ist->dec_ctx,
2469 &subtitle, got_output, pkt);
2471 check_decode_result(NULL, got_output, ret);
2473 if (ret < 0 || !*got_output) {
2476 sub2video_flush(ist);
2480 if (ist->fix_sub_duration) {
2482 if (ist->prev_sub.got_output) {
2483 end = av_rescale(subtitle.pts - ist->prev_sub.subtitle.pts,
2484 1000, AV_TIME_BASE);
2485 if (end < ist->prev_sub.subtitle.end_display_time) {
2486 av_log(ist->dec_ctx, AV_LOG_DEBUG,
2487 "Subtitle duration reduced from %"PRId32" to %d%s\n",
2488 ist->prev_sub.subtitle.end_display_time, end,
2489 end <= 0 ? ", dropping it" : "");
2490 ist->prev_sub.subtitle.end_display_time = end;
2493 FFSWAP(int, *got_output, ist->prev_sub.got_output);
2494 FFSWAP(int, ret, ist->prev_sub.ret);
2495 FFSWAP(AVSubtitle, subtitle, ist->prev_sub.subtitle);
2503 if (ist->sub2video.frame) {
2504 sub2video_update(ist, &subtitle);
2505 } else if (ist->nb_filters) {
2506 if (!ist->sub2video.sub_queue)
2507 ist->sub2video.sub_queue = av_fifo_alloc(8 * sizeof(AVSubtitle));
2508 if (!ist->sub2video.sub_queue)
2510 if (!av_fifo_space(ist->sub2video.sub_queue)) {
2511 ret = av_fifo_realloc2(ist->sub2video.sub_queue, 2 * av_fifo_size(ist->sub2video.sub_queue));
2515 av_fifo_generic_write(ist->sub2video.sub_queue, &subtitle, sizeof(subtitle), NULL);
2519 if (!subtitle.num_rects)
2522 ist->frames_decoded++;
2524 for (i = 0; i < nb_output_streams; i++) {
2525 OutputStream *ost = output_streams[i];
2527 if (!check_output_constraints(ist, ost) || !ost->encoding_needed
2528 || ost->enc->type != AVMEDIA_TYPE_SUBTITLE)
2531 do_subtitle_out(output_files[ost->file_index], ost, &subtitle);
2536 avsubtitle_free(&subtitle);
2540 static int send_filter_eof(InputStream *ist)
2543 /* TODO keep pts also in stream time base to avoid converting back */
2544 int64_t pts = av_rescale_q_rnd(ist->pts, AV_TIME_BASE_Q, ist->st->time_base,
2545 AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX);
2547 for (i = 0; i < ist->nb_filters; i++) {
2548 ret = ifilter_send_eof(ist->filters[i], pts);
2555 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2556 static int process_input_packet(InputStream *ist, const AVPacket *pkt, int no_eof)
2560 int eof_reached = 0;
2563 if (!ist->saw_first_ts) {
2564 ist->dts = ist->st->avg_frame_rate.num ? - ist->dec_ctx->has_b_frames * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
2566 if (pkt && pkt->pts != AV_NOPTS_VALUE && !ist->decoding_needed) {
2567 ist->dts += av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2568 ist->pts = ist->dts; //unused but better to set it to a value thats not totally wrong
2570 ist->saw_first_ts = 1;
2573 if (ist->next_dts == AV_NOPTS_VALUE)
2574 ist->next_dts = ist->dts;
2575 if (ist->next_pts == AV_NOPTS_VALUE)
2576 ist->next_pts = ist->pts;
2580 av_init_packet(&avpkt);
2587 if (pkt && pkt->dts != AV_NOPTS_VALUE) {
2588 ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2589 if (ist->dec_ctx->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2590 ist->next_pts = ist->pts = ist->dts;
2593 // while we have more to decode or while the decoder did output something on EOF
2594 while (ist->decoding_needed) {
2595 int64_t duration_dts = 0;
2596 int64_t duration_pts = 0;
2598 int decode_failed = 0;
2600 ist->pts = ist->next_pts;
2601 ist->dts = ist->next_dts;
2603 switch (ist->dec_ctx->codec_type) {
2604 case AVMEDIA_TYPE_AUDIO:
2605 ret = decode_audio (ist, repeating ? NULL : &avpkt, &got_output,
2608 case AVMEDIA_TYPE_VIDEO:
2609 ret = decode_video (ist, repeating ? NULL : &avpkt, &got_output, &duration_pts, !pkt,
2611 if (!repeating || !pkt || got_output) {
2612 if (pkt && pkt->duration) {
2613 duration_dts = av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2614 } else if(ist->dec_ctx->framerate.num != 0 && ist->dec_ctx->framerate.den != 0) {
2615 int ticks= av_stream_get_parser(ist->st) ? av_stream_get_parser(ist->st)->repeat_pict+1 : ist->dec_ctx->ticks_per_frame;
2616 duration_dts = ((int64_t)AV_TIME_BASE *
2617 ist->dec_ctx->framerate.den * ticks) /
2618 ist->dec_ctx->framerate.num / ist->dec_ctx->ticks_per_frame;
2621 if(ist->dts != AV_NOPTS_VALUE && duration_dts) {
2622 ist->next_dts += duration_dts;
2624 ist->next_dts = AV_NOPTS_VALUE;
2628 if (duration_pts > 0) {
2629 ist->next_pts += av_rescale_q(duration_pts, ist->st->time_base, AV_TIME_BASE_Q);
2631 ist->next_pts += duration_dts;
2635 case AVMEDIA_TYPE_SUBTITLE:
2638 ret = transcode_subtitles(ist, &avpkt, &got_output, &decode_failed);
2639 if (!pkt && ret >= 0)
2646 if (ret == AVERROR_EOF) {
2652 if (decode_failed) {
2653 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d: %s\n",
2654 ist->file_index, ist->st->index, av_err2str(ret));
2656 av_log(NULL, AV_LOG_FATAL, "Error while processing the decoded "
2657 "data for stream #%d:%d\n", ist->file_index, ist->st->index);
2659 if (!decode_failed || exit_on_error)
2665 ist->got_output = 1;
2670 // During draining, we might get multiple output frames in this loop.
2671 // ffmpeg.c does not drain the filter chain on configuration changes,
2672 // which means if we send multiple frames at once to the filters, and
2673 // one of those frames changes configuration, the buffered frames will
2674 // be lost. This can upset certain FATE tests.
2675 // Decode only 1 frame per call on EOF to appease these FATE tests.
2676 // The ideal solution would be to rewrite decoding to use the new
2677 // decoding API in a better way.
2684 /* after flushing, send an EOF on all the filter inputs attached to the stream */
2685 /* except when looping we need to flush but not to send an EOF */
2686 if (!pkt && ist->decoding_needed && eof_reached && !no_eof) {
2687 int ret = send_filter_eof(ist);
2689 av_log(NULL, AV_LOG_FATAL, "Error marking filters as finished\n");
2694 /* handle stream copy */
2695 if (!ist->decoding_needed && pkt) {
2696 ist->dts = ist->next_dts;
2697 switch (ist->dec_ctx->codec_type) {
2698 case AVMEDIA_TYPE_AUDIO:
2699 ist->next_dts += ((int64_t)AV_TIME_BASE * ist->dec_ctx->frame_size) /
2700 ist->dec_ctx->sample_rate;
2702 case AVMEDIA_TYPE_VIDEO:
2703 if (ist->framerate.num) {
2704 // TODO: Remove work-around for c99-to-c89 issue 7
2705 AVRational time_base_q = AV_TIME_BASE_Q;
2706 int64_t next_dts = av_rescale_q(ist->next_dts, time_base_q, av_inv_q(ist->framerate));
2707 ist->next_dts = av_rescale_q(next_dts + 1, av_inv_q(ist->framerate), time_base_q);
2708 } else if (pkt->duration) {
2709 ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2710 } else if(ist->dec_ctx->framerate.num != 0) {
2711 int ticks= av_stream_get_parser(ist->st) ? av_stream_get_parser(ist->st)->repeat_pict + 1 : ist->dec_ctx->ticks_per_frame;
2712 ist->next_dts += ((int64_t)AV_TIME_BASE *
2713 ist->dec_ctx->framerate.den * ticks) /
2714 ist->dec_ctx->framerate.num / ist->dec_ctx->ticks_per_frame;
2718 ist->pts = ist->dts;
2719 ist->next_pts = ist->next_dts;
2721 for (i = 0; i < nb_output_streams; i++) {
2722 OutputStream *ost = output_streams[i];
2724 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2727 do_streamcopy(ist, ost, pkt);
2730 return !eof_reached;
2733 static void print_sdp(void)
2738 AVIOContext *sdp_pb;
2739 AVFormatContext **avc;
2741 for (i = 0; i < nb_output_files; i++) {
2742 if (!output_files[i]->header_written)
2746 avc = av_malloc_array(nb_output_files, sizeof(*avc));
2749 for (i = 0, j = 0; i < nb_output_files; i++) {
2750 if (!strcmp(output_files[i]->ctx->oformat->name, "rtp")) {
2751 avc[j] = output_files[i]->ctx;
2759 av_sdp_create(avc, j, sdp, sizeof(sdp));
2761 if (!sdp_filename) {
2762 printf("SDP:\n%s\n", sdp);
2765 if (avio_open2(&sdp_pb, sdp_filename, AVIO_FLAG_WRITE, &int_cb, NULL) < 0) {
2766 av_log(NULL, AV_LOG_ERROR, "Failed to open sdp file '%s'\n", sdp_filename);
2768 avio_printf(sdp_pb, "SDP:\n%s", sdp);
2769 avio_closep(&sdp_pb);
2770 av_freep(&sdp_filename);
2778 static enum AVPixelFormat get_format(AVCodecContext *s, const enum AVPixelFormat *pix_fmts)
2780 InputStream *ist = s->opaque;
2781 const enum AVPixelFormat *p;
2784 for (p = pix_fmts; *p != AV_PIX_FMT_NONE; p++) {
2785 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(*p);
2786 const AVCodecHWConfig *config = NULL;
2789 if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL))
2792 if (ist->hwaccel_id == HWACCEL_GENERIC ||
2793 ist->hwaccel_id == HWACCEL_AUTO) {
2795 config = avcodec_get_hw_config(s->codec, i);
2798 if (!(config->methods &
2799 AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX))
2801 if (config->pix_fmt == *p)
2806 if (config->device_type != ist->hwaccel_device_type) {
2807 // Different hwaccel offered, ignore.
2811 ret = hwaccel_decode_init(s);
2813 if (ist->hwaccel_id == HWACCEL_GENERIC) {
2814 av_log(NULL, AV_LOG_FATAL,
2815 "%s hwaccel requested for input stream #%d:%d, "
2816 "but cannot be initialized.\n",
2817 av_hwdevice_get_type_name(config->device_type),
2818 ist->file_index, ist->st->index);
2819 return AV_PIX_FMT_NONE;
2824 const HWAccel *hwaccel = NULL;
2826 for (i = 0; hwaccels[i].name; i++) {
2827 if (hwaccels[i].pix_fmt == *p) {
2828 hwaccel = &hwaccels[i];
2833 // No hwaccel supporting this pixfmt.
2836 if (hwaccel->id != ist->hwaccel_id) {
2837 // Does not match requested hwaccel.
2841 ret = hwaccel->init(s);
2843 av_log(NULL, AV_LOG_FATAL,
2844 "%s hwaccel requested for input stream #%d:%d, "
2845 "but cannot be initialized.\n", hwaccel->name,
2846 ist->file_index, ist->st->index);
2847 return AV_PIX_FMT_NONE;
2851 if (ist->hw_frames_ctx) {
2852 s->hw_frames_ctx = av_buffer_ref(ist->hw_frames_ctx);
2853 if (!s->hw_frames_ctx)
2854 return AV_PIX_FMT_NONE;
2857 ist->hwaccel_pix_fmt = *p;
2864 static int get_buffer(AVCodecContext *s, AVFrame *frame, int flags)
2866 InputStream *ist = s->opaque;
2868 if (ist->hwaccel_get_buffer && frame->format == ist->hwaccel_pix_fmt)
2869 return ist->hwaccel_get_buffer(s, frame, flags);
2871 return avcodec_default_get_buffer2(s, frame, flags);
2874 static int init_input_stream(int ist_index, char *error, int error_len)
2877 InputStream *ist = input_streams[ist_index];
2879 if (ist->decoding_needed) {
2880 AVCodec *codec = ist->dec;
2882 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2883 avcodec_get_name(ist->dec_ctx->codec_id), ist->file_index, ist->st->index);
2884 return AVERROR(EINVAL);
2887 ist->dec_ctx->opaque = ist;
2888 ist->dec_ctx->get_format = get_format;
2889 ist->dec_ctx->get_buffer2 = get_buffer;
2890 ist->dec_ctx->thread_safe_callbacks = 1;
2892 av_opt_set_int(ist->dec_ctx, "refcounted_frames", 1, 0);
2893 if (ist->dec_ctx->codec_id == AV_CODEC_ID_DVB_SUBTITLE &&
2894 (ist->decoding_needed & DECODING_FOR_OST)) {
2895 av_dict_set(&ist->decoder_opts, "compute_edt", "1", AV_DICT_DONT_OVERWRITE);
2896 if (ist->decoding_needed & DECODING_FOR_FILTER)
2897 av_log(NULL, AV_LOG_WARNING, "Warning using DVB subtitles for filtering and output at the same time is not fully supported, also see -compute_edt [0|1]\n");
2900 av_dict_set(&ist->decoder_opts, "sub_text_format", "ass", AV_DICT_DONT_OVERWRITE);
2902 /* Useful for subtitles retiming by lavf (FIXME), skipping samples in
2903 * audio, and video decoders such as cuvid or mediacodec */
2904 ist->dec_ctx->pkt_timebase = ist->st->time_base;
2906 if (!av_dict_get(ist->decoder_opts, "threads", NULL, 0))
2907 av_dict_set(&ist->decoder_opts, "threads", "auto", 0);
2908 /* Attached pics are sparse, therefore we would not want to delay their decoding till EOF. */
2909 if (ist->st->disposition & AV_DISPOSITION_ATTACHED_PIC)
2910 av_dict_set(&ist->decoder_opts, "threads", "1", 0);
2912 ret = hw_device_setup_for_decode(ist);
2914 snprintf(error, error_len, "Device setup failed for "
2915 "decoder on input stream #%d:%d : %s",
2916 ist->file_index, ist->st->index, av_err2str(ret));
2920 if ((ret = avcodec_open2(ist->dec_ctx, codec, &ist->decoder_opts)) < 0) {
2921 if (ret == AVERROR_EXPERIMENTAL)
2922 abort_codec_experimental(codec, 0);
2924 snprintf(error, error_len,
2925 "Error while opening decoder for input stream "
2927 ist->file_index, ist->st->index, av_err2str(ret));
2930 assert_avoptions(ist->decoder_opts);
2933 ist->next_pts = AV_NOPTS_VALUE;
2934 ist->next_dts = AV_NOPTS_VALUE;
2939 static InputStream *get_input_stream(OutputStream *ost)
2941 if (ost->source_index >= 0)
2942 return input_streams[ost->source_index];
2946 static int compare_int64(const void *a, const void *b)
2948 return FFDIFFSIGN(*(const int64_t *)a, *(const int64_t *)b);
2951 /* open the muxer when all the streams are initialized */
2952 static int check_init_output_file(OutputFile *of, int file_index)
2956 for (i = 0; i < of->ctx->nb_streams; i++) {
2957 OutputStream *ost = output_streams[of->ost_index + i];
2958 if (!ost->initialized)
2962 of->ctx->interrupt_callback = int_cb;
2964 ret = avformat_write_header(of->ctx, &of->opts);
2966 av_log(NULL, AV_LOG_ERROR,
2967 "Could not write header for output file #%d "
2968 "(incorrect codec parameters ?): %s\n",
2969 file_index, av_err2str(ret));
2972 //assert_avoptions(of->opts);
2973 of->header_written = 1;
2975 av_dump_format(of->ctx, file_index, of->ctx->url, 1);
2977 if (sdp_filename || want_sdp)
2980 /* flush the muxing queues */
2981 for (i = 0; i < of->ctx->nb_streams; i++) {
2982 OutputStream *ost = output_streams[of->ost_index + i];
2984 /* try to improve muxing time_base (only possible if nothing has been written yet) */
2985 if (!av_fifo_size(ost->muxing_queue))
2986 ost->mux_timebase = ost->st->time_base;
2988 while (av_fifo_size(ost->muxing_queue)) {
2990 av_fifo_generic_read(ost->muxing_queue, &pkt, sizeof(pkt), NULL);
2991 write_packet(of, &pkt, ost, 1);
2998 static int init_output_bsfs(OutputStream *ost)
3003 if (!ost->nb_bitstream_filters)
3006 for (i = 0; i < ost->nb_bitstream_filters; i++) {
3007 ctx = ost->bsf_ctx[i];
3009 ret = avcodec_parameters_copy(ctx->par_in,
3010 i ? ost->bsf_ctx[i - 1]->par_out : ost->st->codecpar);
3014 ctx->time_base_in = i ? ost->bsf_ctx[i - 1]->time_base_out : ost->st->time_base;
3016 ret = av_bsf_init(ctx);
3018 av_log(NULL, AV_LOG_ERROR, "Error initializing bitstream filter: %s\n",
3019 ost->bsf_ctx[i]->filter->name);
3024 ctx = ost->bsf_ctx[ost->nb_bitstream_filters - 1];
3025 ret = avcodec_parameters_copy(ost->st->codecpar, ctx->par_out);
3029 ost->st->time_base = ctx->time_base_out;
3034 static int init_output_stream_streamcopy(OutputStream *ost)
3036 OutputFile *of = output_files[ost->file_index];
3037 InputStream *ist = get_input_stream(ost);
3038 AVCodecParameters *par_dst = ost->st->codecpar;
3039 AVCodecParameters *par_src = ost->ref_par;
3042 uint32_t codec_tag = par_dst->codec_tag;
3044 av_assert0(ist && !ost->filter);
3046 ret = avcodec_parameters_to_context(ost->enc_ctx, ist->st->codecpar);
3048 ret = av_opt_set_dict(ost->enc_ctx, &ost->encoder_opts);
3050 av_log(NULL, AV_LOG_FATAL,
3051 "Error setting up codec context options.\n");
3054 avcodec_parameters_from_context(par_src, ost->enc_ctx);
3057 unsigned int codec_tag_tmp;
3058 if (!of->ctx->oformat->codec_tag ||
3059 av_codec_get_id (of->ctx->oformat->codec_tag, par_src->codec_tag) == par_src->codec_id ||
3060 !av_codec_get_tag2(of->ctx->oformat->codec_tag, par_src->codec_id, &codec_tag_tmp))
3061 codec_tag = par_src->codec_tag;
3064 ret = avcodec_parameters_copy(par_dst, par_src);
3068 par_dst->codec_tag = codec_tag;
3070 if (!ost->frame_rate.num)
3071 ost->frame_rate = ist->framerate;
3072 ost->st->avg_frame_rate = ost->frame_rate;
3074 ret = avformat_transfer_internal_stream_timing_info(of->ctx->oformat, ost->st, ist->st, copy_tb);
3078 // copy timebase while removing common factors
3079 if (ost->st->time_base.num <= 0 || ost->st->time_base.den <= 0)
3080 ost->st->time_base = av_add_q(av_stream_get_codec_timebase(ost->st), (AVRational){0, 1});
3082 // copy estimated duration as a hint to the muxer
3083 if (ost->st->duration <= 0 && ist->st->duration > 0)
3084 ost->st->duration = av_rescale_q(ist->st->duration, ist->st->time_base, ost->st->time_base);
3087 ost->st->disposition = ist->st->disposition;
3089 if (ist->st->nb_side_data) {
3090 for (i = 0; i < ist->st->nb_side_data; i++) {
3091 const AVPacketSideData *sd_src = &ist->st->side_data[i];
3094 dst_data = av_stream_new_side_data(ost->st, sd_src->type, sd_src->size);
3096 return AVERROR(ENOMEM);
3097 memcpy(dst_data, sd_src->data, sd_src->size);
3101 if (ost->rotate_overridden) {
3102 uint8_t *sd = av_stream_new_side_data(ost->st, AV_PKT_DATA_DISPLAYMATRIX,
3103 sizeof(int32_t) * 9);
3105 av_display_rotation_set((int32_t *)sd, -ost->rotate_override_value);
3108 switch (par_dst->codec_type) {
3109 case AVMEDIA_TYPE_AUDIO:
3110 if (audio_volume != 256) {
3111 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
3114 if((par_dst->block_align == 1 || par_dst->block_align == 1152 || par_dst->block_align == 576) && par_dst->codec_id == AV_CODEC_ID_MP3)
3115 par_dst->block_align= 0;
3116 if(par_dst->codec_id == AV_CODEC_ID_AC3)
3117 par_dst->block_align= 0;
3119 case AVMEDIA_TYPE_VIDEO:
3120 if (ost->frame_aspect_ratio.num) { // overridden by the -aspect cli option
3122 av_mul_q(ost->frame_aspect_ratio,
3123 (AVRational){ par_dst->height, par_dst->width });
3124 av_log(NULL, AV_LOG_WARNING, "Overriding aspect ratio "
3125 "with stream copy may produce invalid files\n");
3127 else if (ist->st->sample_aspect_ratio.num)
3128 sar = ist->st->sample_aspect_ratio;
3130 sar = par_src->sample_aspect_ratio;
3131 ost->st->sample_aspect_ratio = par_dst->sample_aspect_ratio = sar;
3132 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
3133 ost->st->r_frame_rate = ist->st->r_frame_rate;
3137 ost->mux_timebase = ist->st->time_base;
3142 static void set_encoder_id(OutputFile *of, OutputStream *ost)
3144 AVDictionaryEntry *e;
3146 uint8_t *encoder_string;
3147 int encoder_string_len;
3148 int format_flags = 0;
3149 int codec_flags = ost->enc_ctx->flags;
3151 if (av_dict_get(ost->st->metadata, "encoder", NULL, 0))
3154 e = av_dict_get(of->opts, "fflags", NULL, 0);
3156 const AVOption *o = av_opt_find(of->ctx, "fflags", NULL, 0, 0);
3159 av_opt_eval_flags(of->ctx, o, e->value, &format_flags);
3161 e = av_dict_get(ost->encoder_opts, "flags", NULL, 0);
3163 const AVOption *o = av_opt_find(ost->enc_ctx, "flags", NULL, 0, 0);
3166 av_opt_eval_flags(ost->enc_ctx, o, e->value, &codec_flags);
3169 encoder_string_len = sizeof(LIBAVCODEC_IDENT) + strlen(ost->enc->name) + 2;
3170 encoder_string = av_mallocz(encoder_string_len);
3171 if (!encoder_string)
3174 if (!(format_flags & AVFMT_FLAG_BITEXACT) && !(codec_flags & AV_CODEC_FLAG_BITEXACT))
3175 av_strlcpy(encoder_string, LIBAVCODEC_IDENT " ", encoder_string_len);
3177 av_strlcpy(encoder_string, "Lavc ", encoder_string_len);
3178 av_strlcat(encoder_string, ost->enc->name, encoder_string_len);
3179 av_dict_set(&ost->st->metadata, "encoder", encoder_string,
3180 AV_DICT_DONT_STRDUP_VAL | AV_DICT_DONT_OVERWRITE);
3183 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3184 AVCodecContext *avctx)
3187 int n = 1, i, size, index = 0;
3190 for (p = kf; *p; p++)
3194 pts = av_malloc_array(size, sizeof(*pts));
3196 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3201 for (i = 0; i < n; i++) {
3202 char *next = strchr(p, ',');
3207 if (!memcmp(p, "chapters", 8)) {
3209 AVFormatContext *avf = output_files[ost->file_index]->ctx;
3212 if (avf->nb_chapters > INT_MAX - size ||
3213 !(pts = av_realloc_f(pts, size += avf->nb_chapters - 1,
3215 av_log(NULL, AV_LOG_FATAL,
3216 "Could not allocate forced key frames array.\n");
3219 t = p[8] ? parse_time_or_die("force_key_frames", p + 8, 1) : 0;
3220 t = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3222 for (j = 0; j < avf->nb_chapters; j++) {
3223 AVChapter *c = avf->chapters[j];
3224 av_assert1(index < size);
3225 pts[index++] = av_rescale_q(c->start, c->time_base,
3226 avctx->time_base) + t;
3231 t = parse_time_or_die("force_key_frames", p, 1);
3232 av_assert1(index < size);
3233 pts[index++] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3240 av_assert0(index == size);
3241 qsort(pts, size, sizeof(*pts), compare_int64);
3242 ost->forced_kf_count = size;
3243 ost->forced_kf_pts = pts;
3246 static void init_encoder_time_base(OutputStream *ost, AVRational default_time_base)
3248 InputStream *ist = get_input_stream(ost);
3249 AVCodecContext *enc_ctx = ost->enc_ctx;
3250 AVFormatContext *oc;
3252 if (ost->enc_timebase.num > 0) {
3253 enc_ctx->time_base = ost->enc_timebase;
3257 if (ost->enc_timebase.num < 0) {
3259 enc_ctx->time_base = ist->st->time_base;
3263 oc = output_files[ost->file_index]->ctx;
3264 av_log(oc, AV_LOG_WARNING, "Input stream data not available, using default time base\n");
3267 enc_ctx->time_base = default_time_base;
3270 static int init_output_stream_encode(OutputStream *ost)
3272 InputStream *ist = get_input_stream(ost);
3273 AVCodecContext *enc_ctx = ost->enc_ctx;
3274 AVCodecContext *dec_ctx = NULL;
3275 AVFormatContext *oc = output_files[ost->file_index]->ctx;
3278 set_encoder_id(output_files[ost->file_index], ost);
3280 // Muxers use AV_PKT_DATA_DISPLAYMATRIX to signal rotation. On the other
3281 // hand, the legacy API makes demuxers set "rotate" metadata entries,
3282 // which have to be filtered out to prevent leaking them to output files.
3283 av_dict_set(&ost->st->metadata, "rotate", NULL, 0);
3286 ost->st->disposition = ist->st->disposition;
3288 dec_ctx = ist->dec_ctx;
3290 enc_ctx->chroma_sample_location = dec_ctx->chroma_sample_location;
3292 for (j = 0; j < oc->nb_streams; j++) {
3293 AVStream *st = oc->streams[j];
3294 if (st != ost->st && st->codecpar->codec_type == ost->st->codecpar->codec_type)
3297 if (j == oc->nb_streams)
3298 if (ost->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO ||
3299 ost->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
3300 ost->st->disposition = AV_DISPOSITION_DEFAULT;
3303 if (enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO) {
3304 if (!ost->frame_rate.num)
3305 ost->frame_rate = av_buffersink_get_frame_rate(ost->filter->filter);
3306 if (ist && !ost->frame_rate.num)
3307 ost->frame_rate = ist->framerate;
3308 if (ist && !ost->frame_rate.num)
3309 ost->frame_rate = ist->st->r_frame_rate;
3310 if (ist && !ost->frame_rate.num) {
3311 ost->frame_rate = (AVRational){25, 1};
3312 av_log(NULL, AV_LOG_WARNING,
3314 "about the input framerate is available. Falling "
3315 "back to a default value of 25fps for output stream #%d:%d. Use the -r option "
3316 "if you want a different framerate.\n",
3317 ost->file_index, ost->index);
3319 // ost->frame_rate = ist->st->avg_frame_rate.num ? ist->st->avg_frame_rate : (AVRational){25, 1};
3320 if (ost->enc->supported_framerates && !ost->force_fps) {
3321 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
3322 ost->frame_rate = ost->enc->supported_framerates[idx];
3324 // reduce frame rate for mpeg4 to be within the spec limits
3325 if (enc_ctx->codec_id == AV_CODEC_ID_MPEG4) {
3326 av_reduce(&ost->frame_rate.num, &ost->frame_rate.den,
3327 ost->frame_rate.num, ost->frame_rate.den, 65535);
3331 switch (enc_ctx->codec_type) {
3332 case AVMEDIA_TYPE_AUDIO:
3333 enc_ctx->sample_fmt = av_buffersink_get_format(ost->filter->filter);
3335 enc_ctx->bits_per_raw_sample = FFMIN(dec_ctx->bits_per_raw_sample,
3336 av_get_bytes_per_sample(enc_ctx->sample_fmt) << 3);
3337 enc_ctx->sample_rate = av_buffersink_get_sample_rate(ost->filter->filter);
3338 enc_ctx->channel_layout = av_buffersink_get_channel_layout(ost->filter->filter);
3339 enc_ctx->channels = av_buffersink_get_channels(ost->filter->filter);
3341 init_encoder_time_base(ost, av_make_q(1, enc_ctx->sample_rate));
3344 case AVMEDIA_TYPE_VIDEO:
3345 init_encoder_time_base(ost, av_inv_q(ost->frame_rate));
3347 if (!(enc_ctx->time_base.num && enc_ctx->time_base.den))
3348 enc_ctx->time_base = av_buffersink_get_time_base(ost->filter->filter);
3349 if ( av_q2d(enc_ctx->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
3350 && (video_sync_method == VSYNC_CFR || video_sync_method == VSYNC_VSCFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
3351 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not efficiently supporting it.\n"
3352 "Please consider specifying a lower framerate, a different muxer or -vsync 2\n");
3354 for (j = 0; j < ost->forced_kf_count; j++)
3355 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
3357 enc_ctx->time_base);
3359 enc_ctx->width = av_buffersink_get_w(ost->filter->filter);
3360 enc_ctx->height = av_buffersink_get_h(ost->filter->filter);
3361 enc_ctx->sample_aspect_ratio = ost->st->sample_aspect_ratio =
3362 ost->frame_aspect_ratio.num ? // overridden by the -aspect cli option
3363 av_mul_q(ost->frame_aspect_ratio, (AVRational){ enc_ctx->height, enc_ctx->width }) :
3364 av_buffersink_get_sample_aspect_ratio(ost->filter->filter);
3366 enc_ctx->pix_fmt = av_buffersink_get_format(ost->filter->filter);
3368 enc_ctx->bits_per_raw_sample = FFMIN(dec_ctx->bits_per_raw_sample,
3369 av_pix_fmt_desc_get(enc_ctx->pix_fmt)->comp[0].depth);
3371 enc_ctx->framerate = ost->frame_rate;
3373 ost->st->avg_frame_rate = ost->frame_rate;
3376 enc_ctx->width != dec_ctx->width ||
3377 enc_ctx->height != dec_ctx->height ||
3378 enc_ctx->pix_fmt != dec_ctx->pix_fmt) {
3379 enc_ctx->bits_per_raw_sample = frame_bits_per_raw_sample;
3382 if (ost->forced_keyframes) {
3383 if (!strncmp(ost->forced_keyframes, "expr:", 5)) {
3384 ret = av_expr_parse(&ost->forced_keyframes_pexpr, ost->forced_keyframes+5,
3385 forced_keyframes_const_names, NULL, NULL, NULL, NULL, 0, NULL);
3387 av_log(NULL, AV_LOG_ERROR,
3388 "Invalid force_key_frames expression '%s'\n", ost->forced_keyframes+5);
3391 ost->forced_keyframes_expr_const_values[FKF_N] = 0;
3392 ost->forced_keyframes_expr_const_values[FKF_N_FORCED] = 0;
3393 ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_N] = NAN;
3394 ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_T] = NAN;
3396 // Don't parse the 'forced_keyframes' in case of 'keep-source-keyframes',
3397 // parse it only for static kf timings
3398 } else if(strncmp(ost->forced_keyframes, "source", 6)) {
3399 parse_forced_key_frames(ost->forced_keyframes, ost, ost->enc_ctx);
3403 case AVMEDIA_TYPE_SUBTITLE:
3404 enc_ctx->time_base = AV_TIME_BASE_Q;
3405 if (!enc_ctx->width) {
3406 enc_ctx->width = input_streams[ost->source_index]->st->codecpar->width;
3407 enc_ctx->height = input_streams[ost->source_index]->st->codecpar->height;
3410 case AVMEDIA_TYPE_DATA:
3417 ost->mux_timebase = enc_ctx->time_base;
3422 static int init_output_stream(OutputStream *ost, char *error, int error_len)
3426 if (ost->encoding_needed) {
3427 AVCodec *codec = ost->enc;
3428 AVCodecContext *dec = NULL;
3431 ret = init_output_stream_encode(ost);
3435 if ((ist = get_input_stream(ost)))
3437 if (dec && dec->subtitle_header) {
3438 /* ASS code assumes this buffer is null terminated so add extra byte. */
3439 ost->enc_ctx->subtitle_header = av_mallocz(dec->subtitle_header_size + 1);
3440 if (!ost->enc_ctx->subtitle_header)
3441 return AVERROR(ENOMEM);
3442 memcpy(ost->enc_ctx->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
3443 ost->enc_ctx->subtitle_header_size = dec->subtitle_header_size;
3445 if (!av_dict_get(ost->encoder_opts, "threads", NULL, 0))
3446 av_dict_set(&ost->encoder_opts, "threads", "auto", 0);
3447 if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
3449 !av_dict_get(ost->encoder_opts, "b", NULL, 0) &&
3450 !av_dict_get(ost->encoder_opts, "ab", NULL, 0))
3451 av_dict_set(&ost->encoder_opts, "b", "128000", 0);
3453 if (ost->filter && av_buffersink_get_hw_frames_ctx(ost->filter->filter) &&
3454 ((AVHWFramesContext*)av_buffersink_get_hw_frames_ctx(ost->filter->filter)->data)->format ==
3455 av_buffersink_get_format(ost->filter->filter)) {
3456 ost->enc_ctx->hw_frames_ctx = av_buffer_ref(av_buffersink_get_hw_frames_ctx(ost->filter->filter));
3457 if (!ost->enc_ctx->hw_frames_ctx)
3458 return AVERROR(ENOMEM);
3460 ret = hw_device_setup_for_encode(ost);
3462 snprintf(error, error_len, "Device setup failed for "
3463 "encoder on output stream #%d:%d : %s",
3464 ost->file_index, ost->index, av_err2str(ret));
3469 if ((ret = avcodec_open2(ost->enc_ctx, codec, &ost->encoder_opts)) < 0) {
3470 if (ret == AVERROR_EXPERIMENTAL)
3471 abort_codec_experimental(codec, 1);
3472 snprintf(error, error_len,
3473 "Error while opening encoder for output stream #%d:%d - "
3474 "maybe incorrect parameters such as bit_rate, rate, width or height",
3475 ost->file_index, ost->index);
3478 if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
3479 !(ost->enc->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE))
3480 av_buffersink_set_frame_size(ost->filter->filter,
3481 ost->enc_ctx->frame_size);
3482 assert_avoptions(ost->encoder_opts);
3483 if (ost->enc_ctx->bit_rate && ost->enc_ctx->bit_rate < 1000 &&
3484 ost->enc_ctx->codec_id != AV_CODEC_ID_CODEC2 /* don't complain about 700 bit/s modes */)
3485 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
3486 " It takes bits/s as argument, not kbits/s\n");
3488 ret = avcodec_parameters_from_context(ost->st->codecpar, ost->enc_ctx);
3490 av_log(NULL, AV_LOG_FATAL,
3491 "Error initializing the output stream codec context.\n");
3495 * FIXME: ost->st->codec should't be needed here anymore.
3497 ret = avcodec_copy_context(ost->st->codec, ost->enc_ctx);
3501 if (ost->enc_ctx->nb_coded_side_data) {
3504 for (i = 0; i < ost->enc_ctx->nb_coded_side_data; i++) {
3505 const AVPacketSideData *sd_src = &ost->enc_ctx->coded_side_data[i];
3508 dst_data = av_stream_new_side_data(ost->st, sd_src->type, sd_src->size);
3510 return AVERROR(ENOMEM);
3511 memcpy(dst_data, sd_src->data, sd_src->size);
3516 * Add global input side data. For now this is naive, and copies it
3517 * from the input stream's global side data. All side data should
3518 * really be funneled over AVFrame and libavfilter, then added back to
3519 * packet side data, and then potentially using the first packet for
3524 for (i = 0; i < ist->st->nb_side_data; i++) {
3525 AVPacketSideData *sd = &ist->st->side_data[i];
3526 uint8_t *dst = av_stream_new_side_data(ost->st, sd->type, sd->size);
3528 return AVERROR(ENOMEM);
3529 memcpy(dst, sd->data, sd->size);
3530 if (ist->autorotate && sd->type == AV_PKT_DATA_DISPLAYMATRIX)
3531 av_display_rotation_set((uint32_t *)dst, 0);
3535 // copy timebase while removing common factors
3536 if (ost->st->time_base.num <= 0 || ost->st->time_base.den <= 0)
3537 ost->st->time_base = av_add_q(ost->enc_ctx->time_base, (AVRational){0, 1});
3539 // copy estimated duration as a hint to the muxer
3540 if (ost->st->duration <= 0 && ist && ist->st->duration > 0)
3541 ost->st->duration = av_rescale_q(ist->st->duration, ist->st->time_base, ost->st->time_base);
3543 ost->st->codec->codec= ost->enc_ctx->codec;
3544 } else if (ost->stream_copy) {
3545 ret = init_output_stream_streamcopy(ost);
3550 // parse user provided disposition, and update stream values
3551 if (ost->disposition) {
3552 static const AVOption opts[] = {
3553 { "disposition" , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX, .unit = "flags" },
3554 { "default" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DEFAULT }, .unit = "flags" },
3555 { "dub" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DUB }, .unit = "flags" },
3556 { "original" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_ORIGINAL }, .unit = "flags" },
3557 { "comment" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_COMMENT }, .unit = "flags" },
3558 { "lyrics" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_LYRICS }, .unit = "flags" },
3559 { "karaoke" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_KARAOKE }, .unit = "flags" },
3560 { "forced" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_FORCED }, .unit = "flags" },
3561 { "hearing_impaired" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_HEARING_IMPAIRED }, .unit = "flags" },
3562 { "visual_impaired" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_VISUAL_IMPAIRED }, .unit = "flags" },
3563 { "clean_effects" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_CLEAN_EFFECTS }, .unit = "flags" },
3564 { "captions" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_CAPTIONS }, .unit = "flags" },
3565 { "descriptions" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DESCRIPTIONS }, .unit = "flags" },
3566 { "dependent" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_DEPENDENT }, .unit = "flags" },
3567 { "metadata" , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = AV_DISPOSITION_METADATA }, .unit = "flags" },
3570 static const AVClass class = {
3572 .item_name = av_default_item_name,
3574 .version = LIBAVUTIL_VERSION_INT,
3576 const AVClass *pclass = &class;
3578 ret = av_opt_eval_flags(&pclass, &opts[0], ost->disposition, &ost->st->disposition);
3583 /* initialize bitstream filters for the output stream
3584 * needs to be done here, because the codec id for streamcopy is not
3585 * known until now */
3586 ret = init_output_bsfs(ost);
3590 ost->initialized = 1;
3592 ret = check_init_output_file(output_files[ost->file_index], ost->file_index);
3599 static void report_new_stream(int input_index, AVPacket *pkt)
3601 InputFile *file = input_files[input_index];
3602 AVStream *st = file->ctx->streams[pkt->stream_index];
3604 if (pkt->stream_index < file->nb_streams_warn)
3606 av_log(file->ctx, AV_LOG_WARNING,
3607 "New %s stream %d:%d at pos:%"PRId64" and DTS:%ss\n",
3608 av_get_media_type_string(st->codecpar->codec_type),
3609 input_index, pkt->stream_index,
3610 pkt->pos, av_ts2timestr(pkt->dts, &st->time_base));
3611 file->nb_streams_warn = pkt->stream_index + 1;
3614 static int transcode_init(void)
3616 int ret = 0, i, j, k;
3617 AVFormatContext *oc;
3620 char error[1024] = {0};
3622 for (i = 0; i < nb_filtergraphs; i++) {
3623 FilterGraph *fg = filtergraphs[i];
3624 for (j = 0; j < fg->nb_outputs; j++) {
3625 OutputFilter *ofilter = fg->outputs[j];
3626 if (!ofilter->ost || ofilter->ost->source_index >= 0)
3628 if (fg->nb_inputs != 1)
3630 for (k = nb_input_streams-1; k >= 0 ; k--)
3631 if (fg->inputs[0]->ist == input_streams[k])
3633 ofilter->ost->source_index = k;
3637 /* init framerate emulation */
3638 for (i = 0; i < nb_input_files; i++) {
3639 InputFile *ifile = input_files[i];
3640 if (ifile->rate_emu)
3641 for (j = 0; j < ifile->nb_streams; j++)
3642 input_streams[j + ifile->ist_index]->start = av_gettime_relative();
3645 /* init input streams */
3646 for (i = 0; i < nb_input_streams; i++)
3647 if ((ret = init_input_stream(i, error, sizeof(error))) < 0) {
3648 for (i = 0; i < nb_output_streams; i++) {
3649 ost = output_streams[i];
3650 avcodec_close(ost->enc_ctx);
3655 /* open each encoder */
3656 for (i = 0; i < nb_output_streams; i++) {
3657 // skip streams fed from filtergraphs until we have a frame for them
3658 if (output_streams[i]->filter)
3661 ret = init_output_stream(output_streams[i], error, sizeof(error));
3666 /* discard unused programs */
3667 for (i = 0; i < nb_input_files; i++) {
3668 InputFile *ifile = input_files[i];
3669 for (j = 0; j < ifile->ctx->nb_programs; j++) {
3670 AVProgram *p = ifile->ctx->programs[j];
3671 int discard = AVDISCARD_ALL;
3673 for (k = 0; k < p->nb_stream_indexes; k++)
3674 if (!input_streams[ifile->ist_index + p->stream_index[k]]->discard) {
3675 discard = AVDISCARD_DEFAULT;
3678 p->discard = discard;
3682 /* write headers for files with no streams */
3683 for (i = 0; i < nb_output_files; i++) {
3684 oc = output_files[i]->ctx;
3685 if (oc->oformat->flags & AVFMT_NOSTREAMS && oc->nb_streams == 0) {
3686 ret = check_init_output_file(output_files[i], i);
3693 /* dump the stream mapping */
3694 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
3695 for (i = 0; i < nb_input_streams; i++) {
3696 ist = input_streams[i];
3698 for (j = 0; j < ist->nb_filters; j++) {
3699 if (!filtergraph_is_simple(ist->filters[j]->graph)) {
3700 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d (%s) -> %s",
3701 ist->file_index, ist->st->index, ist->dec ? ist->dec->name : "?",
3702 ist->filters[j]->name);
3703 if (nb_filtergraphs > 1)
3704 av_log(NULL, AV_LOG_INFO, " (graph %d)", ist->filters[j]->graph->index);
3705 av_log(NULL, AV_LOG_INFO, "\n");
3710 for (i = 0; i < nb_output_streams; i++) {
3711 ost = output_streams[i];
3713 if (ost->attachment_filename) {
3714 /* an attached file */
3715 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
3716 ost->attachment_filename, ost->file_index, ost->index);
3720 if (ost->filter && !filtergraph_is_simple(ost->filter->graph)) {
3721 /* output from a complex graph */
3722 av_log(NULL, AV_LOG_INFO, " %s", ost->filter->name);
3723 if (nb_filtergraphs > 1)
3724 av_log(NULL, AV_LOG_INFO, " (graph %d)", ost->filter->graph->index);
3726 av_log(NULL, AV_LOG_INFO, " -> Stream #%d:%d (%s)\n", ost->file_index,
3727 ost->index, ost->enc ? ost->enc->name : "?");
3731 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
3732 input_streams[ost->source_index]->file_index,
3733 input_streams[ost->source_index]->st->index,
3736 if (ost->sync_ist != input_streams[ost->source_index])
3737 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
3738 ost->sync_ist->file_index,
3739 ost->sync_ist->st->index);
3740 if (ost->stream_copy)
3741 av_log(NULL, AV_LOG_INFO, " (copy)");
3743 const AVCodec *in_codec = input_streams[ost->source_index]->dec;
3744 const AVCodec *out_codec = ost->enc;
3745 const char *decoder_name = "?";
3746 const char *in_codec_name = "?";
3747 const char *encoder_name = "?";
3748 const char *out_codec_name = "?";
3749 const AVCodecDescriptor *desc;
3752 decoder_name = in_codec->name;
3753 desc = avcodec_descriptor_get(in_codec->id);
3755 in_codec_name = desc->name;
3756 if (!strcmp(decoder_name, in_codec_name))
3757 decoder_name = "native";
3761 encoder_name = out_codec->name;
3762 desc = avcodec_descriptor_get(out_codec->id);
3764 out_codec_name = desc->name;
3765 if (!strcmp(encoder_name, out_codec_name))
3766 encoder_name = "native";
3769 av_log(NULL, AV_LOG_INFO, " (%s (%s) -> %s (%s))",
3770 in_codec_name, decoder_name,
3771 out_codec_name, encoder_name);
3773 av_log(NULL, AV_LOG_INFO, "\n");
3777 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
3781 atomic_store(&transcode_init_done, 1);
3786 /* Return 1 if there remain streams where more output is wanted, 0 otherwise. */
3787 static int need_output(void)
3791 for (i = 0; i < nb_output_streams; i++) {
3792 OutputStream *ost = output_streams[i];
3793 OutputFile *of = output_files[ost->file_index];
3794 AVFormatContext *os = output_files[ost->file_index]->ctx;
3796 if (ost->finished ||
3797 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
3799 if (ost->frame_number >= ost->max_frames) {
3801 for (j = 0; j < of->ctx->nb_streams; j++)
3802 close_output_stream(output_streams[of->ost_index + j]);
3813 * Select the output stream to process.
3815 * @return selected output stream, or NULL if none available
3817 static OutputStream *choose_output(void)
3820 int64_t opts_min = INT64_MAX;
3821 OutputStream *ost_min = NULL;
3823 for (i = 0; i < nb_output_streams; i++) {
3824 OutputStream *ost = output_streams[i];
3825 int64_t opts = ost->st->cur_dts == AV_NOPTS_VALUE ? INT64_MIN :
3826 av_rescale_q(ost->st->cur_dts, ost->st->time_base,
3828 if (ost->st->cur_dts == AV_NOPTS_VALUE)
3829 av_log(NULL, AV_LOG_DEBUG, "cur_dts is invalid (this is harmless if it occurs once at the start per stream)\n");
3831 if (!ost->initialized && !ost->inputs_done)
3834 if (!ost->finished && opts < opts_min) {
3836 ost_min = ost->unavailable ? NULL : ost;
3842 static void set_tty_echo(int on)
3846 if (tcgetattr(0, &tty) == 0) {
3847 if (on) tty.c_lflag |= ECHO;
3848 else tty.c_lflag &= ~ECHO;
3849 tcsetattr(0, TCSANOW, &tty);
3854 static int check_keyboard_interaction(int64_t cur_time)
3857 static int64_t last_time;
3858 if (received_nb_signals)
3859 return AVERROR_EXIT;
3860 /* read_key() returns 0 on EOF */
3861 if(cur_time - last_time >= 100000 && !run_as_daemon){
3863 last_time = cur_time;
3867 return AVERROR_EXIT;
3868 if (key == '+') av_log_set_level(av_log_get_level()+10);
3869 if (key == '-') av_log_set_level(av_log_get_level()-10);
3870 if (key == 's') qp_hist ^= 1;
3873 do_hex_dump = do_pkt_dump = 0;
3874 } else if(do_pkt_dump){
3878 av_log_set_level(AV_LOG_DEBUG);
3880 if (key == 'c' || key == 'C'){
3881 char buf[4096], target[64], command[256], arg[256] = {0};
3884 fprintf(stderr, "\nEnter command: <target>|all <time>|-1 <command>[ <argument>]\n");
3887 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
3892 fprintf(stderr, "\n");
3894 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
3895 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
3896 target, time, command, arg);
3897 for (i = 0; i < nb_filtergraphs; i++) {
3898 FilterGraph *fg = filtergraphs[i];
3901 ret = avfilter_graph_send_command(fg->graph, target, command, arg, buf, sizeof(buf),
3902 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
3903 fprintf(stderr, "Command reply for stream %d: ret:%d res:\n%s", i, ret, buf);
3904 } else if (key == 'c') {
3905 fprintf(stderr, "Queuing commands only on filters supporting the specific command is unsupported\n");
3906 ret = AVERROR_PATCHWELCOME;
3908 ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time);
3910 fprintf(stderr, "Queuing command failed with error %s\n", av_err2str(ret));
3915 av_log(NULL, AV_LOG_ERROR,
3916 "Parse error, at least 3 arguments were expected, "
3917 "only %d given in string '%s'\n", n, buf);
3920 if (key == 'd' || key == 'D'){
3923 debug = input_streams[0]->st->codec->debug<<1;
3924 if(!debug) debug = 1;
3925 while(debug & (FF_DEBUG_DCT_COEFF
3927 |FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE
3929 )) //unsupported, would just crash
3936 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
3941 fprintf(stderr, "\n");
3942 if (k <= 0 || sscanf(buf, "%d", &debug)!=1)
3943 fprintf(stderr,"error parsing debug value\n");
3945 for(i=0;i<nb_input_streams;i++) {
3946 input_streams[i]->st->codec->debug = debug;
3948 for(i=0;i<nb_output_streams;i++) {
3949 OutputStream *ost = output_streams[i];
3950 ost->enc_ctx->debug = debug;
3952 if(debug) av_log_set_level(AV_LOG_DEBUG);
3953 fprintf(stderr,"debug=%d\n", debug);
3956 fprintf(stderr, "key function\n"
3957 "? show this help\n"
3958 "+ increase verbosity\n"
3959 "- decrease verbosity\n"
3960 "c Send command to first matching filter supporting it\n"
3961 "C Send/Queue command to all matching filters\n"
3962 "D cycle through available debug modes\n"
3963 "h dump packets/hex press to cycle through the 3 states\n"
3965 "s Show QP histogram\n"
3972 static void *input_thread(void *arg)
3975 unsigned flags = f->non_blocking ? AV_THREAD_MESSAGE_NONBLOCK : 0;
3980 ret = av_read_frame(f->ctx, &pkt);
3982 if (ret == AVERROR(EAGAIN)) {
3987 av_thread_message_queue_set_err_recv(f->in_thread_queue, ret);
3990 ret = av_thread_message_queue_send(f->in_thread_queue, &pkt, flags);
3991 if (flags && ret == AVERROR(EAGAIN)) {
3993 ret = av_thread_message_queue_send(f->in_thread_queue, &pkt, flags);
3994 av_log(f->ctx, AV_LOG_WARNING,
3995 "Thread message queue blocking; consider raising the "
3996 "thread_queue_size option (current value: %d)\n",
3997 f->thread_queue_size);
4000 if (ret != AVERROR_EOF)
4001 av_log(f->ctx, AV_LOG_ERROR,
4002 "Unable to send packet to main thread: %s\n",
4004 av_packet_unref(&pkt);
4005 av_thread_message_queue_set_err_recv(f->in_thread_queue, ret);
4013 static void free_input_threads(void)
4017 for (i = 0; i < nb_input_files; i++) {
4018 InputFile *f = input_files[i];
4021 if (!f || !f->in_thread_queue)
4023 av_thread_message_queue_set_err_send(f->in_thread_queue, AVERROR_EOF);
4024 while (av_thread_message_queue_recv(f->in_thread_queue, &pkt, 0) >= 0)
4025 av_packet_unref(&pkt);
4027 pthread_join(f->thread, NULL);
4029 av_thread_message_queue_free(&f->in_thread_queue);
4033 static int init_input_threads(void)
4037 if (nb_input_files == 1)
4040 for (i = 0; i < nb_input_files; i++) {
4041 InputFile *f = input_files[i];
4043 if (f->ctx->pb ? !f->ctx->pb->seekable :
4044 strcmp(f->ctx->iformat->name, "lavfi"))
4045 f->non_blocking = 1;
4046 ret = av_thread_message_queue_alloc(&f->in_thread_queue,
4047 f->thread_queue_size, sizeof(AVPacket));
4051 if ((ret = pthread_create(&f->thread, NULL, input_thread, f))) {
4052 av_log(NULL, AV_LOG_ERROR, "pthread_create failed: %s. Try to increase `ulimit -v` or decrease `ulimit -s`.\n", strerror(ret));
4053 av_thread_message_queue_free(&f->in_thread_queue);
4054 return AVERROR(ret);
4060 static int get_input_packet_mt(InputFile *f, AVPacket *pkt)
4062 return av_thread_message_queue_recv(f->in_thread_queue, pkt,
4064 AV_THREAD_MESSAGE_NONBLOCK : 0);
4068 static int get_input_packet(InputFile *f, AVPacket *pkt)
4072 for (i = 0; i < f->nb_streams; i++) {
4073 InputStream *ist = input_streams[f->ist_index + i];
4074 int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
4075 int64_t now = av_gettime_relative() - ist->start;
4077 return AVERROR(EAGAIN);
4082 if (nb_input_files > 1)
4083 return get_input_packet_mt(f, pkt);
4085 return av_read_frame(f->ctx, pkt);
4088 static int got_eagain(void)
4091 for (i = 0; i < nb_output_streams; i++)
4092 if (output_streams[i]->unavailable)
4097 static void reset_eagain(void)
4100 for (i = 0; i < nb_input_files; i++)
4101 input_files[i]->eagain = 0;
4102 for (i = 0; i < nb_output_streams; i++)
4103 output_streams[i]->unavailable = 0;
4106 // set duration to max(tmp, duration) in a proper time base and return duration's time_base
4107 static AVRational duration_max(int64_t tmp, int64_t *duration, AVRational tmp_time_base,
4108 AVRational time_base)
4114 return tmp_time_base;
4117 ret = av_compare_ts(*duration, time_base, tmp, tmp_time_base);
4120 return tmp_time_base;
4126 static int seek_to_start(InputFile *ifile, AVFormatContext *is)
4129 AVCodecContext *avctx;
4130 int i, ret, has_audio = 0;
4131 int64_t duration = 0;
4133 ret = av_seek_frame(is, -1, is->start_time, 0);
4137 for (i = 0; i < ifile->nb_streams; i++) {
4138 ist = input_streams[ifile->ist_index + i];
4139 avctx = ist->dec_ctx;
4141 /* duration is the length of the last frame in a stream
4142 * when audio stream is present we don't care about
4143 * last video frame length because it's not defined exactly */
4144 if (avctx->codec_type == AVMEDIA_TYPE_AUDIO && ist->nb_samples)
4148 for (i = 0; i < ifile->nb_streams; i++) {
4149 ist = input_streams[ifile->ist_index + i];
4150 avctx = ist->dec_ctx;
4153 if (avctx->codec_type == AVMEDIA_TYPE_AUDIO && ist->nb_samples) {
4154 AVRational sample_rate = {1, avctx->sample_rate};
4156 duration = av_rescale_q(ist->nb_samples, sample_rate, ist->st->time_base);
4161 if (ist->framerate.num) {
4162 duration = av_rescale_q(1, av_inv_q(ist->framerate), ist->st->time_base);
4163 } else if (ist->st->avg_frame_rate.num) {
4164 duration = av_rescale_q(1, av_inv_q(ist->st->avg_frame_rate), ist->st->time_base);
4169 if (!ifile->duration)
4170 ifile->time_base = ist->st->time_base;
4171 /* the total duration of the stream, max_pts - min_pts is
4172 * the duration of the stream without the last frame */
4173 duration += ist->max_pts - ist->min_pts;
4174 ifile->time_base = duration_max(duration, &ifile->duration, ist->st->time_base,
4178 if (ifile->loop > 0)
4186 * - 0 -- one packet was read and processed
4187 * - AVERROR(EAGAIN) -- no packets were available for selected file,
4188 * this function should be called again
4189 * - AVERROR_EOF -- this function should not be called again
4191 static int process_input(int file_index)
4193 InputFile *ifile = input_files[file_index];
4194 AVFormatContext *is;
4202 ret = get_input_packet(ifile, &pkt);
4204 if (ret == AVERROR(EAGAIN)) {
4208 if (ret < 0 && ifile->loop) {
4209 AVCodecContext *avctx;
4210 for (i = 0; i < ifile->nb_streams; i++) {
4211 ist = input_streams[ifile->ist_index + i];
4212 avctx = ist->dec_ctx;
4213 if (ist->decoding_needed) {
4214 ret = process_input_packet(ist, NULL, 1);
4217 avcodec_flush_buffers(avctx);
4220 ret = seek_to_start(ifile, is);
4222 av_log(NULL, AV_LOG_WARNING, "Seek to start failed.\n");
4224 ret = get_input_packet(ifile, &pkt);
4225 if (ret == AVERROR(EAGAIN)) {
4231 if (ret != AVERROR_EOF) {
4232 print_error(is->url, ret);
4237 for (i = 0; i < ifile->nb_streams; i++) {
4238 ist = input_streams[ifile->ist_index + i];
4239 if (ist->decoding_needed) {
4240 ret = process_input_packet(ist, NULL, 0);
4245 /* mark all outputs that don't go through lavfi as finished */
4246 for (j = 0; j < nb_output_streams; j++) {
4247 OutputStream *ost = output_streams[j];
4249 if (ost->source_index == ifile->ist_index + i &&
4250 (ost->stream_copy || ost->enc->type == AVMEDIA_TYPE_SUBTITLE))
4251 finish_output_stream(ost);
4255 ifile->eof_reached = 1;
4256 return AVERROR(EAGAIN);
4262 av_pkt_dump_log2(NULL, AV_LOG_INFO, &pkt, do_hex_dump,
4263 is->streams[pkt.stream_index]);
4265 /* the following test is needed in case new streams appear
4266 dynamically in stream : we ignore them */
4267 if (pkt.stream_index >= ifile->nb_streams) {
4268 report_new_stream(file_index, &pkt);
4269 goto discard_packet;
4272 ist = input_streams[ifile->ist_index + pkt.stream_index];
4274 ist->data_size += pkt.size;
4278 goto discard_packet;
4280 if (exit_on_error && (pkt.flags & AV_PKT_FLAG_CORRUPT)) {
4281 av_log(NULL, AV_LOG_FATAL, "%s: corrupt input packet in stream %d\n", is->url, pkt.stream_index);
4286 av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s "
4287 "next_dts:%s next_dts_time:%s next_pts:%s next_pts_time:%s pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s off:%s off_time:%s\n",
4288 ifile->ist_index + pkt.stream_index, av_get_media_type_string(ist->dec_ctx->codec_type),
4289 av_ts2str(ist->next_dts), av_ts2timestr(ist->next_dts, &AV_TIME_BASE_Q),
4290 av_ts2str(ist->next_pts), av_ts2timestr(ist->next_pts, &AV_TIME_BASE_Q),
4291 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base),
4292 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base),
4293 av_ts2str(input_files[ist->file_index]->ts_offset),
4294 av_ts2timestr(input_files[ist->file_index]->ts_offset, &AV_TIME_BASE_Q));
4297 if(!ist->wrap_correction_done && is->start_time != AV_NOPTS_VALUE && ist->st->pts_wrap_bits < 64){
4298 int64_t stime, stime2;
4299 // Correcting starttime based on the enabled streams
4300 // FIXME this ideally should be done before the first use of starttime but we do not know which are the enabled streams at that point.
4301 // so we instead do it here as part of discontinuity handling
4302 if ( ist->next_dts == AV_NOPTS_VALUE
4303 && ifile->ts_offset == -is->start_time
4304 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
4305 int64_t new_start_time = INT64_MAX;
4306 for (i=0; i<is->nb_streams; i++) {
4307 AVStream *st = is->streams[i];
4308 if(st->discard == AVDISCARD_ALL || st->start_time == AV_NOPTS_VALUE)
4310 new_start_time = FFMIN(new_start_time, av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q));
4312 if (new_start_time > is->start_time) {
4313 av_log(is, AV_LOG_VERBOSE, "Correcting start time by %"PRId64"\n", new_start_time - is->start_time);
4314 ifile->ts_offset = -new_start_time;
4318 stime = av_rescale_q(is->start_time, AV_TIME_BASE_Q, ist->st->time_base);
4319 stime2= stime + (1ULL<<ist->st->pts_wrap_bits);
4320 ist->wrap_correction_done = 1;
4322 if(stime2 > stime && pkt.dts != AV_NOPTS_VALUE && pkt.dts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) {
4323 pkt.dts -= 1ULL<<ist->st->pts_wrap_bits;
4324 ist->wrap_correction_done = 0;
4326 if(stime2 > stime && pkt.pts != AV_NOPTS_VALUE && pkt.pts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) {
4327 pkt.pts -= 1ULL<<ist->st->pts_wrap_bits;
4328 ist->wrap_correction_done = 0;
4332 /* add the stream-global side data to the first packet */
4333 if (ist->nb_packets == 1) {
4334 for (i = 0; i < ist->st->nb_side_data; i++) {
4335 AVPacketSideData *src_sd = &ist->st->side_data[i];
4338 if (src_sd->type == AV_PKT_DATA_DISPLAYMATRIX)
4341 if (av_packet_get_side_data(&pkt, src_sd->type, NULL))
4344 dst_data = av_packet_new_side_data(&pkt, src_sd->type, src_sd->size);
4348 memcpy(dst_data, src_sd->data, src_sd->size);
4352 if (pkt.dts != AV_NOPTS_VALUE)
4353 pkt.dts += av_rescale_q(ifile->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
4354 if (pkt.pts != AV_NOPTS_VALUE)
4355 pkt.pts += av_rescale_q(ifile->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
4357 if (pkt.pts != AV_NOPTS_VALUE)
4358 pkt.pts *= ist->ts_scale;
4359 if (pkt.dts != AV_NOPTS_VALUE)
4360 pkt.dts *= ist->ts_scale;
4362 pkt_dts = av_rescale_q_rnd(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
4363 if ((ist->dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO ||
4364 ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) &&
4365 pkt_dts != AV_NOPTS_VALUE && ist->next_dts == AV_NOPTS_VALUE && !copy_ts
4366 && (is->iformat->flags & AVFMT_TS_DISCONT) && ifile->last_ts != AV_NOPTS_VALUE) {
4367 int64_t delta = pkt_dts - ifile->last_ts;
4368 if (delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
4369 delta > 1LL*dts_delta_threshold*AV_TIME_BASE){
4370 ifile->ts_offset -= delta;
4371 av_log(NULL, AV_LOG_DEBUG,
4372 "Inter stream timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
4373 delta, ifile->ts_offset);
4374 pkt.dts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
4375 if (pkt.pts != AV_NOPTS_VALUE)
4376 pkt.pts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
4380 duration = av_rescale_q(ifile->duration, ifile->time_base, ist->st->time_base);
4381 if (pkt.pts != AV_NOPTS_VALUE) {
4382 pkt.pts += duration;
4383 ist->max_pts = FFMAX(pkt.pts, ist->max_pts);
4384 ist->min_pts = FFMIN(pkt.pts, ist->min_pts);
4387 if (pkt.dts != AV_NOPTS_VALUE)
4388 pkt.dts += duration;
4390 pkt_dts = av_rescale_q_rnd(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
4391 if ((ist->dec_ctx->codec_type == AVMEDIA_TYPE_VIDEO ||
4392 ist->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) &&
4393 pkt_dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE &&
4395 int64_t delta = pkt_dts - ist->next_dts;
4396 if (is->iformat->flags & AVFMT_TS_DISCONT) {
4397 if (delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
4398 delta > 1LL*dts_delta_threshold*AV_TIME_BASE ||
4399 pkt_dts + AV_TIME_BASE/10 < FFMAX(ist->pts, ist->dts)) {
4400 ifile->ts_offset -= delta;
4401 av_log(NULL, AV_LOG_DEBUG,
4402 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
4403 delta, ifile->ts_offset);
4404 pkt.dts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
4405 if (pkt.pts != AV_NOPTS_VALUE)
4406 pkt.pts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
4409 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
4410 delta > 1LL*dts_error_threshold*AV_TIME_BASE) {
4411 av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt.dts, ist->next_dts, pkt.stream_index);
4412 pkt.dts = AV_NOPTS_VALUE;
4414 if (pkt.pts != AV_NOPTS_VALUE){
4415 int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
4416 delta = pkt_pts - ist->next_dts;
4417 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
4418 delta > 1LL*dts_error_threshold*AV_TIME_BASE) {
4419 av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index);
4420 pkt.pts = AV_NOPTS_VALUE;
4426 if (pkt.dts != AV_NOPTS_VALUE)
4427 ifile->last_ts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
4430 av_log(NULL, AV_LOG_INFO, "demuxer+ffmpeg -> ist_index:%d type:%s pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s off:%s off_time:%s\n",
4431 ifile->ist_index + pkt.stream_index, av_get_media_type_string(ist->dec_ctx->codec_type),
4432 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base),
4433 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base),
4434 av_ts2str(input_files[ist->file_index]->ts_offset),
4435 av_ts2timestr(input_files[ist->file_index]->ts_offset, &AV_TIME_BASE_Q));
4438 sub2video_heartbeat(ist, pkt.pts);
4440 process_input_packet(ist, &pkt, 0);
4443 av_packet_unref(&pkt);
4449 * Perform a step of transcoding for the specified filter graph.
4451 * @param[in] graph filter graph to consider
4452 * @param[out] best_ist input stream where a frame would allow to continue
4453 * @return 0 for success, <0 for error
4455 static int transcode_from_filter(FilterGraph *graph, InputStream **best_ist)
4458 int nb_requests, nb_requests_max = 0;
4459 InputFilter *ifilter;
4463 ret = avfilter_graph_request_oldest(graph->graph);
4465 return reap_filters(0);
4467 if (ret == AVERROR_EOF) {
4468 ret = reap_filters(1);
4469 for (i = 0; i < graph->nb_outputs; i++)
4470 close_output_stream(graph->outputs[i]->ost);
4473 if (ret != AVERROR(EAGAIN))
4476 for (i = 0; i < graph->nb_inputs; i++) {
4477 ifilter = graph->inputs[i];
4479 if (input_files[ist->file_index]->eagain ||
4480 input_files[ist->file_index]->eof_reached)
4482 nb_requests = av_buffersrc_get_nb_failed_requests(ifilter->filter);
4483 if (nb_requests > nb_requests_max) {
4484 nb_requests_max = nb_requests;
4490 for (i = 0; i < graph->nb_outputs; i++)
4491 graph->outputs[i]->ost->unavailable = 1;
4497 * Run a single step of transcoding.
4499 * @return 0 for success, <0 for error
4501 static int transcode_step(void)
4504 InputStream *ist = NULL;
4507 ost = choose_output();
4514 av_log(NULL, AV_LOG_VERBOSE, "No more inputs to read from, finishing.\n");
4518 if (ost->filter && !ost->filter->graph->graph) {
4519 if (ifilter_has_all_input_formats(ost->filter->graph)) {
4520 ret = configure_filtergraph(ost->filter->graph);
4522 av_log(NULL, AV_LOG_ERROR, "Error reinitializing filters!\n");
4528 if (ost->filter && ost->filter->graph->graph) {
4529 if (!ost->initialized) {
4530 char error[1024] = {0};
4531 ret = init_output_stream(ost, error, sizeof(error));
4533 av_log(NULL, AV_LOG_ERROR, "Error initializing output stream %d:%d -- %s\n",
4534 ost->file_index, ost->index, error);
4538 if ((ret = transcode_from_filter(ost->filter->graph, &ist)) < 0)
4542 } else if (ost->filter) {
4544 for (i = 0; i < ost->filter->graph->nb_inputs; i++) {
4545 InputFilter *ifilter = ost->filter->graph->inputs[i];
4546 if (!ifilter->ist->got_output && !input_files[ifilter->ist->file_index]->eof_reached) {
4552 ost->inputs_done = 1;
4556 av_assert0(ost->source_index >= 0);
4557 ist = input_streams[ost->source_index];
4560 ret = process_input(ist->file_index);
4561 if (ret == AVERROR(EAGAIN)) {
4562 if (input_files[ist->file_index]->eagain)
4563 ost->unavailable = 1;
4568 return ret == AVERROR_EOF ? 0 : ret;
4570 return reap_filters(0);
4574 * The following code is the main loop of the file converter
4576 static int transcode(void)
4579 AVFormatContext *os;
4582 int64_t timer_start;
4583 int64_t total_packets_written = 0;
4585 ret = transcode_init();
4589 if (stdin_interaction) {
4590 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
4593 timer_start = av_gettime_relative();
4596 if ((ret = init_input_threads()) < 0)
4600 while (!received_sigterm) {
4601 int64_t cur_time= av_gettime_relative();
4603 /* if 'q' pressed, exits */
4604 if (stdin_interaction)
4605 if (check_keyboard_interaction(cur_time) < 0)
4608 /* check if there's any stream where output is still needed */
4609 if (!need_output()) {
4610 av_log(NULL, AV_LOG_VERBOSE, "No more output streams to write to, finishing.\n");
4614 ret = transcode_step();
4615 if (ret < 0 && ret != AVERROR_EOF) {
4616 av_log(NULL, AV_LOG_ERROR, "Error while filtering: %s\n", av_err2str(ret));
4620 /* dump report by using the output first video and audio streams */
4621 print_report(0, timer_start, cur_time);
4624 free_input_threads();
4627 /* at the end of stream, we must flush the decoder buffers */
4628 for (i = 0; i < nb_input_streams; i++) {
4629 ist = input_streams[i];
4630 if (!input_files[ist->file_index]->eof_reached) {
4631 process_input_packet(ist, NULL, 0);
4638 /* write the trailer if needed and close file */
4639 for (i = 0; i < nb_output_files; i++) {
4640 os = output_files[i]->ctx;
4641 if (!output_files[i]->header_written) {
4642 av_log(NULL, AV_LOG_ERROR,
4643 "Nothing was written into output file %d (%s), because "
4644 "at least one of its streams received no packets.\n",
4648 if ((ret = av_write_trailer(os)) < 0) {
4649 av_log(NULL, AV_LOG_ERROR, "Error writing trailer of %s: %s\n", os->url, av_err2str(ret));
4655 /* dump report by using the first video and audio streams */
4656 print_report(1, timer_start, av_gettime_relative());
4658 /* close each encoder */
4659 for (i = 0; i < nb_output_streams; i++) {
4660 ost = output_streams[i];
4661 if (ost->encoding_needed) {
4662 av_freep(&ost->enc_ctx->stats_in);
4664 total_packets_written += ost->packets_written;
4667 if (!total_packets_written && (abort_on_flags & ABORT_ON_FLAG_EMPTY_OUTPUT)) {
4668 av_log(NULL, AV_LOG_FATAL, "Empty output\n");
4672 /* close each decoder */
4673 for (i = 0; i < nb_input_streams; i++) {
4674 ist = input_streams[i];
4675 if (ist->decoding_needed) {
4676 avcodec_close(ist->dec_ctx);
4677 if (ist->hwaccel_uninit)
4678 ist->hwaccel_uninit(ist->dec_ctx);
4682 av_buffer_unref(&hw_device_ctx);
4683 hw_device_free_all();
4690 free_input_threads();
4693 if (output_streams) {
4694 for (i = 0; i < nb_output_streams; i++) {
4695 ost = output_streams[i];
4698 if (fclose(ost->logfile))
4699 av_log(NULL, AV_LOG_ERROR,
4700 "Error closing logfile, loss of information possible: %s\n",
4701 av_err2str(AVERROR(errno)));
4702 ost->logfile = NULL;
4704 av_freep(&ost->forced_kf_pts);
4705 av_freep(&ost->apad);
4706 av_freep(&ost->disposition);
4707 av_dict_free(&ost->encoder_opts);
4708 av_dict_free(&ost->sws_dict);
4709 av_dict_free(&ost->swr_opts);
4710 av_dict_free(&ost->resample_opts);
4718 static int64_t getutime(void)
4721 struct rusage rusage;
4723 getrusage(RUSAGE_SELF, &rusage);
4724 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4725 #elif HAVE_GETPROCESSTIMES
4727 FILETIME c, e, k, u;
4728 proc = GetCurrentProcess();
4729 GetProcessTimes(proc, &c, &e, &k, &u);
4730 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4732 return av_gettime_relative();
4736 static int64_t getmaxrss(void)
4738 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4739 struct rusage rusage;
4740 getrusage(RUSAGE_SELF, &rusage);
4741 return (int64_t)rusage.ru_maxrss * 1024;
4742 #elif HAVE_GETPROCESSMEMORYINFO
4744 PROCESS_MEMORY_COUNTERS memcounters;
4745 proc = GetCurrentProcess();
4746 memcounters.cb = sizeof(memcounters);
4747 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4748 return memcounters.PeakPagefileUsage;
4754 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
4758 int main(int argc, char **argv)
4765 register_exit(ffmpeg_cleanup);
4767 setvbuf(stderr,NULL,_IONBF,0); /* win32 runtime needs this */
4769 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4770 parse_loglevel(argc, argv, options);
4772 if(argc>1 && !strcmp(argv[1], "-d")){
4774 av_log_set_callback(log_callback_null);
4779 avcodec_register_all();
4781 avdevice_register_all();
4783 avfilter_register_all();
4785 avformat_network_init();
4787 show_banner(argc, argv, options);
4789 /* parse options and open all input/output files */
4790 ret = ffmpeg_parse_options(argc, argv);
4794 if (nb_output_files <= 0 && nb_input_files == 0) {
4796 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4800 /* file converter / grab */
4801 if (nb_output_files <= 0) {
4802 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
4806 // if (nb_input_files == 0) {
4807 // av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
4811 for (i = 0; i < nb_output_files; i++) {
4812 if (strcmp(output_files[i]->ctx->oformat->name, "rtp"))
4816 current_time = ti = getutime();
4817 if (transcode() < 0)
4819 ti = getutime() - ti;
4821 av_log(NULL, AV_LOG_INFO, "bench: utime=%0.3fs\n", ti / 1000000.0);
4823 av_log(NULL, AV_LOG_DEBUG, "%"PRIu64" frames successfully decoded, %"PRIu64" decoding errors\n",
4824 decode_error_stat[0], decode_error_stat[1]);
4825 if ((decode_error_stat[0] + decode_error_stat[1]) * max_error_rate < decode_error_stat[1])
4828 exit_program(received_nb_signals ? 255 : main_return_code);
4829 return main_return_code;