Commit 9b41c7cd authored by Stefan Westerfeld's avatar Stefan Westerfeld

avfilter/asubprocess: improve eof handling

Signed-off-by: Stefan Westerfeld's avatarStefan Westerfeld <stefan@space.twc.de>
parent 2bc3be02
...@@ -67,6 +67,7 @@ typedef struct ASubProcessContext { ...@@ -67,6 +67,7 @@ typedef struct ASubProcessContext {
void *sample_buffer; void *sample_buffer;
size_t sample_buffer_size; size_t sample_buffer_size;
int eof; int eof;
int64_t last_pts;
FFFrameQueue frame_queue; FFFrameQueue frame_queue;
} ASubProcessContext; } ASubProcessContext;
...@@ -581,7 +582,7 @@ static int try_read_frame(AVFilterContext *ctx) ...@@ -581,7 +582,7 @@ static int try_read_frame(AVFilterContext *ctx)
int sample_size = s->out_bit_depth / 8; int sample_size = s->out_bit_depth / 8;
int avail = sp_can_read(s->sp) / sample_size / outlink->ch_layout.nb_channels; int avail = sp_can_read(s->sp) / sample_size / outlink->ch_layout.nb_channels;
if (avail >= out->nb_samples || (s->eof && avail > 0)) { // TODO: eof handling correct? if (avail >= out->nb_samples) {
avail = FFMIN(avail, out->nb_samples); avail = FFMIN(avail, out->nb_samples);
out = ff_framequeue_take(&s->frame_queue); out = ff_framequeue_take(&s->frame_queue);
av_assert0(avail <= s->sample_buffer_size); av_assert0(avail <= s->sample_buffer_size);
...@@ -602,7 +603,6 @@ static int activate(AVFilterContext *ctx) ...@@ -602,7 +603,6 @@ static int activate(AVFilterContext *ctx)
AVFilterLink *outlink = ctx->outputs[0]; AVFilterLink *outlink = ctx->outputs[0];
ASubProcessContext *s = ctx->priv; ASubProcessContext *s = ctx->priv;
AVFrame *in = NULL; AVFrame *in = NULL;
int64_t pts;
int status, ret; int status, ret;
if (s->state == STATE_START) { if (s->state == STATE_START) {
...@@ -622,11 +622,8 @@ static int activate(AVFilterContext *ctx) ...@@ -622,11 +622,8 @@ static int activate(AVFilterContext *ctx)
ret = try_read_frame(ctx); ret = try_read_frame(ctx);
if (ret != 0) if (ret != 0)
return ret; return ret;
ret = ff_inlink_consume_frame(inlink, &in);
if (ff_inlink_acknowledge_status(inlink, &status, &pts))
s->eof |= status == AVERROR_EOF;
ret = ff_inlink_consume_frame(inlink, &in);
if (ret < 0) if (ret < 0)
return ret; return ret;
if (ret > 0) { if (ret > 0) {
...@@ -638,6 +635,10 @@ static int activate(AVFilterContext *ctx) ...@@ -638,6 +635,10 @@ static int activate(AVFilterContext *ctx)
if (ret != 0) if (ret != 0)
return ret; return ret;
} }
if (!s->eof && ff_inlink_acknowledge_status(inlink, &status, &s->last_pts))
s->eof |= status == AVERROR_EOF;
if (s->eof && !sp_done(s->sp)) { if (s->eof && !sp_done(s->sp)) {
while (!sp_done(s->sp)) { while (!sp_done(s->sp)) {
int ret = sp_write(ctx, 0, 0); int ret = sp_write(ctx, 0, 0);
...@@ -654,8 +655,7 @@ static int activate(AVFilterContext *ctx) ...@@ -654,8 +655,7 @@ static int activate(AVFilterContext *ctx)
av_log(ctx, AV_LOG_ERROR, "Subprocess output wav is incomplete (no data chunk found)\n"); av_log(ctx, AV_LOG_ERROR, "Subprocess output wav is incomplete (no data chunk found)\n");
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
// s->last_pts ff_outlink_set_status(outlink, AVERROR_EOF, s->last_pts);
ff_outlink_set_status(outlink, AVERROR_EOF, AV_NOPTS_VALUE);
return 0; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment