avfilter/f_segment: fix sending frames with zero samples out

Fix max_samples variable type, and check for out of range values.
This commit is contained in:
Paul B Mahol 2022-03-08 10:20:05 +01:00
parent a0fc6c4a8e
commit 3706fb8f16

View File

@ -41,6 +41,7 @@ typedef struct SegmentContext {
int current_point; int current_point;
int nb_points; int nb_points;
int64_t last_pts;
int64_t *points; int64_t *points;
} SegmentContext; } SegmentContext;
@ -186,7 +187,7 @@ static int activate(AVFilterContext *ctx)
SegmentContext *s = ctx->priv; SegmentContext *s = ctx->priv;
AVFrame *frame = NULL; AVFrame *frame = NULL;
int ret, status; int ret, status;
int max_samples; int64_t max_samples;
int64_t diff; int64_t diff;
int64_t pts; int64_t pts;
@ -200,18 +201,30 @@ static int activate(AVFilterContext *ctx)
break; break;
case AVMEDIA_TYPE_AUDIO: case AVMEDIA_TYPE_AUDIO:
diff = s->points[s->current_point] - inlink->sample_count_out; diff = s->points[s->current_point] - inlink->sample_count_out;
while (diff <= 0) {
ff_outlink_set_status(ctx->outputs[s->current_point], AVERROR_EOF, s->last_pts);
s->current_point++;
if (s->current_point >= s->nb_points)
return AVERROR(EINVAL);
diff = s->points[s->current_point] - inlink->sample_count_out;
}
if (s->use_timestamps) { if (s->use_timestamps) {
max_samples = av_rescale_q(diff, av_make_q(1, inlink->sample_rate), inlink->time_base); max_samples = av_rescale_q(diff, av_make_q(1, inlink->sample_rate), inlink->time_base);
} else { } else {
max_samples = FFMAX(1, FFMIN(diff, INT_MAX)); max_samples = FFMAX(1, FFMIN(diff, INT_MAX));
} }
ret = ff_inlink_consume_samples(inlink, 1, max_samples, &frame); if (max_samples <= 0 || max_samples > INT_MAX)
ret = ff_inlink_consume_frame(inlink, &frame);
else
ret = ff_inlink_consume_samples(inlink, 1, max_samples, &frame);
break; break;
default: default:
return AVERROR_BUG; return AVERROR_BUG;
} }
if (ret > 0) { if (ret > 0) {
s->last_pts = frame->pts;
while (current_segment_finished(ctx, frame)) { while (current_segment_finished(ctx, frame)) {
ff_outlink_set_status(ctx->outputs[s->current_point], AVERROR_EOF, frame->pts); ff_outlink_set_status(ctx->outputs[s->current_point], AVERROR_EOF, frame->pts);
s->current_point++; s->current_point++;