This reverts committags/n4.00fd475704e. Revert "lavd: fix iterating of input and output devices" This reverts commitce1d77a5e7. Signed-off-by: Josh de Kock <josh@itanimul.li>
| @@ -144,8 +144,7 @@ distclean:: clean | |||
| version.h libavutil/ffversion.h libavcodec/codec_names.h \ | |||
| libavcodec/bsf_list.c libavformat/protocol_list.c \ | |||
| libavcodec/codec_list.c libavcodec/parser_list.c \ | |||
| libavformat/muxer_list.c libavformat/demuxer_list.c \ | |||
| libavdevice/indev_list.c libavdevice/outdev_list.c | |||
| libavformat/muxer_list.c libavformat/demuxer_list.c | |||
| ifeq ($(SRC_LINK),src) | |||
| $(RM) src | |||
| endif | |||
| @@ -3622,12 +3622,21 @@ for v in "$@"; do | |||
| FFMPEG_CONFIGURATION="${FFMPEG_CONFIGURATION# } ${l}${r}" | |||
| done | |||
| find_things(){ | |||
| thing=$1 | |||
| pattern=$2 | |||
| file=$source_path/$3 | |||
| sed -n "s/^[^#]*$pattern.*([^,]*, *\([^,]*\)\(,.*\)*).*/\1_$thing/p" "$file" | |||
| } | |||
| OUTDEV_LIST=$(find_things outdev OUTDEV libavdevice/alldevices.c) | |||
| INDEV_LIST=$(find_things indev _IN libavdevice/alldevices.c) | |||
| find_things_extern(){ | |||
| thing=$1 | |||
| pattern=$2 | |||
| file=$source_path/$3 | |||
| out=${4:-$thing} | |||
| sed -n "s/^[^#]*extern.*$pattern *ff_\([^ ]*\)_$thing;/\1_$out/p" "$file" | |||
| sed -n "s/^[^#]*extern.*$pattern *ff_\([^ ]*\)_$thing;/\1_$thing/p" "$file" | |||
| } | |||
| find_filters_extern(){ | |||
| @@ -3637,8 +3646,6 @@ find_filters_extern(){ | |||
| } | |||
| FILTER_LIST=$(find_filters_extern libavfilter/allfilters.c) | |||
| OUTDEV_LIST=$(find_things_extern muxer AVOutputFormat libavdevice/alldevices.c outdev) | |||
| INDEV_LIST=$(find_things_extern demuxer AVInputFormat libavdevice/alldevices.c indev) | |||
| MUXER_LIST=$(find_things_extern muxer AVOutputFormat libavformat/allformats.c) | |||
| DEMUXER_LIST=$(find_things_extern demuxer AVInputFormat libavformat/allformats.c) | |||
| ENCODER_LIST=$(find_things_extern encoder AVCodec libavcodec/allcodecs.c) | |||
| @@ -7172,12 +7179,6 @@ print_enabled_components(){ | |||
| filter_list) | |||
| c=$(full_filter_name $(remove_suffix _filter $c)) | |||
| ;; | |||
| indev_list) | |||
| c=$(add_suffix _demuxer $(remove_suffix _indev $c)) | |||
| ;; | |||
| outdev_list) | |||
| c=$(add_suffix _muxer $(remove_suffix _outdev $c)) | |||
| ;; | |||
| esac | |||
| printf " &ff_%s,\n" $c >> $TMPH | |||
| fi | |||
| @@ -7195,8 +7196,6 @@ print_enabled_components libavfilter/filter_list.c AVFilter filter_list $FILTER_ | |||
| print_enabled_components libavcodec/codec_list.c AVCodec codec_list $CODEC_LIST | |||
| print_enabled_components libavcodec/parser_list.c AVCodecParser parser_list $PARSER_LIST | |||
| print_enabled_components libavcodec/bsf_list.c AVBitStreamFilter bitstream_filters $BSF_LIST | |||
| print_enabled_components libavdevice/indev_list.c AVInputFormat indev_list $INDEV_LIST | |||
| print_enabled_components libavdevice/outdev_list.c AVOutputFormat outdev_list $OUTDEV_LIST | |||
| print_enabled_components libavformat/demuxer_list.c AVInputFormat demuxer_list $DEMUXER_LIST | |||
| print_enabled_components libavformat/muxer_list.c AVOutputFormat muxer_list $MUXER_LIST | |||
| print_enabled_components libavformat/protocol_list.c URLProtocol url_protocols $PROTOCOL_LIST | |||
| @@ -56,11 +56,6 @@ API changes, most recent first: | |||
| 2018-02-xx - xxxxxxx - lavc 58.11.100 - avcodec.h | |||
| Add AVCodecContext.extra_hw_frames. | |||
| 2018-02-06 - 0fd475704e - lavd 58.1.100 - avdevice.h | |||
| Deprecate use of av_input_audio_device_next(), av_input_video_device_next(), | |||
| av_output_audio_device_next(), av_output_video_device_next(). | |||
| Add av_indev_iterate(), and av_outdev_iterate(). | |||
| 2018-xx-xx - xxxxxxx - lavf 58.9.100 - avformat.h | |||
| Deprecate use of av_register_input_format(), av_register_output_format(), | |||
| av_register_all(), av_iformat_next(), av_oformat_next(). | |||
| @@ -1,2 +0,0 @@ | |||
| /indev_list.c | |||
| /outdev_list.c | |||
| @@ -22,150 +22,57 @@ | |||
| #include "libavutil/thread.h" | |||
| #include "avdevice.h" | |||
| #if FF_API_NEXT | |||
| #include "libavformat/internal.h" | |||
| #endif | |||
| /* devices */ | |||
| extern AVInputFormat ff_alsa_demuxer; | |||
| extern AVOutputFormat ff_alsa_muxer; | |||
| extern AVInputFormat ff_android_camera_demuxer; | |||
| extern AVInputFormat ff_avfoundation_demuxer; | |||
| extern AVInputFormat ff_bktr_demuxer; | |||
| extern AVOutputFormat ff_caca_muxer; | |||
| extern AVInputFormat ff_decklink_demuxer; | |||
| extern AVOutputFormat ff_decklink_muxer; | |||
| extern AVInputFormat ff_libndi_newtek_demuxer; | |||
| extern AVOutputFormat ff_libndi_newtek_muxer; | |||
| extern AVInputFormat ff_dshow_demuxer; | |||
| extern AVInputFormat ff_fbdev_demuxer; | |||
| extern AVOutputFormat ff_fbdev_muxer; | |||
| extern AVInputFormat ff_gdigrab_demuxer; | |||
| extern AVInputFormat ff_iec61883_demuxer; | |||
| extern AVInputFormat ff_jack_demuxer; | |||
| extern AVInputFormat ff_kmsgrab_demuxer; | |||
| extern AVInputFormat ff_lavfi_demuxer; | |||
| extern AVInputFormat ff_openal_demuxer; | |||
| extern AVOutputFormat ff_opengl_muxer; | |||
| extern AVInputFormat ff_oss_demuxer; | |||
| extern AVOutputFormat ff_oss_muxer; | |||
| extern AVInputFormat ff_pulse_demuxer; | |||
| extern AVOutputFormat ff_pulse_muxer; | |||
| extern AVOutputFormat ff_sdl2_muxer; | |||
| extern AVInputFormat ff_sndio_demuxer; | |||
| extern AVOutputFormat ff_sndio_muxer; | |||
| extern AVInputFormat ff_v4l2_demuxer; | |||
| extern AVOutputFormat ff_v4l2_muxer; | |||
| extern AVInputFormat ff_vfwcap_demuxer; | |||
| extern AVInputFormat ff_xcbgrab_demuxer; | |||
| extern AVOutputFormat ff_xv_muxer; | |||
| /* external libraries */ | |||
| extern AVInputFormat ff_libcdio_demuxer; | |||
| extern AVInputFormat ff_libdc1394_demuxer; | |||
| #include "libavdevice/outdev_list.c" | |||
| #include "libavdevice/indev_list.c" | |||
| const AVOutputFormat *av_outdev_iterate(void **opaque) | |||
| { | |||
| uintptr_t i = (uintptr_t)*opaque; | |||
| const AVOutputFormat *f = outdev_list[i]; | |||
| if (f) | |||
| *opaque = (void*)(i + 1); | |||
| return f; | |||
| } | |||
| const AVInputFormat *av_indev_iterate(void **opaque) | |||
| { | |||
| uintptr_t i = (uintptr_t)*opaque; | |||
| const AVInputFormat *f = indev_list[i]; | |||
| if (f) | |||
| *opaque = (void*)(i + 1); | |||
| return f; | |||
| } | |||
| #if FF_API_NEXT | |||
| FF_DISABLE_DEPRECATION_WARNINGS | |||
| static AVOnce av_device_next_init = AV_ONCE_INIT; | |||
| static void av_device_init_next(void) | |||
| { | |||
| AVOutputFormat *prevout = NULL, *out; | |||
| AVInputFormat *previn = NULL, *in; | |||
| void *i = 0; | |||
| while ((out = (AVOutputFormat*)av_outdev_iterate(&i))) { | |||
| if (prevout) | |||
| prevout->next = out; | |||
| prevout = out; | |||
| #define REGISTER_OUTDEV(X, x) \ | |||
| { \ | |||
| extern AVOutputFormat ff_##x##_muxer; \ | |||
| if (CONFIG_##X##_OUTDEV) \ | |||
| av_register_output_format(&ff_##x##_muxer); \ | |||
| } | |||
| i = 0; | |||
| while ((in = (AVInputFormat*)av_indev_iterate(&i))) { | |||
| if (previn) | |||
| previn->next = in; | |||
| previn = in; | |||
| #define REGISTER_INDEV(X, x) \ | |||
| { \ | |||
| extern AVInputFormat ff_##x##_demuxer; \ | |||
| if (CONFIG_##X##_INDEV) \ | |||
| av_register_input_format(&ff_##x##_demuxer); \ | |||
| } | |||
| avpriv_register_devices(outdev_list, indev_list); | |||
| } | |||
| void avdevice_register_all(void) | |||
| { | |||
| ff_thread_once(&av_device_next_init, av_device_init_next); | |||
| } | |||
| static void *device_next(void *prev, int output, | |||
| AVClassCategory c1, AVClassCategory c2) | |||
| { | |||
| const AVClass *pc; | |||
| AVClassCategory category = AV_CLASS_CATEGORY_NA; | |||
| ff_thread_once(&av_device_next_init, av_device_init_next); | |||
| do { | |||
| if (output) { | |||
| if (!(prev = prev ? ((AVOutputFormat *)prev)->next : (void*)outdev_list[0])) | |||
| break; | |||
| pc = ((AVOutputFormat *)prev)->priv_class; | |||
| } else { | |||
| if (!(prev = prev ? ((AVInputFormat *)prev)->next : (void*)indev_list[0])) | |||
| break; | |||
| pc = ((AVInputFormat *)prev)->priv_class; | |||
| } | |||
| if (!pc) | |||
| continue; | |||
| category = pc->category; | |||
| } while (category != c1 && category != c2); | |||
| return prev; | |||
| } | |||
| AVInputFormat *av_input_audio_device_next(AVInputFormat *d) | |||
| { | |||
| return device_next(d, 0, AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, | |||
| AV_CLASS_CATEGORY_DEVICE_INPUT); | |||
| } | |||
| #define REGISTER_INOUTDEV(X, x) REGISTER_OUTDEV(X, x); REGISTER_INDEV(X, x) | |||
| AVInputFormat *av_input_video_device_next(AVInputFormat *d) | |||
| static void register_all(void) | |||
| { | |||
| return device_next(d, 0, AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, | |||
| AV_CLASS_CATEGORY_DEVICE_INPUT); | |||
| /* devices */ | |||
| REGISTER_INOUTDEV(ALSA, alsa); | |||
| REGISTER_INDEV (AVFOUNDATION, avfoundation); | |||
| REGISTER_INDEV (BKTR, bktr); | |||
| REGISTER_OUTDEV (CACA, caca); | |||
| REGISTER_INOUTDEV(DECKLINK, decklink); | |||
| REGISTER_INOUTDEV(LIBNDI_NEWTEK, libndi_newtek); | |||
| REGISTER_INDEV (DSHOW, dshow); | |||
| REGISTER_INOUTDEV(FBDEV, fbdev); | |||
| REGISTER_INDEV (GDIGRAB, gdigrab); | |||
| REGISTER_INDEV (IEC61883, iec61883); | |||
| REGISTER_INDEV (JACK, jack); | |||
| REGISTER_INDEV (KMSGRAB, kmsgrab); | |||
| REGISTER_INDEV (LAVFI, lavfi); | |||
| REGISTER_INDEV (OPENAL, openal); | |||
| REGISTER_OUTDEV (OPENGL, opengl); | |||
| REGISTER_INOUTDEV(OSS, oss); | |||
| REGISTER_INOUTDEV(PULSE, pulse); | |||
| REGISTER_OUTDEV (SDL2, sdl2); | |||
| REGISTER_INOUTDEV(SNDIO, sndio); | |||
| REGISTER_INOUTDEV(V4L2, v4l2); | |||
| REGISTER_INDEV (VFWCAP, vfwcap); | |||
| REGISTER_INDEV (XCBGRAB, xcbgrab); | |||
| REGISTER_OUTDEV (XV, xv); | |||
| /* external libraries */ | |||
| REGISTER_INDEV (LIBCDIO, libcdio); | |||
| REGISTER_INDEV (LIBDC1394, libdc1394); | |||
| } | |||
| AVOutputFormat *av_output_audio_device_next(AVOutputFormat *d) | |||
| void avdevice_register_all(void) | |||
| { | |||
| return device_next(d, 1, AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, | |||
| AV_CLASS_CATEGORY_DEVICE_OUTPUT); | |||
| } | |||
| static AVOnce control = AV_ONCE_INIT; | |||
| AVOutputFormat *av_output_video_device_next(AVOutputFormat *d) | |||
| { | |||
| return device_next(d, 1, AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, | |||
| AV_CLASS_CATEGORY_DEVICE_OUTPUT); | |||
| ff_thread_once(&control, register_all); | |||
| } | |||
| FF_DISABLE_DEPRECATION_WARNINGS | |||
| #endif | |||
| @@ -78,6 +78,52 @@ const char * avdevice_license(void) | |||
| return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1; | |||
| } | |||
| static void *device_next(void *prev, int output, | |||
| AVClassCategory c1, AVClassCategory c2) | |||
| { | |||
| const AVClass *pc; | |||
| AVClassCategory category = AV_CLASS_CATEGORY_NA; | |||
| do { | |||
| if (output) { | |||
| if (!(prev = av_oformat_next(prev))) | |||
| break; | |||
| pc = ((AVOutputFormat *)prev)->priv_class; | |||
| } else { | |||
| if (!(prev = av_iformat_next(prev))) | |||
| break; | |||
| pc = ((AVInputFormat *)prev)->priv_class; | |||
| } | |||
| if (!pc) | |||
| continue; | |||
| category = pc->category; | |||
| } while (category != c1 && category != c2); | |||
| return prev; | |||
| } | |||
| AVInputFormat *av_input_audio_device_next(AVInputFormat *d) | |||
| { | |||
| return device_next(d, 0, AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT, | |||
| AV_CLASS_CATEGORY_DEVICE_INPUT); | |||
| } | |||
| AVInputFormat *av_input_video_device_next(AVInputFormat *d) | |||
| { | |||
| return device_next(d, 0, AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT, | |||
| AV_CLASS_CATEGORY_DEVICE_INPUT); | |||
| } | |||
| AVOutputFormat *av_output_audio_device_next(AVOutputFormat *d) | |||
| { | |||
| return device_next(d, 1, AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT, | |||
| AV_CLASS_CATEGORY_DEVICE_OUTPUT); | |||
| } | |||
| AVOutputFormat *av_output_video_device_next(AVOutputFormat *d) | |||
| { | |||
| return device_next(d, 1, AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT, | |||
| AV_CLASS_CATEGORY_DEVICE_OUTPUT); | |||
| } | |||
| int avdevice_app_to_dev_control_message(struct AVFormatContext *s, enum AVAppToDevMessageType type, | |||
| void *data, size_t data_size) | |||
| { | |||
| @@ -65,29 +65,6 @@ const char *avdevice_configuration(void); | |||
| */ | |||
| const char *avdevice_license(void); | |||
| /** | |||
| * Iterate over all registered output devices. | |||
| * | |||
| * @param opaque a pointer where libavdevice will store the iteration state. Must | |||
| * point to NULL to start the iteration. | |||
| * | |||
| * @return the next registered output device or NULL when the iteration is | |||
| * finished | |||
| */ | |||
| const AVOutputFormat *av_outdev_iterate(void **opaque); | |||
| /** | |||
| * Iterate over all registered input devices. | |||
| * | |||
| * @param opaque a pointer where libavdevice will store the iteration state. Must | |||
| * point to NULL to start the iteration. | |||
| * | |||
| * @return the next registered input device or NULL when the iteration is | |||
| * finished | |||
| */ | |||
| const AVInputFormat *av_indev_iterate(void **opaque); | |||
| #if FF_API_NEXT | |||
| /** | |||
| * Initialize libavdevice and register all the input and output devices. | |||
| */ | |||
| @@ -100,7 +77,6 @@ void avdevice_register_all(void); | |||
| * if d is non-NULL, returns the next registered input audio/video device after d | |||
| * or NULL if d is the last one. | |||
| */ | |||
| attribute_deprecated | |||
| AVInputFormat *av_input_audio_device_next(AVInputFormat *d); | |||
| /** | |||
| @@ -110,7 +86,6 @@ AVInputFormat *av_input_audio_device_next(AVInputFormat *d); | |||
| * if d is non-NULL, returns the next registered input audio/video device after d | |||
| * or NULL if d is the last one. | |||
| */ | |||
| attribute_deprecated | |||
| AVInputFormat *av_input_video_device_next(AVInputFormat *d); | |||
| /** | |||
| @@ -120,7 +95,6 @@ AVInputFormat *av_input_video_device_next(AVInputFormat *d); | |||
| * if d is non-NULL, returns the next registered output audio/video device after d | |||
| * or NULL if d is the last one. | |||
| */ | |||
| attribute_deprecated | |||
| AVOutputFormat *av_output_audio_device_next(AVOutputFormat *d); | |||
| /** | |||
| @@ -130,9 +104,7 @@ AVOutputFormat *av_output_audio_device_next(AVOutputFormat *d); | |||
| * if d is non-NULL, returns the next registered output audio/video device after d | |||
| * or NULL if d is the last one. | |||
| */ | |||
| attribute_deprecated | |||
| AVOutputFormat *av_output_video_device_next(AVOutputFormat *d); | |||
| #endif | |||
| typedef struct AVDeviceRect { | |||
| int x; /**< x coordinate of top left corner */ | |||
| @@ -47,8 +47,4 @@ | |||
| * the public API and may change, break or disappear at any time. | |||
| */ | |||
| #ifndef FF_API_NEXT | |||
| #define FF_API_NEXT (LIBAVDEVICE_VERSION_MAJOR < 59) | |||
| #endif | |||
| #endif /* AVDEVICE_VERSION_H */ | |||
| @@ -25,9 +25,6 @@ | |||
| #include "rdt.h" | |||
| #include "url.h" | |||
| #include "version.h" | |||
| #if FF_API_NEXT | |||
| #include "internal.h" | |||
| #endif | |||
| /* (de)muxers */ | |||
| extern AVOutputFormat ff_a64_muxer; | |||
| @@ -491,7 +488,6 @@ const AVOutputFormat *av_muxer_iterate(void **opaque) | |||
| { | |||
| uintptr_t i = (uintptr_t)*opaque; | |||
| const AVOutputFormat *f = muxer_list[i]; | |||
| if (f) | |||
| *opaque = (void*)(i + 1); | |||
| return f; | |||
| @@ -510,9 +506,6 @@ const AVInputFormat *av_demuxer_iterate(void **opaque){ | |||
| FF_DISABLE_DEPRECATION_WARNINGS | |||
| static AVOnce av_format_next_init = AV_ONCE_INIT; | |||
| static const AVInputFormat * const *indev_list = NULL; | |||
| static const AVOutputFormat * const *outdev_list = NULL; | |||
| static void av_format_init_next(void) | |||
| { | |||
| AVOutputFormat *prevout = NULL, *out; | |||
| @@ -525,61 +518,30 @@ static void av_format_init_next(void) | |||
| prevout = out; | |||
| } | |||
| if (outdev_list) { | |||
| for (int j = 0; (out = (AVOutputFormat*)outdev_list[j]); j++) { | |||
| if (prevout) | |||
| prevout->next = out; | |||
| prevout = out; | |||
| } | |||
| } | |||
| i = 0; | |||
| while ((in = (AVInputFormat*)av_demuxer_iterate(&i))) { | |||
| if (previn) | |||
| previn->next = in; | |||
| previn = in; | |||
| } | |||
| if (indev_list) { | |||
| for (int j = 0; (in = (AVInputFormat*)indev_list[j]); j++) { | |||
| if (previn) | |||
| previn->next = in; | |||
| previn = in; | |||
| } | |||
| } | |||
| } | |||
| void avpriv_register_devices(const AVOutputFormat * const o[], const AVInputFormat * const i[]) | |||
| { | |||
| static AVMutex avpriv_register_devices_mutex = AV_MUTEX_INITIALIZER; | |||
| ff_mutex_lock(&avpriv_register_devices_mutex); | |||
| outdev_list = o; | |||
| indev_list = i; | |||
| av_format_init_next(); | |||
| ff_mutex_unlock(&avpriv_register_devices_mutex); | |||
| } | |||
| AVInputFormat *av_iformat_next(const AVInputFormat *f) | |||
| { | |||
| ff_thread_once(&av_format_next_init, av_format_init_next); | |||
| if (f) | |||
| return f->next; | |||
| else | |||
| /* If there are no demuxers but input devices, then return the first input device. | |||
| * This will still return null if both there are both no demuxers or input devices. */ | |||
| return demuxer_list[0] ? (AVInputFormat*)demuxer_list[0] : (indev_list ? (AVInputFormat*)indev_list[0] : NULL); | |||
| return demuxer_list[0]; | |||
| } | |||
| AVOutputFormat *av_oformat_next(const AVOutputFormat *f) | |||
| { | |||
| ff_thread_once(&av_format_next_init, av_format_init_next); | |||
| if (f) | |||
| return f->next; | |||
| else | |||
| return muxer_list[0] ? (AVOutputFormat*)muxer_list[0] : (outdev_list ? (AVOutputFormat*)outdev_list[0] : NULL); | |||
| return muxer_list[0]; | |||
| } | |||
| void av_register_all(void) | |||
| @@ -129,18 +129,10 @@ enum AVCodecID av_guess_codec(AVOutputFormat *fmt, const char *short_name, | |||
| AVInputFormat *av_find_input_format(const char *short_name) | |||
| { | |||
| AVInputFormat *fmt = NULL; | |||
| #if FF_API_NEXT | |||
| FF_DISABLE_DEPRECATION_WARNINGS | |||
| while ((fmt = av_iformat_next(fmt))) | |||
| if (av_match_name(short_name, fmt->name)) | |||
| return fmt; | |||
| FF_ENABLE_DEPRECATION_WARNINGS | |||
| #else | |||
| void *i = 0; | |||
| while ((fmt = av_demuxer_iterate(&i))) | |||
| if (av_match_name(short_name, fmt->name)) | |||
| return fmt; | |||
| #endif | |||
| return NULL; | |||
| } | |||
| @@ -731,11 +731,4 @@ int ff_unlock_avformat(void); | |||
| */ | |||
| void ff_format_set_url(AVFormatContext *s, char *url); | |||
| #if FF_API_NEXT | |||
| /** | |||
| * Register devices in deprecated format linked list. | |||
| */ | |||
| void avpriv_register_devices(const AVOutputFormat * const o[], const AVInputFormat * const i[]); | |||
| #endif | |||
| #endif /* AVFORMAT_INTERNAL_H */ | |||