summaryrefslogtreecommitdiff
path: root/libavdevice/utils.c (plain)
blob: ccd731801244d026a07e86ab8a5b6db33b0f87ca
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#include "internal.h"
20#include "libavutil/opt.h"
21#include "libavformat/avformat.h"
22
23int ff_alloc_input_device_context(AVFormatContext **avctx, AVInputFormat *iformat, const char *format)
24{
25 AVFormatContext *s;
26 int ret = 0;
27
28 *avctx = NULL;
29 if (!iformat && !format)
30 return AVERROR(EINVAL);
31 if (!(s = avformat_alloc_context()))
32 return AVERROR(ENOMEM);
33
34 if (!iformat)
35 iformat = av_find_input_format(format);
36 if (!iformat || !iformat->priv_class || !AV_IS_INPUT_DEVICE(iformat->priv_class->category)) {
37 ret = AVERROR(EINVAL);
38 goto error;
39 }
40 s->iformat = iformat;
41 if (s->iformat->priv_data_size > 0) {
42 s->priv_data = av_mallocz(s->iformat->priv_data_size);
43 if (!s->priv_data) {
44 ret = AVERROR(ENOMEM);
45 goto error;
46 }
47 if (s->iformat->priv_class) {
48 *(const AVClass**)s->priv_data= s->iformat->priv_class;
49 av_opt_set_defaults(s->priv_data);
50 }
51 } else
52 s->priv_data = NULL;
53
54 *avctx = s;
55 return 0;
56 error:
57 avformat_free_context(s);
58 return ret;
59}
60