static int config_output(AVFilterLink *outlink)
{
- AVFilterContext *ctx = outlink->src;
- FramepackContext *s = outlink->src->priv;
+ AVFilterContext *ctx = outlink->src;
+ FramepackContext *s = outlink->src->priv;
- int width = ctx->inputs[LEFT]->w;
- int height = ctx->inputs[LEFT]->h;
- AVRational time_base = ctx->inputs[LEFT]->time_base;
+ int width = ctx->inputs[LEFT]->w;
+ int height = ctx->inputs[LEFT]->h;
+ AVRational time_base = ctx->inputs[LEFT]->time_base;
AVRational frame_rate = ctx->inputs[LEFT]->frame_rate;
// check size and fps match on the other input
// modify output properties as needed
switch (s->format) {
case AV_STEREO3D_FRAMESEQUENCE:
- time_base.den *= 2;
+ time_base.den *= 2;
frame_rate.num *= 2;
s->double_pts = AV_NOPTS_VALUE;
return AVERROR_INVALIDDATA;
}
- outlink->w = width;
- outlink->h = height;
- outlink->time_base = time_base;
- outlink->frame_rate= frame_rate;
+ outlink->w = width;
+ outlink->h = height;
+ outlink->time_base = time_base;
+ outlink->frame_rate = frame_rate;
return 0;
}
}
}
+static int try_push_frame(AVFilterContext *ctx);
+
static int filter_frame_left(AVFilterLink *inlink, AVFrame *frame)
{
FramepackContext *s = inlink->dst->priv;
s->input_views[LEFT] = frame;
- return 0;
+ return try_push_frame(inlink->dst);
}
static int filter_frame_right(AVFilterLink *inlink, AVFrame *frame)
{
FramepackContext *s = inlink->dst->priv;
s->input_views[RIGHT] = frame;
- return 0;
+ return try_push_frame(inlink->dst);
}
static int request_frame(AVFilterLink *outlink)
{
AVFilterContext *ctx = outlink->src;
FramepackContext *s = ctx->priv;
- AVStereo3D *stereo;
int ret, i;
/* get a frame on the either input, stop as soon as a video ends */
return ret;
}
}
+ return 0;
+}
+
+static int try_push_frame(AVFilterContext *ctx)
+{
+ FramepackContext *s = ctx->priv;
+ AVFilterLink *outlink = ctx->outputs[0];
+ AVStereo3D *stereo;
+ int ret, i;
+ if (!(s->input_views[0] && s->input_views[1]))
+ return 0;
if (s->format == AV_STEREO3D_FRAMESEQUENCE) {
if (s->double_pts == AV_NOPTS_VALUE)
s->double_pts = s->input_views[LEFT]->pts;