diff options
author | Anton Khirnov <anton@khirnov.net> | 2012-02-01 10:51:36 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2012-02-08 21:00:00 +0100 |
commit | 8e37038a3458e6b55c9ebc28f077e2119a41b59e (patch) | |
tree | a0798f0332ad5005a2a1ed79ac561acfc218e9c3 /avconv.c | |
parent | 06484d0b8a7d4d1a694ba7ab277e2ec32d6558d7 (diff) | |
download | ffmpeg-8e37038a3458e6b55c9ebc28f077e2119a41b59e.tar.gz |
avconv: switch to avcodec_encode_video2().
Diffstat (limited to 'avconv.c')
-rw-r--r-- | avconv.c | 51 |
1 files changed, 16 insertions, 35 deletions
@@ -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 static void do_video_resample(OutputStream *ost, InputStream *ist, @@ -1412,6 +1409,8 @@ static void do_video_out(AVFormatContext *s, for (i = 0; i < nb_frames; i++) { AVPacket pkt; av_init_packet(&pkt); + pkt.data = NULL; + pkt.size = 0; if (!check_recording_time(ost)) return; @@ -1430,6 +1429,7 @@ static void do_video_out(AVFormatContext *s, write_frame(s, &pkt, ost); } else { + int got_packet; AVFrame big_picture; big_picture = *final_picture; @@ -1454,22 +1454,18 @@ static void do_video_out(AVFormatContext *s, big_picture.pict_type = AV_PICTURE_TYPE_I; 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) { av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n"); 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); *frame_size = ret; video_size += ret; @@ -1675,7 +1671,7 @@ static void flush_encoders(OutputStream *ost_table, int nb_ostreams) for (;;) { AVPacket pkt; - int fifo_bytes; + int fifo_bytes, got_packet; av_init_packet(&pkt); pkt.data = NULL; pkt.size = 0; @@ -1708,25 +1704,23 @@ static void flush_encoders(OutputStream *ost_table, int nb_ostreams) } break; 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) { av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n"); exit_program(1); } video_size += ret; - if (enc->coded_frame && enc->coded_frame->key_frame) - pkt.flags |= AV_PKT_FLAG_KEY; if (ost->logfile && enc->stats_out) { fprintf(ost->logfile, "%s", enc->stats_out); } - if (ret <= 0) { + if (!got_packet) { stop_encoding = 1; 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); break; 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 */ @@ -2841,7 +2823,6 @@ static int transcode(OutputFile *output_files, ret = 0; fail: - av_freep(&bit_buffer); av_freep(&no_packet); if (output_streams) { |