diff --git a/libavdevice/alsa-audio-dec.c b/libavdevice/alsa-audio-dec.c
index 03154b0b7c186ce1e15dbfd878df971ce0444ce5..2cdf356b92316b270db0bb4e326c2a391d467b8f 100644
--- a/libavdevice/alsa-audio-dec.c
+++ b/libavdevice/alsa-audio-dec.c
@@ -143,6 +143,7 @@ static const AVClass alsa_demuxer_class = {
     .item_name      = av_default_item_name,
     .option         = options,
     .version        = LIBAVUTIL_VERSION_INT,
+    .category       = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT,
 };
 
 AVInputFormat ff_alsa_demuxer = {
diff --git a/libavdevice/alsa-audio-enc.c b/libavdevice/alsa-audio-enc.c
index bf56fc46d72dbed9762a00edc2310d2655e30a16..e42cc8f5186bc33a2aecd74b50c405d6709af501 100644
--- a/libavdevice/alsa-audio-enc.c
+++ b/libavdevice/alsa-audio-enc.c
@@ -142,6 +142,13 @@ audio_get_output_timestamp(AVFormatContext *s1, int stream,
     *dts = s->timestamp - delay;
 }
 
+static const AVClass alsa_muxer_class = {
+    .class_name     = "ALSA muxer",
+    .item_name      = av_default_item_name,
+    .version        = LIBAVUTIL_VERSION_INT,
+    .category       = AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT,
+};
+
 AVOutputFormat ff_alsa_muxer = {
     .name           = "alsa",
     .long_name      = NULL_IF_CONFIG_SMALL("ALSA audio output"),
@@ -154,4 +161,5 @@ AVOutputFormat ff_alsa_muxer = {
     .write_uncoded_frame = audio_write_frame,
     .get_output_timestamp = audio_get_output_timestamp,
     .flags          = AVFMT_NOFILE,
+    .priv_class     = &alsa_muxer_class,
 };
diff --git a/libavdevice/bktr.c b/libavdevice/bktr.c
index 4e25aa6ad86a4c9dab56eaec0dd9b1e44a9a79a0..50dcc7d214a13e363492c4344c144843517fb0cf 100644
--- a/libavdevice/bktr.c
+++ b/libavdevice/bktr.c
@@ -334,6 +334,7 @@ static const AVClass bktr_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,
 };
 
 AVInputFormat ff_bktr_demuxer = {
diff --git a/libavdevice/caca.c b/libavdevice/caca.c
index 0a7470120f0a2237c0d719e42840de393586bb14..a11806478718e3d9ecfdc0382bc22b421ee754b8 100644
--- a/libavdevice/caca.c
+++ b/libavdevice/caca.c
@@ -224,6 +224,7 @@ static const AVClass caca_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT,
 };
 
 AVOutputFormat ff_caca_muxer = {
diff --git a/libavdevice/decklink_enc_c.c b/libavdevice/decklink_enc_c.c
index b98e0b4fa4f09d1ca9ad0faac6d9d2983128c9bb..7c1804376ae250f503facb43981b5e98e3cf0e3a 100644
--- a/libavdevice/decklink_enc_c.c
+++ b/libavdevice/decklink_enc_c.c
@@ -38,6 +38,7 @@ static const AVClass decklink_muxer_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT,
 };
 
 AVOutputFormat ff_decklink_muxer = {
diff --git a/libavdevice/dshow.c b/libavdevice/dshow.c
index 5293d263acfb403ce92ad22ab190bae850fb8fa8..950e313ed80431ec0f4ef234beb02700f3bb00eb 100644
--- a/libavdevice/dshow.c
+++ b/libavdevice/dshow.c
@@ -1081,6 +1081,7 @@ static const AVClass dshow_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,
 };
 
 AVInputFormat ff_dshow_demuxer = {
diff --git a/libavdevice/dv1394.c b/libavdevice/dv1394.c
index 0af5ea53c7c31073cdf868ec6664f5fa8e042975..c8241e33f2293cf7f5eff2faca0380e664a49af1 100644
--- a/libavdevice/dv1394.c
+++ b/libavdevice/dv1394.c
@@ -224,6 +224,7 @@ static const AVClass dv1394_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,
 };
 
 AVInputFormat ff_dv1394_demuxer = {
diff --git a/libavdevice/fbdev_dec.c b/libavdevice/fbdev_dec.c
index 14ebab35c92dcc0551242c56f9b822c54d0c89ce..01bc7c682624db4291407e6580bdba521959a261 100644
--- a/libavdevice/fbdev_dec.c
+++ b/libavdevice/fbdev_dec.c
@@ -217,6 +217,7 @@ static const AVClass fbdev_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,
 };
 
 AVInputFormat ff_fbdev_demuxer = {
diff --git a/libavdevice/fbdev_enc.c b/libavdevice/fbdev_enc.c
index 8291b597596c2f6ee7ca195b70379b1cd7e52054..0fd1c666b9431c890b5c1e947d1bec70afd5b6e5 100644
--- a/libavdevice/fbdev_enc.c
+++ b/libavdevice/fbdev_enc.c
@@ -196,6 +196,7 @@ static const AVClass fbdev_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT,
 };
 
 AVOutputFormat ff_fbdev_muxer = {
diff --git a/libavdevice/iec61883.c b/libavdevice/iec61883.c
index a63566e9d4ed87706dc7c049a9053eaa9c188a39..92b9dc2ad79ea9634b765a0d1150390b2eb93e1a 100644
--- a/libavdevice/iec61883.c
+++ b/libavdevice/iec61883.c
@@ -483,6 +483,7 @@ static const AVClass iec61883_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,
 };
 
 AVInputFormat ff_iec61883_demuxer = {
diff --git a/libavdevice/jack_audio.c b/libavdevice/jack_audio.c
index 5ba67316821b09bb210e4979c02c13f4b975a6bd..67f7ac74c9b36a77e2b203a91de56d7ec9517648 100644
--- a/libavdevice/jack_audio.c
+++ b/libavdevice/jack_audio.c
@@ -333,6 +333,7 @@ static const AVClass jack_indev_class = {
     .item_name      = av_default_item_name,
     .option         = options,
     .version        = LIBAVUTIL_VERSION_INT,
+    .category       = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT,
 };
 
 AVInputFormat ff_jack_demuxer = {
diff --git a/libavdevice/lavfi.c b/libavdevice/lavfi.c
index a177ad0271e6f6ab389da10bb780f1cdc049dca3..1ea7ea7717e960969a2bfbc551451a0a53ea2e51 100644
--- a/libavdevice/lavfi.c
+++ b/libavdevice/lavfi.c
@@ -425,6 +425,7 @@ static const AVClass lavfi_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_INPUT,
 };
 
 AVInputFormat ff_lavfi_demuxer = {
diff --git a/libavdevice/libcdio.c b/libavdevice/libcdio.c
index 91052cc40c98a2ba4083a5f654b8ac0f677d7cfd..16a4b26956af2386fdaf4662059a9ad3e0501422 100644
--- a/libavdevice/libcdio.c
+++ b/libavdevice/libcdio.c
@@ -177,6 +177,7 @@ static const AVClass libcdio_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT,
 };
 
 AVInputFormat ff_libcdio_demuxer = {
diff --git a/libavdevice/libdc1394.c b/libavdevice/libdc1394.c
index 80cb1bee1187f8768e5486d844a362c411676875..e9bd4c98f2af26fd2be634b0fdbe037df7f54794 100644
--- a/libavdevice/libdc1394.c
+++ b/libavdevice/libdc1394.c
@@ -112,6 +112,7 @@ static const AVClass libdc1394_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,
 };
 
 
diff --git a/libavdevice/openal-dec.c b/libavdevice/openal-dec.c
index 93633ff7d23cf260ac26211d229618d77510dafc..4c4ba28c22f6e7124f98ac3a4fa6a754ddfa9bd3 100644
--- a/libavdevice/openal-dec.c
+++ b/libavdevice/openal-dec.c
@@ -236,7 +236,8 @@ static const AVClass class = {
     .class_name = "openal",
     .item_name = av_default_item_name,
     .option = options,
-    .version = LIBAVUTIL_VERSION_INT
+    .version = LIBAVUTIL_VERSION_INT,
+    .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT,
 };
 
 AVInputFormat ff_openal_demuxer = {
diff --git a/libavdevice/opengl_enc.c b/libavdevice/opengl_enc.c
index 1b993906f87e667cd98e4f82c4e45b326e81be26..6be03981dd205a262f7d216dec4fcd854707c875 100644
--- a/libavdevice/opengl_enc.c
+++ b/libavdevice/opengl_enc.c
@@ -1272,6 +1272,7 @@ static const AVClass opengl_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT,
 };
 
 AVOutputFormat ff_opengl_muxer = {
diff --git a/libavdevice/oss_audio.c b/libavdevice/oss_audio.c
index 916908c42596231315e3cccb116ff744292222b2..71bf63689a2ebf1f5bc794f51dd979a808436938 100644
--- a/libavdevice/oss_audio.c
+++ b/libavdevice/oss_audio.c
@@ -296,6 +296,7 @@ static const AVClass oss_demuxer_class = {
     .item_name      = av_default_item_name,
     .option         = options,
     .version        = LIBAVUTIL_VERSION_INT,
+    .category       = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT,
 };
 
 AVInputFormat ff_oss_demuxer = {
@@ -311,6 +312,13 @@ AVInputFormat ff_oss_demuxer = {
 #endif
 
 #if CONFIG_OSS_OUTDEV
+static const AVClass oss_muxer_class = {
+    .class_name     = "OSS muxer",
+    .item_name      = av_default_item_name,
+    .version        = LIBAVUTIL_VERSION_INT,
+    .category       = AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT,
+};
+
 AVOutputFormat ff_oss_muxer = {
     .name           = "oss",
     .long_name      = NULL_IF_CONFIG_SMALL("OSS (Open Sound System) playback"),
@@ -324,5 +332,6 @@ AVOutputFormat ff_oss_muxer = {
     .write_packet   = audio_write_packet,
     .write_trailer  = audio_write_trailer,
     .flags          = AVFMT_NOFILE,
+    .priv_class     = &oss_muxer_class,
 };
 #endif
diff --git a/libavdevice/pulse_audio_dec.c b/libavdevice/pulse_audio_dec.c
index 3b5cebb7f6782f0dc0d513471f4e496addb0e17c..49d6f7e7c7cdf631c380ec9b41c5af0c992cb1c9 100644
--- a/libavdevice/pulse_audio_dec.c
+++ b/libavdevice/pulse_audio_dec.c
@@ -166,6 +166,7 @@ static const AVClass pulse_demuxer_class = {
     .item_name      = av_default_item_name,
     .option         = options,
     .version        = LIBAVUTIL_VERSION_INT,
+    .category       = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT,
 };
 
 AVInputFormat ff_pulse_demuxer = {
diff --git a/libavdevice/pulse_audio_enc.c b/libavdevice/pulse_audio_enc.c
index e0472993918688fdb645bc1fb8eef29841fd77b9..4fb64ed471eeb9fba58169dfd4108c6d8fc473bf 100644
--- a/libavdevice/pulse_audio_enc.c
+++ b/libavdevice/pulse_audio_enc.c
@@ -167,6 +167,7 @@ static const AVClass pulse_muxer_class = {
     .item_name      = av_default_item_name,
     .option         = options,
     .version        = LIBAVUTIL_VERSION_INT,
+    .category       = AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT,
 };
 
 AVOutputFormat ff_pulse_muxer = {
diff --git a/libavdevice/sdl.c b/libavdevice/sdl.c
index bef50417e749f8f08399b384f6ddd86217d8a452..b98aae5eeb24fe705925e7f3a2b03084096d066a 100644
--- a/libavdevice/sdl.c
+++ b/libavdevice/sdl.c
@@ -358,6 +358,7 @@ static const AVClass sdl_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT,
 };
 
 AVOutputFormat ff_sdl_muxer = {
diff --git a/libavdevice/sndio_dec.c b/libavdevice/sndio_dec.c
index 806f47867ef375d49a8dc79b5a973c463c09723f..37c6983429ed76d9c9af1f274f933607c1944c16 100644
--- a/libavdevice/sndio_dec.c
+++ b/libavdevice/sndio_dec.c
@@ -104,6 +104,7 @@ static const AVClass sndio_demuxer_class = {
     .item_name      = av_default_item_name,
     .option         = options,
     .version        = LIBAVUTIL_VERSION_INT,
+    .category       = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT,
 };
 
 AVInputFormat ff_sndio_demuxer = {
diff --git a/libavdevice/sndio_enc.c b/libavdevice/sndio_enc.c
index 84d070e89c4241e21f18758620492f54f4e55ece..205cf2411d8041544d4eead741a899a1d66bb7ab 100644
--- a/libavdevice/sndio_enc.c
+++ b/libavdevice/sndio_enc.c
@@ -76,6 +76,13 @@ static int audio_write_trailer(AVFormatContext *s1)
     return 0;
 }
 
+static const AVClass sndio_muxer_class = {
+    .class_name     = "sndio outdev",
+    .item_name      = av_default_item_name,
+    .version        = LIBAVUTIL_VERSION_INT,
+    .category       = AV_CLASS_CATEGORY_DEVICE_AUDIO_OUTPUT,
+};
+
 AVOutputFormat ff_sndio_muxer = {
     .name           = "sndio",
     .long_name      = NULL_IF_CONFIG_SMALL("sndio audio playback"),
@@ -89,4 +96,5 @@ AVOutputFormat ff_sndio_muxer = {
     .write_packet   = audio_write_packet,
     .write_trailer  = audio_write_trailer,
     .flags          = AVFMT_NOFILE,
+    .priv_class     = &sndio_muxer_class,
 };
diff --git a/libavdevice/v4l.c b/libavdevice/v4l.c
index bf2c9e372c992c2ef11200f2c69e40c5f4f78424..d33f7142a0eafa63277bc5263e0ee9420acace37 100644
--- a/libavdevice/v4l.c
+++ b/libavdevice/v4l.c
@@ -348,6 +348,7 @@ static const AVClass v4l_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,
 };
 
 AVInputFormat ff_v4l_demuxer = {
diff --git a/libavdevice/v4l2.c b/libavdevice/v4l2.c
index 96a272c1923585b28b11a1477a2c3cc40080c51b..c671e3ac73b603b44a69b66916607763fc3466d0 100644
--- a/libavdevice/v4l2.c
+++ b/libavdevice/v4l2.c
@@ -1023,6 +1023,7 @@ static const AVClass v4l2_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,
 };
 
 AVInputFormat ff_v4l2_demuxer = {
diff --git a/libavdevice/v4l2enc.c b/libavdevice/v4l2enc.c
index 21f0ef6983e9a2656cdfb3a93428e97e65157f94..efe08b589e06b00dbdf43687d811b5df38b933a2 100644
--- a/libavdevice/v4l2enc.c
+++ b/libavdevice/v4l2enc.c
@@ -97,6 +97,13 @@ static int write_trailer(AVFormatContext *s1)
     return 0;
 }
 
+static const AVClass v4l2_class = {
+    .class_name = "V4L2 outdev",
+    .item_name  = av_default_item_name,
+    .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT,
+};
+
 AVOutputFormat ff_v4l2_muxer = {
     .name           = "v4l2",
     .long_name      = NULL_IF_CONFIG_SMALL("Video4Linux2 output device"),
@@ -107,4 +114,5 @@ AVOutputFormat ff_v4l2_muxer = {
     .write_packet   = write_packet,
     .write_trailer  = write_trailer,
     .flags          = AVFMT_NOFILE,
+    .priv_class     = &v4l2_class,
 };
diff --git a/libavdevice/vfwcap.c b/libavdevice/vfwcap.c
index 014f18c27e6bb814c1d092a6fe7a3300302536ce..e5d959350a2c788d9d839f59ca4c4ee5b7442b36 100644
--- a/libavdevice/vfwcap.c
+++ b/libavdevice/vfwcap.c
@@ -469,6 +469,7 @@ static const AVClass vfw_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT
 };
 
 AVInputFormat ff_vfwcap_demuxer = {
diff --git a/libavdevice/x11grab.c b/libavdevice/x11grab.c
index 0e7b6ae5ee7baa4c435142028d145908b94f7fbd..d38c55d1c3b1495d98f1bf17fe531a51b54ed804 100644
--- a/libavdevice/x11grab.c
+++ b/libavdevice/x11grab.c
@@ -633,6 +633,7 @@ static const AVClass x11_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_INPUT,
 };
 
 /** x11 grabber device demuxer declaration */
diff --git a/libavdevice/xv.c b/libavdevice/xv.c
index 89d6575f6c125da8a6d4fd1f600c95dcb3ef2fec..ab08e3e0f789160f3a379e5712aaa51a83beef80 100644
--- a/libavdevice/xv.c
+++ b/libavdevice/xv.c
@@ -255,6 +255,7 @@ static const AVClass xv_class = {
     .item_name  = av_default_item_name,
     .option     = options,
     .version    = LIBAVUTIL_VERSION_INT,
+    .category   = AV_CLASS_CATEGORY_DEVICE_VIDEO_OUTPUT,
 };
 
 AVOutputFormat ff_xv_muxer = {