encode: get rid of the output packet queue

Until recently, ao_lavc and vo_lavc started encoding whenever the core
happened to send them data. Since audio and video are not initialized at
the same time, and the muxer was not necessarily opened when the first
encoder started to produce data, the resulting packets were put into a
queue. As soon as the muxer was opened, the queue was flushed.

Change this to make the core wait with sending data until all encoders
are initialized. This has the advantage that we don't need to queue up
the packets.
This commit is contained in:
wm4
2018-04-29 19:42:18 +02:00
committed by Jan Ekström
parent 958053ff56
commit 0ab3184526
13 changed files with 147 additions and 79 deletions

View File

@@ -790,6 +790,10 @@ void fill_audio_out_buffers(struct MPContext *mpctx)
if (mpctx->ao && ao_query_and_reset_events(mpctx->ao, AO_EVENT_RELOAD))
reload_audio_output(mpctx);
if (mpctx->ao && ao_query_and_reset_events(mpctx->ao,
AO_EVENT_INITIAL_UNBLOCK))
ao_unblock(mpctx->ao);
struct ao_chain *ao_c = mpctx->ao_chain;
if (!ao_c)
return;
@@ -811,6 +815,7 @@ void fill_audio_out_buffers(struct MPContext *mpctx)
mpctx->audio_status = STATUS_EOF;
MP_VERBOSE(mpctx, "audio EOF without any data\n");
mp_filter_reset(ao_c->filter->f);
encode_lavc_stream_eof(mpctx->encode_lavc_ctx, STREAM_AUDIO);
}
return; // try again next iteration
}
@@ -994,6 +999,7 @@ void fill_audio_out_buffers(struct MPContext *mpctx)
if (!was_eof) {
MP_VERBOSE(mpctx, "audio EOF reached\n");
mp_wakeup_core(mpctx);
encode_lavc_stream_eof(mpctx->encode_lavc_ctx, STREAM_AUDIO);
}
}
}

View File

@@ -1027,6 +1027,7 @@ void write_video(struct MPContext *mpctx)
if (mpctx->time_frame <= 0) {
MP_VERBOSE(mpctx, "video EOF reached\n");
mpctx->video_status = STATUS_EOF;
encode_lavc_stream_eof(mpctx->encode_lavc_ctx, STREAM_VIDEO);
}
}