FFmpeg
Loading...
Searching...
No Matches
source.c
Go to the documentation of this file.
1/*
2 * This file is part of FFmpeg.
3 *
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17 */
18
19/**
20 * @file
21 * Packet source. Heavily based on libavfilter/buffersrc.c
22 */
23
24#include <float.h>
25
27#include "libavutil/opt.h"
28
29#include "libavcodec/bsf.h"
31#include "libavcodec/packet.h"
33
34typedef struct SourceContext {
35 const AVClass *class;
37 AVRational time_base; ///< time_base to set in the output link
38
40 unsigned warning_limit;
41
42 int eof;
45
47{
48 SourceContext *s = ctx->priv_data;
49
50 return avcodec_parameters_copy(s->par, par);
51}
52
54{
55 int ret;
56
57 while (1) {
58 ret = ff_bsf_graph_run_once(graph);
59 if (ret == AVERROR(EAGAIN))
60 break;
61 if (ret < 0 && ret != FFERROR_SOURCE_EMPTY)
62 return ret;
63 }
64 return 0;
65}
66
68{
69 SourceContext *s = ctx->priv_data;
71 int ret;
72
73 s->nb_failed_requests = 0;
74
75 if (!pkt || AVPACKET_IS_EMPTY(pkt))
76 return av_bsf_source_close(ctx, s->last_pts, flags);
77 if (s->eof)
78 return AVERROR_EOF;
79
80 s->last_pts = pkt->pts + pkt->duration;
81
83 if (!copy)
84 return AVERROR(ENOMEM);
85
87 ret = av_packet_ref(copy, pkt);
88 if (ret < 0) {
90 return ret;
91 }
92 } else
94
95 ret = ff_bsf_filter_packet(ctx->outputs[0], copy);
96 if (ret < 0)
97 return ret;
98
100 ret = push_packet(ctx->graph);
101 if (ret < 0)
102 return ret;
103 }
104
105 BitStreamFilterLinkInternal *const li = ff_link_internal(ctx->outputs[0]);
106 if (s->warning_limit &&
107 av_container_fifo_can_read(li->fifo) >= s->warning_limit) {
109 "%d buffers queued in %s, something may be wrong.\n",
110 s->warning_limit,
111 (char *)av_x_if_null(ctx->name, ctx->filter->name));
112 s->warning_limit *= 10;
113 }
114
115 return 0;
116}
117
119{
120 SourceContext *s = ctx->priv_data;
121
122 s->eof = 1;
124 return 0;
125}
126
128{
129 SourceContext *s = ctx->priv_data;
130
131 if (!s->eof && ff_bsf_outlink_get_status(ctx->outputs[0]))
132 s->eof = 1;
133
134 return s->eof ? AVERROR(EOF) : 0;
135}
136
138{
139 SourceContext *c = ctx->priv_data;
140
142 if (!c->par)
143 return AVERROR(ENOMEM);
144
145 return 0;
146}
147
149{
150 SourceContext *c = ctx->priv_data;
151
152 if (av_q2d(c->time_base) <= 0) {
153 av_log(ctx, AV_LOG_ERROR, "Invalid time base %d/%d\n", c->time_base.num, c->time_base.den);
154 return AVERROR(EINVAL);
155 }
156
157 c->warning_limit = 100;
158 return 0;
159}
160
162{
163 return ((SourceContext *)buffer_src->priv_data)->nb_failed_requests;
164}
165
166#define OFFSET(x) offsetof(SourceContext, x)
167#define FLAGS (AV_OPT_FLAG_BSF_PARAM|AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_VIDEO_PARAM)
168static const AVOption buffer_options[] = {
169 { "time_base", NULL, OFFSET(time_base), AV_OPT_TYPE_RATIONAL, { .dbl = 0 }, 0, DBL_MAX, FLAGS },
170 { NULL },
171};
172
174
176{
177 SourceContext *s = ctx->priv_data;
179}
180
182{
183 SourceContext *c = link->src->priv_data;
184
185 link->time_base = c->time_base;
186 return avcodec_parameters_copy(link->par, c->par);
187}
188
190{
191 AVBitStreamFilterLink *outlink = ctx->outputs[0];
192 SourceContext *c = ctx->priv_data;
193
194 if (!c->eof && ff_bsf_outlink_get_status(outlink)) {
195 c->eof = 1;
196 return 0;
197 }
198
199 if (c->eof) {
200 ff_bsf_link_set_in_status(outlink, AVERROR_EOF, c->last_pts);
201 return 0;
202 }
203 c->nb_failed_requests++;
205}
206
208 {
209 .name = "default",
210 .config_props = config_props,
211 },
212};
213
215 .p.name = "source",
216 .p.priv_class = &buffer_class,
217 .priv_data_size = sizeof(SourceContext),
219 .preinit = preinit,
220 .init2 = init,
221 .uninit = uninit,
222
224};
const FFBitStreamFilter ff_source_bsf
Definition source.c:214
int ff_bsf_filter_packet(AVBitStreamFilterLink *link, AVPacket *pkt)
Send a packet of data to the next filter.
int ff_bsf_outlink_get_status(AVBitStreamFilterLink *link)
void ff_bsf_link_set_in_status(AVBitStreamFilterLink *link, int status, int64_t pts)
static BitStreamFilterLinkInternal * ff_link_internal(AVBitStreamFilterLink *link)
int ff_bsf_graph_run_once(AVBitStreamFilterGraph *graph)
Run one round of processing on a filter graph.
Definition bsfgraph.c:361
#define flags(name, subs,...)
Definition cbs_h264.c:74
#define s(width, name)
Definition cbs_vp9.c:198
#define FLAGS
Definition cmdutils.c:598
AVCodecParameters * avcodec_parameters_alloc(void)
Definition codec_par.c:57
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src)
Definition codec_par.c:107
void avcodec_parameters_free(AVCodecParameters **ppar)
Definition codec_par.c:67
size_t av_container_fifo_can_read(const AVContainerFifo *cf)
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
static AVPacket * pkt
int(* init)(AVBSFContext *ctx)
Definition dts2pts.c:608
@ AV_OPT_TYPE_RATIONAL
Underlying C type is AVRational.
Definition opt.h:279
int av_bsf_source_close(AVBitStreamFilterContext *ctx, int64_t pts, unsigned flags)
Close the source after EOF.
Definition source.c:118
int av_bsf_source_get_status(AVBitStreamFilterContext *ctx)
Returns 0 or a negative AVERROR code.
Definition source.c:127
int av_bsf_source_parameters_set(AVBitStreamFilterContext *ctx, const AVCodecParameters *par)
Initialize the source filter with the provided parameters.
Definition source.c:46
int attribute_align_arg av_bsf_source_add_packet(AVBitStreamFilterContext *ctx, AVPacket *pkt, int flags)
Add a packet to the buffer source.
Definition source.c:67
@ AV_BSF_SOURCE_FLAG_PUSH
Immediately push the packet to the output.
Definition bsf.h:594
@ AV_BSF_SOURCE_FLAG_KEEP_REF
Keep a reference to the packet.
Definition bsf.h:599
void av_packet_free(AVPacket **pkt)
Free the packet, if the packet is reference counted, it will be unreferenced first.
Definition packet.c:74
void av_packet_move_ref(AVPacket *dst, AVPacket *src)
Move every field in src to dst and reset src.
Definition packet.c:491
AVPacket * av_packet_alloc(void)
Allocate an AVPacket and set its fields to default values.
Definition packet.c:63
int av_packet_ref(AVPacket *dst, const AVPacket *src)
Setup a new reference to the data described by a given packet.
Definition packet.c:442
#define AVERROR_EOF
End of file.
Definition error.h:57
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition rational.h:104
static void * av_x_if_null(const void *p, const void *x)
Return x default pointer in case p is NULL.
Definition avutil.h:311
static av_cold void uninit(AVBitStreamFilterContext *ctx)
static int activate(AVBitStreamFilterContext *ctx)
#define BSF_DEFINE_CLASS(fname)
Definition filters.h:158
#define BSFILTER_OUTPUTS(array)
Definition filters.h:146
#define FFERROR_SOURCE_EMPTY
Definition filters.h:33
#define AVPACKET_IS_EMPTY(pkt)
#define av_cold
Definition attributes.h:117
#define attribute_align_arg
Definition internal.h:50
AVOptions.
static av_cold int preinit(AVBitStreamFilterContext *ctx)
Definition source.c:137
static av_cold void uninit(AVBitStreamFilterContext *ctx)
Definition source.c:175
static const AVBitStreamFilterPad source_outputs[]
Definition source.c:207
static const AVOption buffer_options[]
Definition source.c:168
static int config_props(AVBitStreamFilterLink *link)
Definition source.c:181
static int push_packet(AVBitStreamFilterGraph *graph)
Definition source.c:53
static int activate(AVBitStreamFilterContext *ctx)
Definition source.c:189
unsigned ff_bsf_source_get_nb_failed_requests(const AVBitStreamFilterContext *buffer_src)
Get the number of failed requests.
Definition source.c:161
#define OFFSET(x)
Definition source.c:166
An instance of a filter.
Definition bsf.h:347
void * priv_data
Opaque filter-specific private data.
Definition bsf.h:375
A filter pad used for either input or output.
Definition filters.h:35
Describe the class of an AVClass context structure.
Definition log.h:76
This struct describes the properties of an encoded stream.
Definition codec_par.h:49
AVOption.
Definition opt.h:428
This structure stores compressed data.
Definition packet.h:580
Rational number (pair of numerator and denominator).
Definition rational.h:58
AVContainerFifo * fifo
Queue of packets waiting to be filtered.
unsigned warning_limit
Definition source.c:40
int64_t last_pts
Definition source.c:43
unsigned nb_failed_requests
Definition source.c:39
AVCodecParameters * par
Definition source.c:36
AVRational time_base
time_base to set in the output link
Definition source.c:37
#define av_log(a,...)
static AVFormatContext * ctx
Definition movenc.c:49
static char buffer[20]
Definition seek.c:32
static int64_t pts
static void copy(const float *p1, float *p2, const int length)
static double c[64]