xref: /third_party/ffmpeg/libavdevice/utils.c (revision cabdff1a)
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, const 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