FFmpeg
Loading...
Searching...
No Matches
split.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2007 Bobby Bingham
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21/**
22 * @file
23 * audio and video splitter
24 */
25
26#include <stdio.h>
27
29#include "libavutil/avstring.h"
30#include "libavutil/internal.h"
31#include "libavutil/opt.h"
32
33#include "avfilter.h"
34#include "audio.h"
35#include "filters.h"
36#include "video.h"
37
38typedef struct SplitContext {
39 const AVClass *class;
42
44{
45 SplitContext *s = ctx->priv;
46 int i, ret;
47
48 for (i = 0; i < s->nb_outputs; i++) {
49 AVFilterPad pad = { 0 };
50
51 pad.type = ctx->filter->inputs[0].type;
52 pad.name = av_asprintf("output%d", i);
53 if (!pad.name)
54 return AVERROR(ENOMEM);
55
56 if ((ret = ff_append_outpad_free_name(ctx, &pad)) < 0)
57 return ret;
58 }
59
60 return 0;
61}
62
64{
65 AVFilterLink *inlink = ctx->inputs[0];
66 AVFrame *in;
67 int status, ret, nb_eofs = 0;
69
70 for (int i = 0; i < ctx->nb_outputs; i++)
71 nb_eofs += ff_outlink_get_status(ctx->outputs[i]) == AVERROR_EOF;
72
73 if (nb_eofs == ctx->nb_outputs) {
75 return 0;
76 }
77
78 ret = ff_inlink_consume_frame(inlink, &in);
79 if (ret < 0)
80 return ret;
81 if (ret > 0) {
82 for (int i = 0; i < ctx->nb_outputs; i++) {
83 AVFrame *buf_out;
84
85 if (ff_outlink_get_status(ctx->outputs[i]))
86 continue;
87 buf_out = av_frame_clone(in);
88 if (!buf_out) {
89 ret = AVERROR(ENOMEM);
90 break;
91 }
92
93 ret = ff_filter_frame(ctx->outputs[i], buf_out);
94 if (ret < 0)
95 break;
96 }
97
98 av_frame_free(&in);
99 if (ret < 0)
100 return ret;
101 return 0;
102 }
103
104 if (ff_inlink_acknowledge_status(inlink, &status, &pts)) {
105 for (int i = 0; i < ctx->nb_outputs; i++) {
106 if (ff_outlink_get_status(ctx->outputs[i]))
107 continue;
108 ff_outlink_set_status(ctx->outputs[i], status, pts);
109 }
110 return 0;
111 }
112
114
115 return FFERROR_NOT_READY;
116}
117
118#define OFFSET(x) offsetof(SplitContext, x)
119#define FLAGS (AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_FILTERING_PARAM)
120static const AVOption options[] = {
121 { "outputs", "set number of outputs", OFFSET(nb_outputs), AV_OPT_TYPE_INT, { .i64 = 2 }, 1, INT_MAX, FLAGS },
122 { NULL }
123};
124
126
128 .p.name = "split",
129 .p.description = NULL_IF_CONFIG_SMALL("Pass on the input to N video outputs."),
130 .p.priv_class = &split_class,
132 .priv_size = sizeof(SplitContext),
133 .init = split_init,
136};
137
139 .p.name = "asplit",
140 .p.description = NULL_IF_CONFIG_SMALL("Pass on the audio input to N audio outputs."),
141 .p.priv_class = &split_class,
143 .priv_size = sizeof(SplitContext),
144 .init = split_init,
147};
static char * split(char *message, char delim)
const FFFilter ff_vf_split
Definition split.c:127
const FFFilter ff_af_asplit
Definition split.c:138
const AVFilterPad ff_audio_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_AUDIO.
Definition audio.c:34
void ff_inlink_set_status(AVFilterLink *link, int status)
Set the status on an input link.
Definition avfilter.c:1632
int ff_outlink_get_status(AVFilterLink *link)
Get the status on an output link.
Definition avfilter.c:1648
int ff_inlink_acknowledge_status(AVFilterLink *link, int *rstatus, int64_t *rpts)
Test and acknowledge the change of status on the link.
Definition avfilter.c:1467
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition avfilter.c:1068
int ff_append_outpad_free_name(AVFilterContext *f, AVFilterPad *p)
Definition avfilter.c:143
int ff_inlink_consume_frame(AVFilterLink *link, AVFrame **rframe)
Take a frame from the link's FIFO and update the link's stats.
Definition avfilter.c:1520
Main libavfilter public API header.
char * av_asprintf(const char *fmt,...)
Definition avstring.c:115
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define s(width, name)
Definition cbs_vp9.c:198
#define FLAGS
Definition cmdutils.c:598
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition opt.h:258
#define AVFILTER_FLAG_DYNAMIC_OUTPUTS
The number of the filter outputs is not determined just by AVFilter.outputs.
Definition avfilter.h:161
#define AVFILTER_FLAG_METADATA_ONLY
The filter is a "metadata" filter - it does not modify the frame data in any way.
Definition avfilter.h:182
#define AVERROR_EOF
End of file.
Definition error.h:57
#define AVERROR(e)
Definition error.h:45
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition frame.c:64
AVFrame * av_frame_clone(const AVFrame *src)
Create a new frame that references the same data as src.
Definition frame.c:483
static int activate(AVBitStreamFilterContext *ctx)
#define FILTER_INPUTS(array)
Definition filters.h:264
#define FF_FILTER_FORWARD_WANTED_ANY(filter, inlink)
Forward the frame_wanted_out flag from any of the output links to an input link.
Definition filters.h:705
static void ff_outlink_set_status(AVFilterLink *link, int status, int64_t pts)
Set the status field of a link from the source filter.
Definition filters.h:629
#define FFERROR_NOT_READY
Filters implementation helper functions and internal structures.
Definition filters.h:34
#define AVFILTER_DEFINE_CLASS_EXT(name, desc, options)
Definition filters.h:470
Macro definitions for various function/variable attributes.
#define av_cold
Definition attributes.h:117
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
AVOptions.
static av_cold int split_init(AVFilterContext *ctx)
Definition split.c:43
static int activate(AVFilterContext *ctx)
Definition split.c:63
#define OFFSET(x)
Definition split.c:118
Describe the class of an AVClass context structure.
Definition log.h:76
An instance of a filter.
Definition avfilter.h:273
A filter pad used for either input or output.
Definition filters.h:40
enum AVMediaType type
AVFilterPad type.
Definition filters.h:51
const char * name
Pad name.
Definition filters.h:46
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
AVOption.
Definition opt.h:428
int nb_outputs
Definition split.c:40
static AVFormatContext * ctx
Definition movenc.c:49
static int64_t pts
const AVFilterPad ff_video_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_VIDEO.
Definition video.c:37