| @@ -1292,9 +1292,6 @@ static void do_subtitle_out(AVFormatContext *s, | |||||
| } | } | ||||
| } | } | ||||
| static int bit_buffer_size = 1024 * 256; | |||||
| static uint8_t *bit_buffer = NULL; | |||||
| #if !CONFIG_AVFILTER | #if !CONFIG_AVFILTER | ||||
| static void do_video_resample(OutputStream *ost, | static void do_video_resample(OutputStream *ost, | ||||
| InputStream *ist, | InputStream *ist, | ||||
| @@ -1412,6 +1409,8 @@ static void do_video_out(AVFormatContext *s, | |||||
| for (i = 0; i < nb_frames; i++) { | for (i = 0; i < nb_frames; i++) { | ||||
| AVPacket pkt; | AVPacket pkt; | ||||
| av_init_packet(&pkt); | av_init_packet(&pkt); | ||||
| pkt.data = NULL; | |||||
| pkt.size = 0; | |||||
| if (!check_recording_time(ost)) | if (!check_recording_time(ost)) | ||||
| return; | return; | ||||
| @@ -1430,6 +1429,7 @@ static void do_video_out(AVFormatContext *s, | |||||
| write_frame(s, &pkt, ost); | write_frame(s, &pkt, ost); | ||||
| } else { | } else { | ||||
| int got_packet; | |||||
| AVFrame big_picture; | AVFrame big_picture; | ||||
| big_picture = *final_picture; | big_picture = *final_picture; | ||||
| @@ -1454,22 +1454,18 @@ static void do_video_out(AVFormatContext *s, | |||||
| big_picture.pict_type = AV_PICTURE_TYPE_I; | big_picture.pict_type = AV_PICTURE_TYPE_I; | ||||
| ost->forced_kf_index++; | ost->forced_kf_index++; | ||||
| } | } | ||||
| ret = avcodec_encode_video(enc, | |||||
| bit_buffer, bit_buffer_size, | |||||
| &big_picture); | |||||
| ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet); | |||||
| if (ret < 0) { | if (ret < 0) { | ||||
| av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n"); | av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n"); | ||||
| exit_program(1); | exit_program(1); | ||||
| } | } | ||||
| if (ret > 0) { | |||||
| pkt.data = bit_buffer; | |||||
| pkt.size = ret; | |||||
| if (enc->coded_frame->pts != AV_NOPTS_VALUE) | |||||
| pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base); | |||||
| if (got_packet) { | |||||
| if (pkt.pts != AV_NOPTS_VALUE) | |||||
| pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base); | |||||
| if (pkt.dts != AV_NOPTS_VALUE) | |||||
| pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base); | |||||
| if (enc->coded_frame->key_frame) | |||||
| pkt.flags |= AV_PKT_FLAG_KEY; | |||||
| write_frame(s, &pkt, ost); | write_frame(s, &pkt, ost); | ||||
| *frame_size = ret; | *frame_size = ret; | ||||
| video_size += ret; | video_size += ret; | ||||
| @@ -1675,7 +1671,7 @@ static void flush_encoders(OutputStream *ost_table, int nb_ostreams) | |||||
| for (;;) { | for (;;) { | ||||
| AVPacket pkt; | AVPacket pkt; | ||||
| int fifo_bytes; | |||||
| int fifo_bytes, got_packet; | |||||
| av_init_packet(&pkt); | av_init_packet(&pkt); | ||||
| pkt.data = NULL; | pkt.data = NULL; | ||||
| pkt.size = 0; | pkt.size = 0; | ||||
| @@ -1708,25 +1704,23 @@ static void flush_encoders(OutputStream *ost_table, int nb_ostreams) | |||||
| } | } | ||||
| break; | break; | ||||
| case AVMEDIA_TYPE_VIDEO: | case AVMEDIA_TYPE_VIDEO: | ||||
| ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL); | |||||
| ret = avcodec_encode_video2(enc, &pkt, NULL, &got_packet); | |||||
| if (ret < 0) { | if (ret < 0) { | ||||
| av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n"); | av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n"); | ||||
| exit_program(1); | exit_program(1); | ||||
| } | } | ||||
| video_size += ret; | video_size += ret; | ||||
| if (enc->coded_frame && enc->coded_frame->key_frame) | |||||
| pkt.flags |= AV_PKT_FLAG_KEY; | |||||
| if (ost->logfile && enc->stats_out) { | if (ost->logfile && enc->stats_out) { | ||||
| fprintf(ost->logfile, "%s", enc->stats_out); | fprintf(ost->logfile, "%s", enc->stats_out); | ||||
| } | } | ||||
| if (ret <= 0) { | |||||
| if (!got_packet) { | |||||
| stop_encoding = 1; | stop_encoding = 1; | ||||
| break; | break; | ||||
| } | } | ||||
| pkt.data = bit_buffer; | |||||
| pkt.size = ret; | |||||
| if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE) | |||||
| pkt.pts = av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base); | |||||
| if (pkt.pts != AV_NOPTS_VALUE) | |||||
| pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base); | |||||
| if (pkt.dts != AV_NOPTS_VALUE) | |||||
| pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base); | |||||
| write_frame(os, &pkt, ost); | write_frame(os, &pkt, ost); | ||||
| break; | break; | ||||
| default: | default: | ||||
| @@ -2497,18 +2491,6 @@ static int transcode_init(OutputFile *output_files, | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| if (codec->codec_type == AVMEDIA_TYPE_VIDEO) { | |||||
| int size = codec->width * codec->height; | |||||
| bit_buffer_size = FFMAX(bit_buffer_size, 6 * size + 200); | |||||
| } | |||||
| } | |||||
| if (!bit_buffer) | |||||
| bit_buffer = av_malloc(bit_buffer_size); | |||||
| if (!bit_buffer) { | |||||
| av_log(NULL, AV_LOG_ERROR, "Cannot allocate %d bytes output buffer\n", | |||||
| bit_buffer_size); | |||||
| return AVERROR(ENOMEM); | |||||
| } | } | ||||
| /* open each encoder */ | /* open each encoder */ | ||||
| @@ -2841,7 +2823,6 @@ static int transcode(OutputFile *output_files, | |||||
| ret = 0; | ret = 0; | ||||
| fail: | fail: | ||||
| av_freep(&bit_buffer); | |||||
| av_freep(&no_packet); | av_freep(&no_packet); | ||||
| if (output_streams) { | if (output_streams) { | ||||