| 23 | #include "libavformat/demux.h" |
| 24 | |
| 25 | int ff_alloc_input_device_context(AVFormatContext **avctx, const AVInputFormat *iformat, const char *format) |
| 26 | { |
| 27 | AVFormatContext *s; |
| 28 | int ret = 0; |
| 29 | |
| 30 | *avctx = NULL; |
| 31 | if (!iformat && !format) |
| 32 | return AVERROR(EINVAL); |
| 33 | if (!(s = avformat_alloc_context())) |
| 34 | return AVERROR(ENOMEM); |
| 35 | |
| 36 | if (!iformat) |
| 37 | iformat = av_find_input_format(format); |
| 38 | if (!iformat || !iformat->priv_class || !AV_IS_INPUT_DEVICE(iformat->priv_class->category)) { |
| 39 | ret = AVERROR(EINVAL); |
| 40 | goto error; |
| 41 | } |
| 42 | s->iformat = iformat; |
| 43 | if (ffifmt(s->iformat)->priv_data_size > 0) { |
| 44 | s->priv_data = av_mallocz(ffifmt(s->iformat)->priv_data_size); |
| 45 | if (!s->priv_data) { |
| 46 | ret = AVERROR(ENOMEM); |
| 47 | goto error; |
| 48 | } |
| 49 | if (s->iformat->priv_class) { |
| 50 | *(const AVClass**)s->priv_data= s->iformat->priv_class; |
| 51 | av_opt_set_defaults(s->priv_data); |
| 52 | } |
| 53 | } else |
| 54 | s->priv_data = NULL; |
| 55 | |
| 56 | *avctx = s; |
| 57 | return 0; |
| 58 | error: |
| 59 | avformat_free_context(s); |
| 60 | return ret; |
| 61 | } |
no test coverage detected