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, \ | |||