From 538baaef6e22f1ecb2fb9d6035a6992e22c89ed4 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Thu, 1 Nov 2012 12:25:50 +0100 Subject: [PATCH] encode: bail out on missing A or V stream In mplayer2, it was valid to try to start encoding before all streams were initialized. mpv avoids this situation and thus allows us to properly bail out on some kinds of failures. Also, this commit fixes a missing check in ao uninit which could cause heap corruption when ao initialization did not complete. --- encode_lavc.c | 10 ++++++++-- libao2/ao_lavc.c | 11 ++++++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/encode_lavc.c b/encode_lavc.c index e38ca5bca8..66f434410a 100644 --- a/encode_lavc.c +++ b/encode_lavc.c @@ -233,15 +233,21 @@ int encode_lavc_start(struct encode_lavc_context *ctx) for (i = 0; i < ctx->avc->nb_streams; ++i) if (ctx->avc->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) break; - if (i >= ctx->avc->nb_streams) + if (i >= ctx->avc->nb_streams) { + encode_lavc_fail(ctx, + "encode-lavc: video stream missing, invalid codec?\n"); return 0; + } } if (ctx->expect_audio) { for (i = 0; i < ctx->avc->nb_streams; ++i) if (ctx->avc->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) break; - if (i >= ctx->avc->nb_streams) + if (i >= ctx->avc->nb_streams) { + encode_lavc_fail(ctx, + "encode-lavc: audio stream missing, invalid codec?\n"); return 0; + } } ctx->header_written = -1; diff --git a/libao2/ao_lavc.c b/libao2/ao_lavc.c index d4523f0d54..6aab53e291 100644 --- a/libao2/ao_lavc.c +++ b/libao2/ao_lavc.c @@ -293,6 +293,14 @@ static int encode(struct ao *ao, double apts, void *data); static void uninit(struct ao *ao, bool cut_audio) { struct priv *ac = ao->priv; + struct encode_lavc_context *ectx = ao->encode_lavc_ctx; + + if (!encode_lavc_start(ectx)) { + mp_msg(MSGT_ENCODE, MSGL_WARN, + "ao-lavc: not even ready to encode audio at end -> dropped"); + return; + } + if (ac->buffer) { double pts = ao->pts + ac->offset / (double) ao->samplerate; if (ao->buffer.len > 0) { @@ -455,7 +463,8 @@ static int play(struct ao *ao, void *data, int len, int flags) len /= ac->sample_size * ao->channels; if (!encode_lavc_start(ectx)) { - mp_msg(MSGT_ENCODE, MSGL_WARN, "ao-lavc: NOTE: deferred initial audio frame (probably because video is not there yet)\n"); + mp_msg(MSGT_ENCODE, MSGL_WARN, + "ao-lavc: not ready yet for encoding audio\n"); return 0; } if (pts == MP_NOPTS_VALUE) {