avformat/hlsenc: closed caption tags in the master playlist
[ffmpeg.git] / libavfilter / f_interleave.c
index 033bc62..d8a73b5 100644 (file)
 #include "libavutil/avassert.h"
 #include "libavutil/avstring.h"
 #include "libavutil/opt.h"
+
+#define FF_INTERNAL_FIELDS 1
+#include "framequeue.h"
+
 #include "avfilter.h"
 #include "bufferqueue.h"
 #include "formats.h"
@@ -33,7 +37,7 @@
 #include "audio.h"
 #include "video.h"
 
-typedef struct {
+typedef struct InterleaveContext {
     const AVClass *class;
     int nb_inputs;
     struct FFBufQueue *queues;
@@ -50,16 +54,16 @@ static const AVOption filt_name##_options[] = {                     \
 
 inline static int push_frame(AVFilterContext *ctx)
 {
-    InterleaveContext *interleave = ctx->priv;
+    InterleaveContext *s = ctx->priv;
     AVFrame *frame;
     int i, queue_idx = -1;
     int64_t pts_min = INT64_MAX;
 
     /* look for oldest frame */
     for (i = 0; i < ctx->nb_inputs; i++) {
-        struct FFBufQueue *q = &interleave->queues[i];
+        struct FFBufQueue *q = &s->queues[i];
 
-        if (!q->available && !ctx->inputs[i]->closed)
+        if (!q->available && !ctx->inputs[i]->status_out)
             return 0;
         if (q->available) {
             frame = ff_bufqueue_peek(q, 0);
@@ -74,7 +78,7 @@ inline static int push_frame(AVFilterContext *ctx)
     if (queue_idx < 0)
         return AVERROR_EOF;
 
-    frame = ff_bufqueue_get(&interleave->queues[queue_idx]);
+    frame = ff_bufqueue_get(&s->queues[queue_idx]);
     av_log(ctx, AV_LOG_DEBUG, "queue:%d -> frame time:%f\n",
            queue_idx, frame->pts * av_q2d(AV_TIME_BASE_Q));
     return ff_filter_frame(ctx->outputs[0], frame);
@@ -83,7 +87,7 @@ inline static int push_frame(AVFilterContext *ctx)
 static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
 {
     AVFilterContext *ctx = inlink->dst;
-    InterleaveContext *interleave = ctx->priv;
+    InterleaveContext *s = ctx->priv;
     unsigned in_no = FF_INLINK_IDX(inlink);
 
     if (frame->pts == AV_NOPTS_VALUE) {
@@ -96,23 +100,23 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
     /* queue frame */
     frame->pts = av_rescale_q(frame->pts, inlink->time_base, AV_TIME_BASE_Q);
     av_log(ctx, AV_LOG_DEBUG, "frame pts:%f -> queue idx:%d available:%d\n",
-           frame->pts * av_q2d(AV_TIME_BASE_Q), in_no, interleave->queues[in_no].available);
-    ff_bufqueue_add(ctx, &interleave->queues[in_no], frame);
+           frame->pts * av_q2d(AV_TIME_BASE_Q), in_no, s->queues[in_no].available);
+    ff_bufqueue_add(ctx, &s->queues[in_no], frame);
 
     return push_frame(ctx);
 }
 
-static int init(AVFilterContext *ctx)
+static av_cold int init(AVFilterContext *ctx)
 {
-    InterleaveContext *interleave = ctx->priv;
+    InterleaveContext *s = ctx->priv;
     const AVFilterPad *outpad = &ctx->filter->outputs[0];
-    int i;
+    int i, ret;
 
-    interleave->queues = av_calloc(interleave->nb_inputs, sizeof(interleave->queues[0]));
-    if (!interleave->queues)
+    s->queues = av_calloc(s->nb_inputs, sizeof(s->queues[0]));
+    if (!s->queues)
         return AVERROR(ENOMEM);
 
-    for (i = 0; i < interleave->nb_inputs; i++) {
+    for (i = 0; i < s->nb_inputs; i++) {
         AVFilterPad inpad = { 0 };
 
         inpad.name = av_asprintf("input%d", i);
@@ -129,7 +133,10 @@ static int init(AVFilterContext *ctx)
         default:
             av_assert0(0);
         }
-        ff_insert_inpad(ctx, i, &inpad);
+        if ((ret = ff_insert_inpad(ctx, i, &inpad)) < 0) {
+            av_freep(&inpad.name);
+            return ret;
+        }
     }
 
     return 0;
@@ -137,12 +144,12 @@ static int init(AVFilterContext *ctx)
 
 static av_cold void uninit(AVFilterContext *ctx)
 {
-    InterleaveContext *interleave = ctx->priv;
+    InterleaveContext *s = ctx->priv;
     int i;
 
     for (i = 0; i < ctx->nb_inputs; i++) {
-        ff_bufqueue_discard_all(&interleave->queues[i]);
-        av_freep(&interleave->queues[i]);
+        ff_bufqueue_discard_all(&s->queues[i]);
+        av_freep(&s->queues[i]);
         av_freep(&ctx->input_pads[i].name);
     }
 }
@@ -180,19 +187,17 @@ static int config_output(AVFilterLink *outlink)
             }
         }
     }
-
-    outlink->flags |= FF_LINK_FLAG_REQUEST_LOOP;
     return 0;
 }
 
 static int request_frame(AVFilterLink *outlink)
 {
     AVFilterContext *ctx = outlink->src;
-    InterleaveContext *interleave = ctx->priv;
+    InterleaveContext *s = ctx->priv;
     int i, ret;
 
     for (i = 0; i < ctx->nb_inputs; i++) {
-        if (!interleave->queues[i].available && !ctx->inputs[i]->closed) {
+        if (!s->queues[i].available && !ctx->inputs[i]->status_out) {
             ret = ff_request_frame(ctx->inputs[i]);
             if (ret != AVERROR_EOF)
                 return ret;
@@ -217,7 +222,7 @@ static const AVFilterPad interleave_outputs[] = {
     { NULL }
 };
 
-AVFilter avfilter_vf_interleave = {
+AVFilter ff_vf_interleave = {
     .name        = "interleave",
     .description = NULL_IF_CONFIG_SMALL("Temporally interleave video inputs."),
     .priv_size   = sizeof(InterleaveContext),
@@ -245,7 +250,7 @@ static const AVFilterPad ainterleave_outputs[] = {
     { NULL }
 };
 
-AVFilter avfilter_af_ainterleave = {
+AVFilter ff_af_ainterleave = {
     .name        = "ainterleave",
     .description = NULL_IF_CONFIG_SMALL("Temporally interleave audio inputs."),
     .priv_size   = sizeof(InterleaveContext),