|  | @@ -1193,27 +1193,27 @@ static void do_video_out(OutputFile *of, | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | ost->last_dropped = nb_frames == nb0_frames && next_picture; |  |  | ost->last_dropped = nb_frames == nb0_frames && next_picture; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | /* duplicates frame if needed */ |  |  |  | 
														
													
														
															
																|  |  | for (i = 0; i < nb_frames; i++) { |  |  |  | 
														
													
														
															
																|  |  | AVFrame *in_picture; |  |  |  | 
														
													
														
															
																|  |  | int forced_keyframe = 0; |  |  |  | 
														
													
														
															
																|  |  | double pts_time; |  |  |  | 
														
													
														
															
																|  |  | av_init_packet(&pkt); |  |  |  | 
														
													
														
															
																|  |  | pkt.data = NULL; |  |  |  | 
														
													
														
															
																|  |  | pkt.size = 0; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | /* duplicates frame if needed */ | 
														
													
														
															
																|  |  |  |  |  | for (i = 0; i < nb_frames; i++) { | 
														
													
														
															
																|  |  |  |  |  | AVFrame *in_picture; | 
														
													
														
															
																|  |  |  |  |  | int forced_keyframe = 0; | 
														
													
														
															
																|  |  |  |  |  | double pts_time; | 
														
													
														
															
																|  |  |  |  |  | av_init_packet(&pkt); | 
														
													
														
															
																|  |  |  |  |  | pkt.data = NULL; | 
														
													
														
															
																|  |  |  |  |  | pkt.size = 0; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (i < nb0_frames && ost->last_frame) { |  |  |  | 
														
													
														
															
																|  |  | in_picture = ost->last_frame; |  |  |  | 
														
													
														
															
																|  |  | } else |  |  |  | 
														
													
														
															
																|  |  | in_picture = next_picture; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (i < nb0_frames && ost->last_frame) { | 
														
													
														
															
																|  |  |  |  |  | in_picture = ost->last_frame; | 
														
													
														
															
																|  |  |  |  |  | } else | 
														
													
														
															
																|  |  |  |  |  | in_picture = next_picture; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (!in_picture) |  |  |  | 
														
													
														
															
																|  |  | return; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (!in_picture) | 
														
													
														
															
																|  |  |  |  |  | return; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | in_picture->pts = ost->sync_opts; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | in_picture->pts = ost->sync_opts; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (!check_recording_time(ost)) |  |  |  | 
														
													
														
															
																|  |  | return; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (!check_recording_time(ost)) | 
														
													
														
															
																|  |  |  |  |  | return; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (enc->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME) && |  |  | if (enc->flags & (AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME) && | 
														
													
														
															
																|  |  | ost->top_field_first >= 0) |  |  | ost->top_field_first >= 0) | 
														
													
												
													
														
															
																|  | @@ -1322,17 +1322,17 @@ static void do_video_out(OutputFile *of, | 
														
													
														
															
																|  |  | fprintf(ost->logfile, "%s", enc->stats_out); |  |  | fprintf(ost->logfile, "%s", enc->stats_out); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | ost->sync_opts++; |  |  |  | 
														
													
														
															
																|  |  | /* |  |  |  | 
														
													
														
															
																|  |  | * For video, number of frames in == number of packets out. |  |  |  | 
														
													
														
															
																|  |  | * But there may be reordering, so we can't throw away frames on encoder |  |  |  | 
														
													
														
															
																|  |  | * flush, we need to limit them here, before they go into encoder. |  |  |  | 
														
													
														
															
																|  |  | */ |  |  |  | 
														
													
														
															
																|  |  | ost->frame_number++; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | ost->sync_opts++; | 
														
													
														
															
																|  |  |  |  |  | /* | 
														
													
														
															
																|  |  |  |  |  | * For video, number of frames in == number of packets out. | 
														
													
														
															
																|  |  |  |  |  | * But there may be reordering, so we can't throw away frames on encoder | 
														
													
														
															
																|  |  |  |  |  | * flush, we need to limit them here, before they go into encoder. | 
														
													
														
															
																|  |  |  |  |  | */ | 
														
													
														
															
																|  |  |  |  |  | ost->frame_number++; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (vstats_filename && frame_size) |  |  |  | 
														
													
														
															
																|  |  | do_video_stats(ost, frame_size); |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  |  |  |  | if (vstats_filename && frame_size) | 
														
													
														
															
																|  |  |  |  |  | do_video_stats(ost, frame_size); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | if (!ost->last_frame) |  |  | if (!ost->last_frame) | 
														
													
														
															
																|  |  | ost->last_frame = av_frame_alloc(); |  |  | ost->last_frame = av_frame_alloc(); | 
														
													
												
													
														
															
																|  | @@ -1817,7 +1817,7 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti | 
														
													
														
															
																|  |  | } else |  |  | } else | 
														
													
														
															
																|  |  | av_log(NULL, AV_LOG_INFO, "%s    %c", buf.str, end); |  |  | av_log(NULL, AV_LOG_INFO, "%s    %c", buf.str, end); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | fflush(stderr); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | fflush(stderr); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | av_bprint_finalize(&buf, NULL); |  |  | av_bprint_finalize(&buf, NULL); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | @@ -1924,46 +1924,46 @@ static void flush_encoders(void) | 
														
													
														
															
																|  |  | av_assert0(0); |  |  | av_assert0(0); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | av_init_packet(&pkt); |  |  |  | 
														
													
														
															
																|  |  | pkt.data = NULL; |  |  |  | 
														
													
														
															
																|  |  | pkt.size = 0; |  |  |  | 
														
													
														
															
																|  |  |  |  |  | av_init_packet(&pkt); | 
														
													
														
															
																|  |  |  |  |  | pkt.data = NULL; | 
														
													
														
															
																|  |  |  |  |  | pkt.size = 0; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | update_benchmark(NULL); |  |  |  | 
														
													
														
															
																|  |  |  |  |  | update_benchmark(NULL); | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | while ((ret = avcodec_receive_packet(enc, &pkt)) == AVERROR(EAGAIN)) { |  |  |  | 
														
													
														
															
																|  |  | ret = avcodec_send_frame(enc, NULL); |  |  |  | 
														
													
														
															
																|  |  | if (ret < 0) { |  |  |  | 
														
													
														
															
																|  |  | av_log(NULL, AV_LOG_FATAL, "%s encoding failed: %s\n", |  |  |  | 
														
													
														
															
																|  |  | desc, |  |  |  | 
														
													
														
															
																|  |  | av_err2str(ret)); |  |  |  | 
														
													
														
															
																|  |  | exit_program(1); |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  | 
 |  |  |  | 
														
													
														
															
																|  |  | update_benchmark("flush_%s %d.%d", desc, ost->file_index, ost->index); |  |  |  | 
														
													
														
															
																|  |  | if (ret < 0 && ret != AVERROR_EOF) { |  |  |  | 
														
													
														
															
																|  |  |  |  |  | while ((ret = avcodec_receive_packet(enc, &pkt)) == AVERROR(EAGAIN)) { | 
														
													
														
															
																|  |  |  |  |  | ret = avcodec_send_frame(enc, NULL); | 
														
													
														
															
																|  |  |  |  |  | if (ret < 0) { | 
														
													
														
															
																|  |  | av_log(NULL, AV_LOG_FATAL, "%s encoding failed: %s\n", |  |  | av_log(NULL, AV_LOG_FATAL, "%s encoding failed: %s\n", | 
														
													
														
															
																|  |  | desc, |  |  | desc, | 
														
													
														
															
																|  |  | av_err2str(ret)); |  |  | av_err2str(ret)); | 
														
													
														
															
																|  |  | exit_program(1); |  |  | exit_program(1); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | if (ost->logfile && enc->stats_out) { |  |  |  | 
														
													
														
															
																|  |  | fprintf(ost->logfile, "%s", enc->stats_out); |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  | if (ret == AVERROR_EOF) { |  |  |  | 
														
													
														
															
																|  |  | output_packet(of, &pkt, ost, 1); |  |  |  | 
														
													
														
															
																|  |  | break; |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  | if (ost->finished & MUXER_FINISHED) { |  |  |  | 
														
													
														
															
																|  |  | av_packet_unref(&pkt); |  |  |  | 
														
													
														
															
																|  |  | continue; |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  | av_packet_rescale_ts(&pkt, enc->time_base, ost->mux_timebase); |  |  |  | 
														
													
														
															
																|  |  | pkt_size = pkt.size; |  |  |  | 
														
													
														
															
																|  |  | output_packet(of, &pkt, ost, 0); |  |  |  | 
														
													
														
															
																|  |  | if (ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO && vstats_filename) { |  |  |  | 
														
													
														
															
																|  |  | do_video_stats(ost, pkt_size); |  |  |  | 
														
													
														
															
																|  |  | } |  |  |  | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | 
 | 
														
													
														
															
																|  |  |  |  |  | update_benchmark("flush_%s %d.%d", desc, ost->file_index, ost->index); | 
														
													
														
															
																|  |  |  |  |  | if (ret < 0 && ret != AVERROR_EOF) { | 
														
													
														
															
																|  |  |  |  |  | av_log(NULL, AV_LOG_FATAL, "%s encoding failed: %s\n", | 
														
													
														
															
																|  |  |  |  |  | desc, | 
														
													
														
															
																|  |  |  |  |  | av_err2str(ret)); | 
														
													
														
															
																|  |  |  |  |  | exit_program(1); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | if (ost->logfile && enc->stats_out) { | 
														
													
														
															
																|  |  |  |  |  | fprintf(ost->logfile, "%s", enc->stats_out); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | if (ret == AVERROR_EOF) { | 
														
													
														
															
																|  |  |  |  |  | output_packet(of, &pkt, ost, 1); | 
														
													
														
															
																|  |  |  |  |  | break; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | if (ost->finished & MUXER_FINISHED) { | 
														
													
														
															
																|  |  |  |  |  | av_packet_unref(&pkt); | 
														
													
														
															
																|  |  |  |  |  | continue; | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  |  |  |  | av_packet_rescale_ts(&pkt, enc->time_base, ost->mux_timebase); | 
														
													
														
															
																|  |  |  |  |  | pkt_size = pkt.size; | 
														
													
														
															
																|  |  |  |  |  | output_packet(of, &pkt, ost, 0); | 
														
													
														
															
																|  |  |  |  |  | if (ost->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO && vstats_filename) { | 
														
													
														
															
																|  |  |  |  |  | do_video_stats(ost, pkt_size); | 
														
													
														
															
																|  |  |  |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
												
													
														
															
																|  | @@ -3419,8 +3419,8 @@ static int init_output_stream_encode(OutputStream *ost) | 
														
													
														
															
																|  |  | ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_N] = NAN; |  |  | ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_N] = NAN; | 
														
													
														
															
																|  |  | ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_T] = NAN; |  |  | ost->forced_keyframes_expr_const_values[FKF_PREV_FORCED_T] = NAN; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | // Don't parse the 'forced_keyframes' in case of 'keep-source-keyframes', |  |  |  | 
														
													
														
															
																|  |  | // parse it only for static kf timings |  |  |  | 
														
													
														
															
																|  |  |  |  |  | // Don't parse the 'forced_keyframes' in case of 'keep-source-keyframes', | 
														
													
														
															
																|  |  |  |  |  | // parse it only for static kf timings | 
														
													
														
															
																|  |  | } else if(strncmp(ost->forced_keyframes, "source", 6)) { |  |  | } else if(strncmp(ost->forced_keyframes, "source", 6)) { | 
														
													
														
															
																|  |  | parse_forced_key_frames(ost->forced_keyframes, ost, ost->enc_ctx); |  |  | parse_forced_key_frames(ost->forced_keyframes, ost, ost->enc_ctx); | 
														
													
														
															
																|  |  | } |  |  | } | 
														
													
												
													
														
															
																|  | @@ -4163,7 +4163,7 @@ static void reset_eagain(void) | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
														
															
																|  |  | // set duration to max(tmp, duration) in a proper time base and return duration's time_base |  |  | // set duration to max(tmp, duration) in a proper time base and return duration's time_base | 
														
													
														
															
																|  |  | static AVRational duration_max(int64_t tmp, int64_t *duration, AVRational tmp_time_base, |  |  | static AVRational duration_max(int64_t tmp, int64_t *duration, AVRational tmp_time_base, | 
														
													
														
															
																|  |  | AVRational time_base) |  |  |  | 
														
													
														
															
																|  |  |  |  |  | AVRational time_base) | 
														
													
														
															
																|  |  | { |  |  | { | 
														
													
														
															
																|  |  | int ret; |  |  | int ret; | 
														
													
														
															
																|  |  | 
 |  |  | 
 | 
														
													
												
													
														
															
																|  | 
 |