[FFmpeg-devel] [PATCH 2/4] ffmpeg: move A/V non-streamcopy initialization to a later point
Jan Ekström
jeebjp at gmail.com
Fri Sep 11 19:11:05 EEST 2020
This enables us to utilize AVFrames for initialization parameters
further down the line.
---
fftools/ffmpeg.c | 63 ++++++++++++++++++++++++++----------------------
1 file changed, 34 insertions(+), 29 deletions(-)
diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c
index cb7644de6a..24b8e175a6 100644
--- a/fftools/ffmpeg.c
+++ b/fftools/ffmpeg.c
@@ -897,6 +897,28 @@ static int check_recording_time(OutputStream *ost)
return 1;
}
+static int init_output_stream(OutputStream *ost, char *error, int error_len);
+
+static int init_output_stream_wrapper(OutputStream *ost, unsigned int fatal)
+{
+ int ret = AVERROR_BUG;
+ char error[1024] = {0};
+
+ if (ost->initialized)
+ return 0;
+
+ ret = init_output_stream(ost, error, sizeof(error));
+ if (ret < 0) {
+ av_log(NULL, AV_LOG_ERROR, "Error initializing output stream %d:%d -- %s\n",
+ ost->file_index, ost->index, error);
+
+ if (fatal)
+ exit_program(1);
+ }
+
+ return ret;
+}
+
static void do_audio_out(OutputFile *of, OutputStream *ost,
AVFrame *frame)
{
@@ -908,6 +930,8 @@ static void do_audio_out(OutputFile *of, OutputStream *ost,
pkt.data = NULL;
pkt.size = 0;
+ init_output_stream_wrapper(ost, 1);
+
if (!check_recording_time(ost))
return;
@@ -1057,6 +1081,8 @@ static void do_video_out(OutputFile *of,
InputStream *ist = NULL;
AVFilterContext *filter = ost->filter->filter;
+ init_output_stream_wrapper(ost, 1);
+
if (ost->source_index >= 0)
ist = input_streams[ost->source_index];
@@ -1390,28 +1416,6 @@ static void do_video_stats(OutputStream *ost, int frame_size)
}
}
-static int init_output_stream(OutputStream *ost, char *error, int error_len);
-
-static int init_output_stream_wrapper(OutputStream *ost, unsigned int fatal)
-{
- int ret = AVERROR_BUG;
- char error[1024] = {0};
-
- if (ost->initialized)
- return 0;
-
- ret = init_output_stream(ost, error, sizeof(error));
- if (ret < 0) {
- av_log(NULL, AV_LOG_ERROR, "Error initializing output stream %d:%d -- %s\n",
- ost->file_index, ost->index, error);
-
- if (fatal)
- exit_program(1);
- }
-
- return ret;
-}
-
static void finish_output_stream(OutputStream *ost)
{
OutputFile *of = output_files[ost->file_index];
@@ -1448,8 +1452,6 @@ static int reap_filters(int flush)
continue;
filter = ost->filter->filter;
- init_output_stream_wrapper(ost, 1);
-
if (!ost->filtered_frame && !(ost->filtered_frame = av_frame_alloc())) {
return AVERROR(ENOMEM);
}
@@ -3669,10 +3671,15 @@ static int transcode_init(void)
goto dump_format;
}
- /* open each encoder */
+ /*
+ * initialize stream copy and subtitle/data streams - encoded AVFrame
+ * based streams will get initialized when the first AVFrames are
+ * received via do_{audio,video}_out
+ */
for (i = 0; i < nb_output_streams; i++) {
- // skip streams fed from filtergraphs until we have a frame for them
- if (output_streams[i]->filter)
+ if (!output_streams[i]->stream_copy &&
+ (output_streams[i]->enc_ctx->codec_type == AVMEDIA_TYPE_VIDEO ||
+ output_streams[i]->enc_ctx->codec_type == AVMEDIA_TYPE_AUDIO))
continue;
ret = init_output_stream_wrapper(output_streams[i], 0);
@@ -4586,8 +4593,6 @@ static int transcode_step(void)
}
if (ost->filter && ost->filter->graph->graph) {
- init_output_stream_wrapper(ost, 1);
-
if ((ret = transcode_from_filter(ost->filter->graph, &ist)) < 0)
return ret;
if (!ist)
--
2.26.2
More information about the ffmpeg-devel
mailing list