Signed-off-by: Lukasz Marek <lukasz.m.luki2@gmail.com>tags/n2.6
| @@ -15,6 +15,10 @@ libavutil: 2014-08-09 | |||
| API changes, most recent first: | |||
| 2015-01-11 - xxxxxxx - lavd 56.4.100 - avdevice.h | |||
| Add avdevice_list_input_sources(). | |||
| Add avdevice_list_output_sinks(). | |||
| 201x-xx-xx - xxxxxxx - lavc 56.10.0 - vdpau.h | |||
| Add av_vdpau_get_surface_parameters(). | |||
| @@ -7,6 +7,7 @@ HEADERS = avdevice.h \ | |||
| OBJS = alldevices.o \ | |||
| avdevice.o \ | |||
| utils.o \ | |||
| # input/output devices | |||
| OBJS-$(CONFIG_ALSA_INDEV) += alsa-audio-common.o \ | |||
| @@ -21,6 +21,7 @@ | |||
| #include "libavutil/pixfmt.h" | |||
| #include "libavcodec/avcodec.h" | |||
| #include "avdevice.h" | |||
| #include "internal.h" | |||
| #include "config.h" | |||
| #include "libavutil/ffversion.h" | |||
| @@ -208,6 +209,44 @@ int avdevice_list_devices(AVFormatContext *s, AVDeviceInfoList **device_list) | |||
| return ret; | |||
| } | |||
| static int list_devices_for_context(AVFormatContext *s, AVDictionary *options, | |||
| AVDeviceInfoList **device_list) | |||
| { | |||
| AVDictionary *tmp = NULL; | |||
| int ret; | |||
| av_dict_copy(&tmp, options, 0); | |||
| if ((ret = av_opt_set_dict2(s, &tmp, AV_OPT_SEARCH_CHILDREN)) < 0) | |||
| goto fail; | |||
| ret = avdevice_list_devices(s, device_list); | |||
| fail: | |||
| av_dict_free(&tmp); | |||
| avformat_free_context(s); | |||
| return ret; | |||
| } | |||
| int avdevice_list_input_sources(AVInputFormat *device, const char *device_name, | |||
| AVDictionary *device_options, AVDeviceInfoList **device_list) | |||
| { | |||
| AVFormatContext *s = NULL; | |||
| int ret; | |||
| if ((ret = ff_alloc_input_device_context(&s, device, device_name)) < 0) | |||
| return ret; | |||
| return list_devices_for_context(s, device_options, device_list); | |||
| } | |||
| int avdevice_list_output_sinks(AVOutputFormat *device, const char *device_name, | |||
| AVDictionary *device_options, AVDeviceInfoList **device_list) | |||
| { | |||
| AVFormatContext *s = NULL; | |||
| int ret; | |||
| if ((ret = avformat_alloc_output_context2(&s, device, device_name, NULL)) < 0) | |||
| return ret; | |||
| return list_devices_for_context(s, device_options, device_list); | |||
| } | |||
| void avdevice_free_list_devices(AVDeviceInfoList **device_list) | |||
| { | |||
| AVDeviceInfoList *list; | |||
| @@ -484,4 +484,26 @@ int avdevice_list_devices(struct AVFormatContext *s, AVDeviceInfoList **device_l | |||
| */ | |||
| void avdevice_free_list_devices(AVDeviceInfoList **device_list); | |||
| /** | |||
| * List devices. | |||
| * | |||
| * Returns available device names and their parameters. | |||
| * These are convinient wrappers for avdevice_list_devices(). | |||
| * Device context is allocated and deallocated internally. | |||
| * | |||
| * @param device device format. May be NULL if device name is set. | |||
| * @param device_name device name. May be NULL if device format is set. | |||
| * @param device_options An AVDictionary filled with device-private options. May be NULL. | |||
| * The same options must be passed later to avformat_write_header() for output | |||
| * devices or avformat_open_input() for input devices, or at any other place | |||
| * that affects device-private options. | |||
| * @param[out] device_list list of autodetected devices | |||
| * @return count of autodetected devices, negative on error. | |||
| * @note device argument takes precedence over device_name when both are set. | |||
| */ | |||
| int avdevice_list_input_sources(struct AVInputFormat *device, const char *device_name, | |||
| AVDictionary *device_options, AVDeviceInfoList **device_list); | |||
| int avdevice_list_output_sinks(struct AVOutputFormat *device, const char *device_name, | |||
| AVDictionary *device_options, AVDeviceInfoList **device_list); | |||
| #endif /* AVDEVICE_AVDEVICE_H */ | |||
| @@ -0,0 +1,27 @@ | |||
| /* | |||
| * This file is part of FFmpeg. | |||
| * | |||
| * FFmpeg is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU Lesser General Public | |||
| * License as published by the Free Software Foundation; either | |||
| * version 2.1 of the License, or (at your option) any later version. | |||
| * | |||
| * FFmpeg is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
| * Lesser General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU Lesser General Public | |||
| * License along with FFmpeg; if not, write to the Free Software | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| #ifndef AVDEVICE_INTERNAL_H | |||
| #define AVDEVICE_INTERNAL_H | |||
| #include "libavformat/avformat.h" | |||
| int ff_alloc_input_device_context(struct AVFormatContext **avctx, struct AVInputFormat *iformat, | |||
| const char *format); | |||
| #endif | |||
| @@ -0,0 +1,59 @@ | |||
| /* | |||
| * This file is part of FFmpeg. | |||
| * | |||
| * FFmpeg is free software; you can redistribute it and/or | |||
| * modify it under the terms of the GNU Lesser General Public | |||
| * License as published by the Free Software Foundation; either | |||
| * version 2.1 of the License, or (at your option) any later version. | |||
| * | |||
| * FFmpeg is distributed in the hope that it will be useful, | |||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||
| * Lesser General Public License for more details. | |||
| * | |||
| * You should have received a copy of the GNU Lesser General Public | |||
| * License along with FFmpeg; if not, write to the Free Software | |||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||
| */ | |||
| #include "internal.h" | |||
| #include "libavutil/opt.h" | |||
| #include "libavformat/avformat.h" | |||
| int ff_alloc_input_device_context(AVFormatContext **avctx, AVInputFormat *iformat, const char *format) | |||
| { | |||
| AVFormatContext *s; | |||
| int ret = 0; | |||
| *avctx = NULL; | |||
| if (!iformat && !format) | |||
| return AVERROR(EINVAL); | |||
| if (!(s = avformat_alloc_context())) | |||
| return AVERROR(ENOMEM); | |||
| if (!iformat) | |||
| iformat = av_find_input_format(format); | |||
| if (!iformat || !iformat->priv_class || !AV_IS_INPUT_DEVICE(iformat->priv_class->category)) { | |||
| ret = AVERROR(EINVAL); | |||
| goto error; | |||
| } | |||
| s->iformat = iformat; | |||
| if (s->iformat->priv_data_size > 0) { | |||
| s->priv_data = av_mallocz(s->iformat->priv_data_size); | |||
| if (!s->priv_data) { | |||
| ret = AVERROR(ENOMEM); | |||
| goto error; | |||
| } | |||
| if (s->iformat->priv_class) { | |||
| *(const AVClass**)s->priv_data= s->iformat->priv_class; | |||
| av_opt_set_defaults(s->priv_data); | |||
| } | |||
| } else | |||
| s->priv_data = NULL; | |||
| *avctx = s; | |||
| return 0; | |||
| error: | |||
| avformat_free_context(s); | |||
| return ret; | |||
| } | |||
| @@ -28,7 +28,7 @@ | |||
| #include "libavutil/version.h" | |||
| #define LIBAVDEVICE_VERSION_MAJOR 56 | |||
| #define LIBAVDEVICE_VERSION_MINOR 3 | |||
| #define LIBAVDEVICE_VERSION_MINOR 4 | |||
| #define LIBAVDEVICE_VERSION_MICRO 100 | |||
| #define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \ | |||