]> git.sesse.net Git - ffmpeg/blobdiff - libavdevice/alldevices.c
kmsgrab: add category for kmsgrab
[ffmpeg] / libavdevice / alldevices.c
index b767b6a7188210ba62d223a33e8d0146aeb8ebc2..39993354bc4285b341c697e6cebc4664e22bab98 100644 (file)
 #include "libavutil/thread.h"
 #include "avdevice.h"
 
-#define REGISTER_OUTDEV(X, x)                                           \
-    {                                                                   \
-        extern AVOutputFormat ff_##x##_muxer;                           \
-        if (CONFIG_##X##_OUTDEV)                                        \
-            av_register_output_format(&ff_##x##_muxer);                 \
+#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_INDEV(X, x)                                            \
-    {                                                                   \
-        extern AVInputFormat ff_##x##_demuxer;                          \
-        if (CONFIG_##X##_INDEV)                                         \
-            av_register_input_format(&ff_##x##_demuxer);                \
+    i = 0;
+    while ((in = (AVInputFormat*)av_indev_iterate(&i))) {
+        if (previn)
+            previn->next = in;
+        previn = in;
     }
 
-#define REGISTER_INOUTDEV(X, x) REGISTER_OUTDEV(X, x); REGISTER_INDEV(X, x)
+    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 register_all(void)
+static void *device_next(void *prev, int output,
+                         AVClassCategory c1, AVClassCategory c2)
 {
-    /* 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);
+    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;
 }
 
-void avdevice_register_all(void)
+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)
 {
-    static AVOnce control = AV_ONCE_INIT;
+    return device_next(d, 1, AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT,
+                       AV_CLASS_CATEGORY_DEVICE_OUTPUT);
+}
 
-    ff_thread_once(&control, register_all);
+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_DISABLE_DEPRECATION_WARNINGS
+#endif
+