# HG changeset patch
# Node ID dc1b68245d3c
# Parent  eb6e78176693
diff --git a/finch/gntmedia.c b/finch/gntmedia.c
--- a/finch/gntmedia.c
+++ b/finch/gntmedia.c
@@ -33,7 +33,6 @@
 #include "libfinch.h"
 
 /* An incredibly large part of the following is from gtkmedia.c */
-#ifdef USE_VV
 
 #undef hangup
 
@@ -372,11 +371,8 @@ call_cmd_cb(PurpleConversation *conv, co
 	return PURPLE_CMD_RET_OK;
 }
 
-#endif  /* USE_VV */
-
 void finch_media_manager_init(void)
 {
-#ifdef USE_VV
 	PurpleMediaManager *manager = purple_media_manager_get();
 	PurpleMediaElementInfo *audio_src = NULL;
 	PurpleMediaElementInfo *audio_sink = NULL;
@@ -418,16 +414,11 @@ void finch_media_manager_init(void)
 	purple_debug_info("gntmedia", "Registering media element types\n");
 	purple_media_manager_set_active_element(manager, audio_src);
 	purple_media_manager_set_active_element(manager, audio_sink);
-#endif
 }
 
 void finch_media_manager_uninit(void)
 {
-#ifdef USE_VV
 	PurpleMediaManager *manager = purple_media_manager_get();
 	g_signal_handlers_disconnect_by_func(G_OBJECT(manager),
 			G_CALLBACK(finch_new_media), NULL);
-#endif
 }
-
-
diff --git a/finch/gntui.c b/finch/gntui.c
--- a/finch/gntui.c
+++ b/finch/gntui.c
@@ -168,9 +168,7 @@ void finch_ui_uninit()
 	finch_roomlist_uninit();
 	purple_roomlist_set_ui_ops(NULL);
 
-#ifdef USE_VV
 	finch_media_manager_uninit();
-#endif
 
 	gnt_quit();
 
diff --git a/libpurple/media.h b/libpurple/media.h
--- a/libpurple/media.h
+++ b/libpurple/media.h
@@ -45,8 +45,6 @@ typedef struct _PurpleMedia PurpleMedia;
 #include "signals.h"
 #include "util.h"
 
-#ifdef USE_VV
-
 typedef struct _PurpleMediaClass    PurpleMediaClass;
 typedef struct _PurpleMediaPrivate  PurpleMediaPrivate;
 
@@ -79,8 +77,6 @@ struct _PurpleMediaClass
 	void (*purple_reserved4)(void);
 };
 
-#endif
-
 G_BEGIN_DECLS
 
 /**
diff --git a/libpurple/media.c b/libpurple/media.c
--- a/libpurple/media.c
+++ b/libpurple/media.c
@@ -29,7 +29,6 @@
 
 #include "media-gst.h"
 
-#ifdef USE_VV
 typedef struct _PurpleMediaSession PurpleMediaSession;
 typedef struct _PurpleMediaStream PurpleMediaStream;
 
@@ -56,11 +55,9 @@ struct _PurpleMediaStream
 	GList *active_local_candidates;
 	GList *active_remote_candidates;
 };
-#endif
 
 struct _PurpleMediaPrivate
 {
-#ifdef USE_VV
 	PurpleMediaManager *manager;
 	PurpleAccount *account;
 	PurpleMediaBackend *backend;
@@ -71,12 +68,8 @@ struct _PurpleMediaPrivate
 	GHashTable *sessions;	/* PurpleMediaSession table */
 	GList *participants;
 	GList *streams;		/* PurpleMediaStream table */
-#else
-	gpointer dummy;
-#endif
 };
 
-#ifdef USE_VV
 static void purple_media_class_init (PurpleMediaClass *klass);
 static void purple_media_init (PurpleMedia *media);
 static void purple_media_dispose (GObject *object);
@@ -123,15 +116,7 @@ enum {
 };
 
 G_DEFINE_TYPE_WITH_PRIVATE(PurpleMedia, purple_media, G_TYPE_OBJECT);
-#else
-GType
-purple_media_get_type()
-{
-	return G_TYPE_NONE;
-}
-#endif /* USE_VV */
 
-#ifdef USE_VV
 static void
 purple_media_class_init (PurpleMediaClass *klass)
 {
@@ -482,21 +467,15 @@ purple_media_insert_local_candidate(Purp
 	stream = purple_media_get_stream(session->media, session->id, name);
 	stream->local_candidates = g_list_append(stream->local_candidates, candidate);
 }
-#endif
 
 GList *
 purple_media_get_session_ids(PurpleMedia *media)
 {
-#ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
 	return media->priv->sessions != NULL ?
 			g_hash_table_get_keys(media->priv->sessions) : NULL;
-#else
-	return NULL;
-#endif
 }
 
-#ifdef USE_VV
 GstElement *
 purple_media_get_src(PurpleMedia *media, const gchar *sess_id)
 {
@@ -504,47 +483,35 @@ purple_media_get_src(PurpleMedia *media,
 
 	return NULL;
 }
-#endif /* USE_VV */
 
 PurpleAccount *
 purple_media_get_account(PurpleMedia *media)
 {
-#ifdef USE_VV
 	PurpleAccount *account;
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
 	g_object_get(G_OBJECT(media), "account", &account, NULL);
 	return account;
-#else
-	return NULL;
-#endif
 }
 
 gpointer
 purple_media_get_protocol_data(PurpleMedia *media)
 {
-#ifdef USE_VV
 	gpointer protocol_data;
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
 	g_object_get(G_OBJECT(media), "protocol-data", &protocol_data, NULL);
 	return protocol_data;
-#else
-	return NULL;
-#endif
 }
 
 void
 purple_media_set_protocol_data(PurpleMedia *media, gpointer protocol_data)
 {
-#ifdef USE_VV
 	g_return_if_fail(PURPLE_IS_MEDIA(media));
 	g_object_set(G_OBJECT(media), "protocol-data", protocol_data, NULL);
-#endif
 }
 
 void
 purple_media_error(PurpleMedia *media, const gchar *error, ...)
 {
-#ifdef USE_VV
 	va_list args;
 	gchar *message;
 
@@ -558,14 +525,12 @@ purple_media_error(PurpleMedia *media, c
 	g_signal_emit(media, purple_media_signals[S_ERROR], 0, message);
 
 	g_free(message);
-#endif
 }
 
 void
 purple_media_end(PurpleMedia *media,
 		const gchar *session_id, const gchar *participant)
 {
-#ifdef USE_VV
 	GList *iter, *sessions = NULL, *participants = NULL;
 
 	g_return_if_fail(PURPLE_IS_MEDIA(media));
@@ -663,7 +628,6 @@ purple_media_end(PurpleMedia *media,
 		g_object_unref(media);
 		return;
 	}
-#endif
 }
 
 void
@@ -671,7 +635,6 @@ purple_media_stream_info(PurpleMedia *me
 		const gchar *session_id, const gchar *participant,
 		gboolean local)
 {
-#ifdef USE_VV
 	g_return_if_fail(PURPLE_IS_MEDIA(media));
 
 	if (type == PURPLE_MEDIA_INFO_ACCEPT) {
@@ -830,36 +793,28 @@ purple_media_stream_info(PurpleMedia *me
 
 	g_signal_emit(media, purple_media_signals[STREAM_INFO],
 			0, type, session_id, participant, local);
-#endif
 }
 
 void
 purple_media_set_params(PurpleMedia *media, GHashTable *params)
 {
-#ifdef USE_VV
 	g_return_if_fail(PURPLE_IS_MEDIA(media));
 
 	purple_media_backend_set_params(media->priv->backend, params);
-#endif
 }
 
 const gchar **
 purple_media_get_available_params(PurpleMedia *media)
 {
 	static const gchar *NULL_ARRAY[] = { NULL };
-#ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL_ARRAY);
 
 	return purple_media_backend_get_available_params(media->priv->backend);
-#else
-	return NULL_ARRAY;
-#endif
 }
 
 gboolean
 purple_media_param_is_supported(PurpleMedia *media, const gchar *param)
 {
-#ifdef USE_VV
 	const gchar **params;
 
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
@@ -871,11 +826,10 @@ purple_media_param_is_supported(PurpleMe
 			return TRUE;
 		}
 	}
-#endif
+
 	return FALSE;
 }
 
-#ifdef USE_VV
 static void
 purple_media_new_local_candidate_cb(PurpleMediaBackend *backend,
 		const gchar *sess_id, const gchar *participant,
@@ -969,14 +923,12 @@ purple_media_codecs_changed_cb(PurpleMed
 {
 	g_signal_emit(media, purple_media_signals[CODECS_CHANGED], 0, sess_id);
 }
-#endif  /* USE_VV */
 
 gboolean
 purple_media_add_stream(PurpleMedia *media, const gchar *sess_id,
 		const gchar *who, PurpleMediaSessionType type, gboolean initiator,
 		const gchar *transmitter, GHashTable *params)
 {
-#ifdef USE_VV
 	PurpleMediaSession *session;
 
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
@@ -1021,9 +973,6 @@ purple_media_add_stream(PurpleMedia *med
 	}
 
 	return TRUE;
-#else
-	return FALSE;
-#endif  /* USE_VV */
 }
 
 PurpleMediaManager *
@@ -1038,40 +987,29 @@ purple_media_get_manager(PurpleMedia *me
 PurpleMediaSessionType
 purple_media_get_session_type(PurpleMedia *media, const gchar *sess_id)
 {
-#ifdef USE_VV
 	PurpleMediaSession *session;
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), PURPLE_MEDIA_NONE);
 	session = purple_media_get_session(media, sess_id);
 	return session->type;
-#else
-	return PURPLE_MEDIA_NONE;
-#endif
 }
+
 /* XXX: Should wait until codecs-ready is TRUE before using this function */
 GList *
 purple_media_get_codecs(PurpleMedia *media, const gchar *sess_id)
 {
-#ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
 
 	return purple_media_backend_get_codecs(media->priv->backend, sess_id);
-#else
-	return NULL;
-#endif
 }
 
 GList *
 purple_media_get_local_candidates(PurpleMedia *media, const gchar *sess_id,
                                   const gchar *participant)
 {
-#ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
 
 	return purple_media_backend_get_local_candidates(media->priv->backend,
 			sess_id, participant);
-#else
-	return NULL;
-#endif
 }
 
 void
@@ -1079,7 +1017,6 @@ purple_media_add_remote_candidates(Purpl
                                    const gchar *participant,
                                    GList *remote_candidates)
 {
-#ifdef USE_VV
 	PurpleMediaStream *stream;
 
 	g_return_if_fail(PURPLE_IS_MEDIA(media));
@@ -1099,58 +1036,44 @@ purple_media_add_remote_candidates(Purpl
 
 	purple_media_backend_add_remote_candidates(media->priv->backend,
 			sess_id, participant, remote_candidates);
-#endif
 }
 
 GList *
 purple_media_get_active_local_candidates(PurpleMedia *media,
 		const gchar *sess_id, const gchar *participant)
 {
-#ifdef USE_VV
 	PurpleMediaStream *stream;
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
 	stream = purple_media_get_stream(media, sess_id, participant);
 	return purple_media_candidate_list_copy(
 			stream->active_local_candidates);
-#else
-	return NULL;
-#endif
 }
 
 GList *
 purple_media_get_active_remote_candidates(PurpleMedia *media,
 		const gchar *sess_id, const gchar *participant)
 {
-#ifdef USE_VV
 	PurpleMediaStream *stream;
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
 	stream = purple_media_get_stream(media, sess_id, participant);
 	return purple_media_candidate_list_copy(
 			stream->active_remote_candidates);
-#else
-	return NULL;
-#endif
 }
 
 gboolean
 purple_media_set_remote_codecs(PurpleMedia *media, const gchar *sess_id,
                                const gchar *participant, GList *codecs)
 {
-#ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
 
 	return purple_media_backend_set_remote_codecs(media->priv->backend,
 			sess_id, participant, codecs);
-#else
-	return FALSE;
-#endif
 }
 
 gboolean
 purple_media_candidates_prepared(PurpleMedia *media,
 		const gchar *session_id, const gchar *participant)
 {
-#ifdef USE_VV
 	GList *streams;
 	gboolean prepared = TRUE;
 
@@ -1168,22 +1091,15 @@ purple_media_candidates_prepared(PurpleM
 	}
 
 	return prepared;
-#else
-	return FALSE;
-#endif
 }
 
 gboolean
 purple_media_set_send_codec(PurpleMedia *media, const gchar *sess_id, PurpleMediaCodec *codec)
 {
-#ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
 
 	return purple_media_backend_set_send_codec(
 			media->priv->backend, sess_id, codec);
-#else
-	return FALSE;
-#endif
 }
 
 gboolean
@@ -1191,13 +1107,9 @@ purple_media_set_encryption_parameters(P
 		const gchar *cipher, const gchar *auth,
 		const gchar *key, gsize key_len)
 {
-#ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
 	return purple_media_backend_set_encryption_parameters(media->priv->backend,
 			sess_id, cipher, auth, key, key_len);
-#else
-	return FALSE;
-#endif
 }
 
 gboolean
@@ -1205,60 +1117,43 @@ purple_media_set_decryption_parameters(P
 		const gchar *participant, const gchar *cipher,
 		const gchar *auth, const gchar *key, gsize key_len)
 {
-#ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
 	return purple_media_backend_set_decryption_parameters(media->priv->backend,
 			sess_id, participant, cipher, auth, key, key_len);
-#else
-	return FALSE;
-#endif
 }
 
 gboolean
 purple_media_set_require_encryption(PurpleMedia *media, const gchar *sess_id,
                 const gchar *participant, gboolean require_encryption)
 {
-#ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
 	return purple_media_backend_set_require_encryption(media->priv->backend,
 			sess_id, participant, require_encryption);
-#else
-	return FALSE;
-#endif
 }
 
 gboolean
 purple_media_codecs_ready(PurpleMedia *media, const gchar *sess_id)
 {
-#ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
 
 	return purple_media_backend_codecs_ready(
 			media->priv->backend, sess_id);
-#else
-	return FALSE;
-#endif
 }
 
 gboolean
 purple_media_set_send_rtcp_mux(PurpleMedia *media, const gchar *sess_id,
                                const gchar *participant, gboolean send_rtcp_mux)
 {
-#ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
 
 	return purple_media_backend_set_send_rtcp_mux(media->priv->backend,
 			sess_id, participant, send_rtcp_mux);
-#else
-	return FALSE;
-#endif
 }
 
 gboolean
 purple_media_is_initiator(PurpleMedia *media,
 		const gchar *sess_id, const gchar *participant)
 {
-#ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
 
 	if (sess_id == NULL && participant == NULL)
@@ -1272,7 +1167,7 @@ purple_media_is_initiator(PurpleMedia *m
 				media, sess_id, participant);
 		return stream != NULL ? stream->initiator : FALSE;
 	}
-#endif
+
 	return FALSE;
 }
 
@@ -1280,7 +1175,6 @@ gboolean
 purple_media_accepted(PurpleMedia *media, const gchar *sess_id,
 		const gchar *participant)
 {
-#ifdef USE_VV
 	gboolean accepted = TRUE;
 
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
@@ -1314,46 +1208,34 @@ purple_media_accepted(PurpleMedia *media
 	}
 
 	return accepted;
-#else
-	return FALSE;
-#endif
 }
 
 void purple_media_set_input_volume(PurpleMedia *media,
 		const gchar *session_id, double level)
 {
-#ifdef USE_VV
 	g_return_if_fail(PURPLE_IS_MEDIA(media));
-#endif
 }
 
 void purple_media_set_output_volume(PurpleMedia *media,
 		const gchar *session_id, const gchar *participant,
 		double level)
 {
-#ifdef USE_VV
 	g_return_if_fail(PURPLE_IS_MEDIA(media));
-#endif
 }
 
 gulong
 purple_media_set_output_window(PurpleMedia *media, const gchar *session_id,
 		const gchar *participant)
 {
-#ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
 
 	return purple_media_manager_set_output_window(media->priv->manager,
 			media, session_id, participant);
-#else
-	return 0;
-#endif
 }
 
 void
 purple_media_remove_output_windows(PurpleMedia *media)
 {
-#ifdef USE_VV
 	GList *iter = media->priv->streams;
 	for (; iter; iter = g_list_next(iter)) {
 		PurpleMediaStream *stream = iter->data;
@@ -1369,10 +1251,8 @@ purple_media_remove_output_windows(Purpl
 				media->priv->manager, media,
 				session_name, NULL);
 	}
-#endif
 }
 
-#ifdef USE_VV
 GstElement *
 purple_media_get_tee(PurpleMedia *media,
 		const gchar *session_id, const gchar *participant)
@@ -1381,13 +1261,11 @@ purple_media_get_tee(PurpleMedia *media,
 
 	return NULL;
 }
-#endif /* USE_VV */
 
 gboolean
 purple_media_send_dtmf(PurpleMedia *media, const gchar *session_id,
 		gchar dtmf, guint8 volume, guint16 duration)
 {
-#ifdef USE_VV
 	PurpleMediaBackendInterface *backend_iface = NULL;
 
 	if (media) {
@@ -1412,6 +1290,6 @@ purple_media_send_dtmf(PurpleMedia *medi
 	{
 		return TRUE;
 	}
-#endif
+
 	return FALSE;
 }
diff --git a/libpurple/media/backend-iface.c b/libpurple/media/backend-iface.c
--- a/libpurple/media/backend-iface.c
+++ b/libpurple/media/backend-iface.c
@@ -44,7 +44,7 @@ purple_media_backend_base_init(gpointer 
 	}
 
 	g_object_interface_install_property(iface,
-			g_param_spec_string("conference-type",
+		g_param_spec_string("conference-type",
 			"Conference Type",
 			"The type of conference that this backend "
 			"has been created to provide.",
@@ -52,16 +52,10 @@ purple_media_backend_base_init(gpointer 
 			G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE |
 			G_PARAM_STATIC_STRINGS));
 	g_object_interface_install_property(iface,
-#ifdef USE_VV
-			g_param_spec_object(
-#else
-			g_param_spec_pointer(
-#endif
+		g_param_spec_object(
 			"media", "Purple Media",
 			"The media object that this backend is bound to.",
-#ifdef USE_VV
 			PURPLE_TYPE_MEDIA,
-#endif
 			G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE |
 			G_PARAM_STATIC_STRINGS));
 	purple_media_backend_signals[S_ERROR] =
diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c
--- a/libpurple/mediamanager.c
+++ b/libpurple/mediamanager.c
@@ -32,12 +32,7 @@
 
 #include "media-gst.h"
 
-#ifdef USE_VV
-#include <gst/video/videooverlay.h>
-#ifdef HAVE_MEDIA_APPLICATION
 #include <gst/app/app.h>
-#endif
-#endif /* USE_VV */
 
 typedef struct _PurpleMediaOutputWindow PurpleMediaOutputWindow;
 typedef struct _PurpleMediaElementInfoPrivate PurpleMediaElementInfoPrivate;
@@ -70,12 +65,10 @@ typedef struct
 
 	GstDeviceMonitor *device_monitor;
 
-#ifdef HAVE_MEDIA_APPLICATION
 	/* Application data streams */
 	GList *appdata_info; /* holds PurpleMediaAppDataInfo */
 	GMutex appdata_mutex;
 	guint appdata_cb_token; /* last used read/write callback token */
-#endif
 } PurpleMediaManagerPrivate;
 
 /**
@@ -91,7 +84,6 @@ struct _PurpleMediaManager
 	PurpleMediaManagerPrivate *priv;
 };
 
-#ifdef HAVE_MEDIA_APPLICATION
 typedef struct {
 	PurpleMedia *media;
 	GWeakRef media_ref;
@@ -113,13 +105,9 @@ typedef struct {
 	guint readable_timer_id;
 	GCond readable_cond;
 } PurpleMediaAppDataInfo;
-#endif
 
-#ifdef USE_VV
 static void purple_media_manager_finalize (GObject *object);
-#ifdef HAVE_MEDIA_APPLICATION
 static void free_appdata_info_locked (PurpleMediaAppDataInfo *info);
-#endif
 static void purple_media_manager_init_device_monitor(PurpleMediaManager *manager);
 static void purple_media_manager_register_static_elements(PurpleMediaManager *manager);
 
@@ -135,15 +123,7 @@ static guint purple_media_manager_signal
 
 G_DEFINE_TYPE_WITH_PRIVATE(PurpleMediaManager, purple_media_manager,
 		G_TYPE_OBJECT);
-#else
-GType
-purple_media_manager_get_type()
-{
-	return G_TYPE_NONE;
-}
-#endif /* USE_VV */
 
-#ifdef USE_VV
 static void
 purple_media_manager_class_init (PurpleMediaManagerClass *klass)
 {
@@ -190,10 +170,8 @@ purple_media_manager_init (PurpleMediaMa
 	media->priv->medias = NULL;
 	media->priv->private_medias = NULL;
 	media->priv->next_output_window_id = 1;
-#ifdef HAVE_MEDIA_APPLICATION
 	media->priv->appdata_info = NULL;
 	g_mutex_init (&media->priv->appdata_mutex);
-#endif
 	if (gst_init_check(NULL, NULL, &error)) {
 		purple_media_manager_register_static_elements(media);
 		purple_media_manager_init_device_monitor(media);
@@ -225,13 +203,11 @@ purple_media_manager_finalize (GObject *
 	g_list_free_full(priv->private_medias, g_object_unref);
 	g_list_free_full(priv->elements, g_object_unref);
 	g_clear_pointer(&priv->video_caps, gst_caps_unref);
-#ifdef HAVE_MEDIA_APPLICATION
 	if (priv->appdata_info) {
 		g_list_free_full(priv->appdata_info,
 		                 (GDestroyNotify)free_appdata_info_locked);
 	}
 	g_mutex_clear (&priv->appdata_mutex);
-#endif
 	if (priv->device_monitor) {
 		gst_device_monitor_stop(priv->device_monitor);
 		g_object_unref(priv->device_monitor);
@@ -239,12 +215,10 @@ purple_media_manager_finalize (GObject *
 
 	G_OBJECT_CLASS(purple_media_manager_parent_class)->finalize(media);
 }
-#endif
 
 PurpleMediaManager *
 purple_media_manager_get()
 {
-#ifdef USE_VV
 	static PurpleMediaManager *manager = NULL;
 
 	if (manager == NULL) {
@@ -252,12 +226,8 @@ purple_media_manager_get()
 	}
 
 	return manager;
-#else
-	return NULL;
-#endif
 }
 
-#ifdef USE_VV
 static gboolean
 pipeline_bus_call(GstBus *bus, GstMessage *msg, PurpleMediaManager *manager)
 {
@@ -286,9 +256,7 @@ pipeline_bus_call(GstBus *bus, GstMessag
 	}
 	return TRUE;
 }
-#endif
 
-#ifdef USE_VV
 GstElement *
 purple_media_manager_get_pipeline(PurpleMediaManager *manager)
 {
@@ -312,7 +280,6 @@ purple_media_manager_get_pipeline(Purple
 
 	return manager->priv->pipeline;
 }
-#endif /* USE_VV */
 
 static PurpleMedia *
 create_media(PurpleMediaManager *manager,
@@ -322,7 +289,6 @@ create_media(PurpleMediaManager *manager
 			  gboolean initiator,
 			  gboolean private)
 {
-#ifdef USE_VV
 	PurpleMedia *media;
 	guint signal_id;
 
@@ -356,30 +322,22 @@ create_media(PurpleMediaManager *manager
 	}
 
 	return media;
-#else
-	return NULL;
-#endif
 }
 
 static GList *
 get_media(PurpleMediaManager *manager, gboolean private)
 {
-#ifdef USE_VV
 	if (private) {
 		return manager->priv->private_medias;
 	} else {
 		return manager->priv->medias;
 	}
-#else
-	return NULL;
-#endif
 }
 
 static GList *
 get_media_by_account(PurpleMediaManager *manager,
 		PurpleAccount *account, gboolean private)
 {
-#ifdef USE_VV
 	GList *media = NULL;
 	GList *iter;
 	PurpleAccount *media_account;
@@ -400,15 +358,11 @@ get_media_by_account(PurpleMediaManager 
 	}
 
 	return media;
-#else
-	return NULL;
-#endif
 }
 
 void
 purple_media_manager_remove_media(PurpleMediaManager *manager, PurpleMedia *media)
 {
-#ifdef USE_VV
 	GList *list;
 	GList **medias = NULL;
 
@@ -423,7 +377,6 @@ purple_media_manager_remove_media(Purple
 	if (list) {
 		*medias = g_list_delete_link(*medias, list);
 
-#ifdef HAVE_MEDIA_APPLICATION
 		g_mutex_lock (&manager->priv->appdata_mutex);
 		list = manager->priv->appdata_info;
 		while (list) {
@@ -439,9 +392,7 @@ purple_media_manager_remove_media(Purple
 			list = next;
 		}
 		g_mutex_unlock (&manager->priv->appdata_mutex);
-#endif
 	}
-#endif
 }
 
 PurpleMedia *
@@ -492,7 +443,6 @@ purple_media_manager_get_private_media_b
 	return get_media_by_account (manager, account, TRUE);
 }
 
-#ifdef HAVE_MEDIA_APPLICATION
 static void
 free_appdata_info_locked (PurpleMediaAppDataInfo *info)
 {
@@ -594,10 +544,8 @@ ensure_app_data_info_and_lock (PurpleMed
 
 	return info;
 }
-#endif
 
 
-#ifdef USE_VV
 static void
 request_pad_unlinked_cb(GstPad *pad, GstPad *peer, gpointer user_data)
 {
@@ -666,9 +614,7 @@ purple_media_manager_get_video_caps(Purp
 
 	return manager->priv->video_caps;
 }
-#endif /* USE_VV */
 
-#ifdef HAVE_MEDIA_APPLICATION
 /*
  * Calls the appdata writable callback from the main thread.
  * This needs to grab the appdata lock and make sure it didn't get destroyed
@@ -1008,15 +954,12 @@ create_recv_appsink(PurpleMediaElementIn
 	g_mutex_unlock (&manager->priv->appdata_mutex);
 	return appsink;
 }
-#endif /* HAVE_MEDIA_APPLICATION */
 
-#ifdef USE_VV
 static PurpleMediaElementInfo *
 get_send_application_element_info ()
 {
 	static PurpleMediaElementInfo *info = NULL;
 
-#ifdef HAVE_MEDIA_APPLICATION
 	if (info == NULL) {
 		info = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO,
 			"id", "pidginappsrc",
@@ -1026,7 +969,6 @@ get_send_application_element_info ()
 					| PURPLE_MEDIA_ELEMENT_ONE_SRC,
 			"create-cb", create_send_appsrc, NULL);
 	}
-#endif
 
 	return info;
 }
@@ -1036,7 +978,6 @@ get_recv_application_element_info ()
 {
 	static PurpleMediaElementInfo *info = NULL;
 
-#ifdef HAVE_MEDIA_APPLICATION
 	if (info == NULL) {
 		info = g_object_new(PURPLE_TYPE_MEDIA_ELEMENT_INFO,
 			"id", "pidginappsink",
@@ -1046,7 +987,6 @@ get_recv_application_element_info ()
 					| PURPLE_MEDIA_ELEMENT_ONE_SINK,
 			"create-cb", create_recv_appsink, NULL);
 	}
-#endif
 
 	return info;
 }
@@ -1367,14 +1307,12 @@ purple_media_manager_get_active_element(
 
 	return NULL;
 }
-#endif
 
 gboolean
 purple_media_manager_create_output_window(PurpleMediaManager *manager,
 		PurpleMedia *media, const gchar *session_id,
 		const gchar *participant)
 {
-#ifdef USE_VV
 	GList *iter;
 
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
@@ -1430,9 +1368,6 @@ purple_media_manager_create_output_windo
 		}
 	}
 	return TRUE;
-#else
-	return FALSE;
-#endif
 }
 
 gulong
@@ -1440,7 +1375,6 @@ purple_media_manager_set_output_window(P
 		PurpleMedia *media, const gchar *session_id,
 		const gchar *participant)
 {
-#ifdef USE_VV
 	PurpleMediaOutputWindow *output_window;
 
 	g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), FALSE);
@@ -1461,16 +1395,12 @@ purple_media_manager_set_output_window(P
 	}
 
 	return output_window->id;
-#else
-	return 0;
-#endif
 }
 
 gboolean
 purple_media_manager_remove_output_window(PurpleMediaManager *manager,
 		gulong output_window_id)
 {
-#ifdef USE_VV
 	PurpleMediaOutputWindow *output_window = NULL;
 	GList *iter;
 
@@ -1546,9 +1476,6 @@ purple_media_manager_remove_output_windo
 	g_free(output_window);
 
 	return TRUE;
-#else
-	return FALSE;
-#endif
 }
 
 void
@@ -1556,7 +1483,6 @@ purple_media_manager_remove_output_windo
 		PurpleMedia *media, const gchar *session_id,
 		const gchar *participant)
 {
-#ifdef USE_VV
 	GList *iter;
 
 	g_return_if_fail(PURPLE_IS_MEDIA(media));
@@ -1575,14 +1501,12 @@ purple_media_manager_remove_output_windo
 					manager, ow->id);
 		}
 	}
-#endif
 }
 
 void
 purple_media_manager_set_ui_caps(PurpleMediaManager *manager,
 		PurpleMediaCaps caps)
 {
-#ifdef USE_VV
 	PurpleMediaCaps oldcaps;
 
 	g_return_if_fail(PURPLE_IS_MEDIA_MANAGER(manager));
@@ -1595,43 +1519,32 @@ purple_media_manager_set_ui_caps(PurpleM
 				purple_media_manager_signals[UI_CAPS_CHANGED],
 				0, caps, oldcaps);
 	}
-#endif
 }
 
 PurpleMediaCaps
 purple_media_manager_get_ui_caps(PurpleMediaManager *manager)
 {
-#ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager),
 			PURPLE_MEDIA_CAPS_NONE);
 	return manager->priv->ui_caps;
-#else
-	return PURPLE_MEDIA_CAPS_NONE;
-#endif
 }
 
 void
 purple_media_manager_set_backend_type(PurpleMediaManager *manager,
 		GType backend_type)
 {
-#ifdef USE_VV
 	g_return_if_fail(PURPLE_IS_MEDIA_MANAGER(manager));
 
 	manager->priv->backend_type = backend_type;
-#endif
 }
 
 GType
 purple_media_manager_get_backend_type(PurpleMediaManager *manager)
 {
-#ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager),
 			PURPLE_MEDIA_CAPS_NONE);
 
 	return manager->priv->backend_type;
-#else
-	return G_TYPE_NONE;
-#endif
 }
 
 void
@@ -1640,7 +1553,6 @@ purple_media_manager_set_application_dat
 		const gchar *participant, PurpleMediaAppDataCallbacks *callbacks,
 		gpointer user_data, GDestroyNotify notify)
 {
-#ifdef HAVE_MEDIA_APPLICATION
 	PurpleMediaAppDataInfo * info = ensure_app_data_info_and_lock (manager,
 		media, session_id, participant);
 
@@ -1673,7 +1585,6 @@ purple_media_manager_set_application_dat
 	}
 
 	g_mutex_unlock (&manager->priv->appdata_mutex);
-#endif
 }
 
 gint
@@ -1681,7 +1592,6 @@ purple_media_manager_send_application_da
 	PurpleMediaManager *manager, PurpleMedia *media, const gchar *session_id,
 	const gchar *participant, gpointer buffer, guint size, gboolean blocking)
 {
-#ifdef HAVE_MEDIA_APPLICATION
 	PurpleMediaAppDataInfo * info = get_app_data_info_and_lock (manager,
 		media, session_id, participant);
 
@@ -1711,9 +1621,6 @@ purple_media_manager_send_application_da
 	}
 	g_mutex_unlock (&manager->priv->appdata_mutex);
 	return -1;
-#else
-	return -1;
-#endif
 }
 
 gint
@@ -1722,7 +1629,6 @@ purple_media_manager_receive_application
 	const gchar *participant, gpointer buffer, guint max_size,
 	gboolean blocking)
 {
-#ifdef HAVE_MEDIA_APPLICATION
 	PurpleMediaAppDataInfo * info = get_app_data_info_and_lock (manager,
 		media, session_id, participant);
 	guint bytes_read = 0;
@@ -1798,13 +1704,8 @@ purple_media_manager_receive_application
 	}
 	g_mutex_unlock (&manager->priv->appdata_mutex);
 	return -1;
-#else
-	return -1;
-#endif
 }
 
-#ifdef USE_VV
-
 static void
 videosink_disable_last_sample(GstElement *sink)
 {
@@ -2289,7 +2190,6 @@ purple_media_element_type_get_type()
 	}
 	return type;
 }
-#endif /* USE_VV */
 
 /*
  * PurpleMediaElementInfo
@@ -2305,7 +2205,6 @@ struct _PurpleMediaElementInfo
 	GObject parent;
 };
 
-#ifdef USE_VV
 struct _PurpleMediaElementInfoPrivate
 {
 	gchar *id;
@@ -2493,4 +2392,3 @@ purple_media_element_info_call_create(Pu
 	}
 	return NULL;
 }
-#endif /* USE_VV */
diff --git a/libpurple/meson.build b/libpurple/meson.build
--- a/libpurple/meson.build
+++ b/libpurple/meson.build
@@ -125,6 +125,7 @@ purple_coreheaders = [
 	'image.h',
 	'image-store.h',
 	'media.h',
+	'media-gst.h',
 	'mediamanager.h',
 	'memorypool.h',
 	'nat-pmp.h',
@@ -214,10 +215,6 @@ purple_coresources += purple_resource
 purple_filebase = 'purple-@0@'.format(purple_major_version)
 purple_include_base = purple_filebase / 'libpurple'
 
-if enable_vv
-	purple_coreheaders += 'media-gst.h'
-endif
-
 if IS_WIN32
 	purple_coresources += [
 		'win32/libc_interface.c',
@@ -311,7 +308,7 @@ libpurple = library('purple',
                     version : PURPLE_LIB_VERSION,
                     dependencies : # static_link_libs
                         [dnsapi, ws2_32, glib, gio, gplugin_dep, libsoup,
-                         libxml, gdk_pixbuf, gstreamer, gstreamer_video,
+                         libxml, gdk_pixbuf, gstreamer,
                          gstreamer_app, json, sqlite3, math])
 
 install_headers(purple_coreheaders,
diff --git a/libpurple/protocols.c b/libpurple/protocols.c
--- a/libpurple/protocols.c
+++ b/libpurple/protocols.c
@@ -354,7 +354,6 @@ purple_protocol_initiate_media(PurpleAcc
 			   const char *who,
 			   PurpleMediaSessionType type)
 {
-#ifdef USE_VV
 	PurpleConnection *gc = NULL;
 	PurpleProtocol *protocol = NULL;
 
@@ -373,15 +372,11 @@ purple_protocol_initiate_media(PurpleAcc
 	} else {
 		return FALSE;
 	}
-#else
-	return FALSE;
-#endif
 }
 
 PurpleMediaCaps
 purple_protocol_get_media_caps(PurpleAccount *account, const char *who)
 {
-#ifdef USE_VV
 	PurpleConnection *gc = NULL;
 	PurpleProtocol *protocol = NULL;
 
@@ -398,15 +393,11 @@ purple_protocol_get_media_caps(PurpleAcc
 	} else {
 		return PURPLE_MEDIA_CAPS_NONE;
 	}
-#else
-	return PURPLE_MEDIA_CAPS_NONE;
-#endif
 }
 
 void
 purple_protocol_got_media_caps(PurpleAccount *account, const char *name)
 {
-#ifdef USE_VV
 	GSList *list;
 
 	g_return_if_fail(account != NULL);
@@ -433,6 +424,4 @@ purple_protocol_got_media_caps(PurpleAcc
 				"buddy-caps-changed", buddy,
 				newcaps, oldcaps);
 	}
-#endif
 }
-
diff --git a/libpurple/protocols/jabber/jabber.h b/libpurple/protocols/jabber/jabber.h
--- a/libpurple/protocols/jabber/jabber.h
+++ b/libpurple/protocols/jabber/jabber.h
@@ -253,7 +253,6 @@ struct _JabberStream
 	/* keep a hash table of JingleSessions */
 	GHashTable *sessions;
 
-	/* maybe this should only be present when USE_VV? */
 	gchar *stun_ip;
 	int stun_port;
 };
diff --git a/libpurple/protocols/jabber/jabber.c b/libpurple/protocols/jabber/jabber.c
--- a/libpurple/protocols/jabber/jabber.c
+++ b/libpurple/protocols/jabber/jabber.c
@@ -3047,7 +3047,6 @@ jabber_offline_message(PurpleProtocolCli
 	return TRUE;
 }
 
-#ifdef USE_VV
 gboolean
 jabber_audio_enabled(JabberStream *js, const char *namespace)
 {
@@ -3095,13 +3094,11 @@ jabber_media_ok_cb(JabberMediaRequest *r
 	g_free(request->who);
 	g_free(request);
 }
-#endif
 
 gboolean
 jabber_initiate_media(PurpleProtocolMedia *media, PurpleAccount *account,
                       const gchar *who, PurpleMediaSessionType type)
 {
-#ifdef USE_VV
 	PurpleConnection *gc = purple_account_get_connection(account);
 	JabberStream *js = purple_connection_get_protocol_data(gc);
 	JabberBuddy *jb;
@@ -3235,7 +3232,7 @@ jabber_initiate_media(PurpleProtocolMedi
 		g_free(msg);
 		return TRUE;
 	}
-#endif
+
 	return FALSE;
 }
 
@@ -3243,7 +3240,6 @@ PurpleMediaCaps
 jabber_get_media_caps(PurpleProtocolMedia *media, PurpleAccount *account,
                       const gchar *who)
 {
-#ifdef USE_VV
 	PurpleConnection *gc = purple_account_get_connection(account);
 	JabberStream *js = purple_connection_get_protocol_data(gc);
 	JabberBuddy *jb;
@@ -3321,9 +3317,6 @@ jabber_get_media_caps(PurpleProtocolMedi
 	}
 
 	return total;
-#else
-	return PURPLE_MEDIA_CAPS_NONE;
-#endif
 }
 
 gboolean jabber_can_receive_file(PurpleProtocolXfer *prplxfer, PurpleConnection *gc, const char *who)
@@ -3705,7 +3698,6 @@ jabber_do_init(void)
 	/* Jingle features! */
 	jabber_add_feature(JINGLE, NULL);
 
-#ifdef USE_VV
 	jabber_add_feature(JINGLE_APP_RTP, NULL);
 	jabber_add_feature(JINGLE_APP_RTP_SUPPORT_AUDIO, jabber_audio_enabled);
 	jabber_add_feature(JINGLE_APP_RTP_SUPPORT_VIDEO, jabber_video_enabled);
@@ -3714,7 +3706,6 @@ jabber_do_init(void)
 
 	g_signal_connect(G_OBJECT(purple_media_manager_get()), "ui-caps-changed",
 			G_CALLBACK(jabber_caps_broadcast_change), NULL);
-#endif
 
 	/* reverse order of unload_plugin */
 	jabber_iq_init();
@@ -3747,10 +3738,8 @@ jabber_do_uninit(void)
 	jabber_presence_uninit();
 	jabber_iq_uninit();
 
-#ifdef USE_VV
 	g_signal_handlers_disconnect_by_func(G_OBJECT(purple_media_manager_get()),
 			G_CALLBACK(jabber_caps_broadcast_change), NULL);
-#endif
 
 	jabber_auth_uninit();
 	g_list_free_full(jabber_features, (GDestroyNotify)jabber_feature_free);
@@ -4056,9 +4045,7 @@ jabber_load(GPluginPlugin *plugin, GErro
 	jingle_rawudp_register(plugin);
 
 	jingle_content_register(plugin);
-#ifdef USE_VV
 	jingle_rtp_register(plugin);
-#endif
 
 	jabber_protocol_register_type(G_TYPE_MODULE(plugin));
 
diff --git a/libpurple/protocols/jabber/jingle/jingle.h b/libpurple/protocols/jabber/jingle/jingle.h
--- a/libpurple/protocols/jabber/jingle/jingle.h
+++ b/libpurple/protocols/jabber/jingle/jingle.h
@@ -74,12 +74,10 @@ void jingle_parse(JabberStream *js, cons
 
 void jingle_terminate_sessions(JabberStream *js);
 
-#ifdef USE_VV
 /* create a parameter array given autoconfigured STUN (and later perhaps TURN). */
 GHashTable *jingle_get_params(JabberStream *js, const gchar *relay_ip,
 	guint relay_udp, guint relay_tcp, guint relay_ssltcp,
 	const gchar *relay_username, const gchar *relay_password);
-#endif
 
 G_END_DECLS
 
diff --git a/libpurple/protocols/jabber/jingle/jingle.c b/libpurple/protocols/jabber/jingle/jingle.c
--- a/libpurple/protocols/jabber/jingle/jingle.c
+++ b/libpurple/protocols/jabber/jingle/jingle.c
@@ -33,9 +33,7 @@
 #include "rtp.h"
 
 #include <string.h>
-#ifdef USE_VV
 #include <gst/gst.h>
-#endif
 
 GType
 jingle_get_type(const gchar *type)
@@ -47,10 +45,8 @@ jingle_get_type(const gchar *type)
 		return JINGLE_TYPE_RAWUDP;
 	else if (purple_strequal(type, JINGLE_TRANSPORT_ICEUDP))
 		return JINGLE_TYPE_ICEUDP;
-#ifdef USE_VV
 	else if (purple_strequal(type, JINGLE_APP_RTP))
 		return JINGLE_TYPE_RTP;
-#endif
 	else
 		return G_TYPE_NONE;
 }
@@ -432,7 +428,6 @@ jingle_terminate_sessions(JabberStream *
 	}
 }
 
-#ifdef USE_VV
 static void
 jingle_create_relay_info(const gchar *ip, guint port, const gchar *username,
 	const gchar *password, const gchar *relay_type, GPtrArray *relay_info)
@@ -518,5 +513,3 @@ jingle_get_params(JabberStream *js, cons
 
 	return params;
 }
-#endif
-
diff --git a/libpurple/protocols/jabber/jingle/rtp.h b/libpurple/protocols/jabber/jingle/rtp.h
--- a/libpurple/protocols/jabber/jingle/rtp.h
+++ b/libpurple/protocols/jabber/jingle/rtp.h
@@ -27,8 +27,6 @@
 
 #include "config.h"
 
-#ifdef USE_VV
-
 #include <glib.h>
 #include <glib-object.h>
 
@@ -63,7 +61,5 @@ void jingle_rtp_terminate_session(Jabber
 
 G_END_DECLS
 
-#endif /* USE_VV */
-
 #endif /* PURPLE_JABBER_JINGLE_RTP_H */
 
diff --git a/libpurple/protocols/jabber/jingle/rtp.c b/libpurple/protocols/jabber/jingle/rtp.c
--- a/libpurple/protocols/jabber/jingle/rtp.c
+++ b/libpurple/protocols/jabber/jingle/rtp.c
@@ -24,8 +24,6 @@
 
 #include <config.h>
 
-#ifdef USE_VV
-
 #include <glib/gi18n-lib.h>
 
 #include <purple.h>
@@ -930,5 +928,3 @@ jingle_rtp_terminate_session(JabberStrea
 		}
 	}
 }
-
-#endif /* USE_VV */
diff --git a/meson.build b/meson.build
--- a/meson.build
+++ b/meson.build
@@ -322,46 +322,9 @@ sqlite3 = dependency('sqlite3', version 
 gstreamer = dependency('gstreamer-1.0', version : '>=1.14')
 
 #######################################################################
-# Check for GStreamer Video
-#######################################################################
-gstreamer_video = dependency('gstreamer-video-1.0',
-                             required : get_option('gstreamer-video'))
-conf.set('USE_GSTVIDEO', gstreamer_video.found())
-
-#######################################################################
-# Check for Voice and Video support
-#######################################################################
-if get_option('vv').enabled() or get_option('vv').auto()
-	if gstreamer_video.found()
-		conf.set('USE_VV', true)
-		enable_vv = true
-	else
-		if get_option('vv').enabled()
-			error('''
-Dependencies for voice/video were not met.
-Install the necessary gstreamer packages first.
-Or use -Dvv=disabled if you do not need voice/video support.
-			''')
-		endif
-		enable_vv = false
-	endif
-else
-	enable_vv = false
-endif
-
-#######################################################################
 # Check for Raw data streams support in Farstream
 #######################################################################
-if enable_vv
-	gstreamer_app = dependency('gstreamer-app-1.0',
-	                           required : false)
-	if gstreamer_app.found()
-		conf.set('USE_GSTAPP', true)
-		conf.set('HAVE_MEDIA_APPLICATION', true)
-	endif
-else
-	gstreamer_app = []
-endif
+gstreamer_app = dependency('gstreamer-app-1.0')
 
 #######################################################################
 # Check for Meanwhile headers (for Sametime)
@@ -707,7 +670,6 @@ summary({
 summary({
     'GTK': get_option('gtkui'),
     'console': enable_consoleui,
-    'Voice and Video': enable_vv,
     'X11 support': x11.found(),
 }, section: 'User Interfaces', bool_yn: true)
 
diff --git a/meson_options.txt b/meson_options.txt
--- a/meson_options.txt
+++ b/meson_options.txt
@@ -19,18 +19,12 @@ option('build-dependencies', type : 'boo
 ##############################################################################
 # Libpurple Options
 
-option('gstreamer-video', type : 'feature',
-       description : 'compile with GStreamer 1.0 Video Overlay support')
-
 option('kwallet', type : 'feature',
        description : 'enable KWallet support')
 
 option('libsecret', type : 'feature',
        description : 'enable libsecret support')
 
-option('vv', type : 'feature',
-       description : 'compile with voice and video support')
-
 option('soup3', type : 'boolean', value : false,
        description : 'compile against libsoup3')
 
diff --git a/pidgin/gtkaccount.c b/pidgin/gtkaccount.c
--- a/pidgin/gtkaccount.c
+++ b/pidgin/gtkaccount.c
@@ -876,7 +876,6 @@ add_account_options(AccountPrefsDialog *
 static void
 add_voice_options(AccountPrefsDialog *dialog)
 {
-#ifdef USE_VV
 	if (!dialog->protocol || !PURPLE_PROTOCOL_IMPLEMENTS(dialog->protocol, MEDIA, initiate_session)) {
 		if (dialog->voice_frame) {
 			gtk_widget_destroy(dialog->voice_frame);
@@ -906,7 +905,6 @@ add_voice_options(AccountPrefsDialog *di
 	} else {
 		gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dialog->suppression_check), FALSE);
 	}
-#endif
 }
 
 static gboolean
diff --git a/pidgin/gtkblist.c b/pidgin/gtkblist.c
--- a/pidgin/gtkblist.c
+++ b/pidgin/gtkblist.c
@@ -406,7 +406,6 @@ pidgin_blist_menu_autojoin_cb(GSimpleAct
 	g_simple_action_set_state(action, state);
 }
 
-#ifdef USE_VV
 static void
 pidgin_blist_menu_audio_call_cb(G_GNUC_UNUSED GSimpleAction *action,
                                 G_GNUC_UNUSED GVariant *parameter,
@@ -419,7 +418,6 @@ pidgin_blist_menu_audio_call_cb(G_GNUC_U
 	                               purple_buddy_get_name(buddy),
 	                               PURPLE_MEDIA_AUDIO);
 }
-#endif /* USE_VV */
 
 static void
 pidgin_blist_menu_block_cb(GSimpleAction *action, GVariant *state,
@@ -612,7 +610,6 @@ pidgin_blist_set_node_custom_icon(G_GNUC
 	gtk_native_dialog_show(GTK_NATIVE_DIALOG(win));
 }
 
-#ifdef USE_VV
 static void
 pidgin_blist_menu_video_call_cb(G_GNUC_UNUSED GSimpleAction *action,
                                 G_GNUC_UNUSED GVariant *parameter,
@@ -638,7 +635,6 @@ pidgin_blist_menu_video_call_cb(G_GNUC_U
 		purple_protocol_initiate_media(account, buddy_name, PURPLE_MEDIA_VIDEO);
 	}
 }
-#endif
 
 static GActionEntry menu_actions[] = {
 	{
@@ -655,11 +651,9 @@ static GActionEntry menu_actions[] = {
 		.activate = pidgin_blist_toggle_action,
 		.state = "false",
 		.change_state = pidgin_blist_menu_autojoin_cb,
-#ifdef USE_VV
 	}, {
 		.name = "buddy-audio-call",
 		.activate = pidgin_blist_menu_audio_call_cb,
-#endif /* USE_VV */
 	}, {
 		.name = "buddy-block",
 		.activate = pidgin_blist_toggle_action,
@@ -674,11 +668,9 @@ static GActionEntry menu_actions[] = {
 	}, {
 		.name = "buddy-send-file",
 		.activate = pidgin_blist_menu_send_file_cb,
-#ifdef USE_VV
 	}, {
 		.name = "buddy-video-call",
 		.activate = pidgin_blist_menu_video_call_cb,
-#endif /* USE_VV */
 	}, {
 		.name = "chat-settings",
 		.activate = pidgin_blist_menu_chat_settings_cb,
@@ -1627,7 +1619,6 @@ pidgin_blist_show_context_menu(GtkWidget
 
 		g_simple_action_set_enabled(G_SIMPLE_ACTION(action), enabled);
 
-#ifdef USE_VV
 		if(protocol != NULL &&
 		   PURPLE_PROTOCOL_IMPLEMENTS(protocol, MEDIA, get_caps))
 		{
@@ -1646,7 +1637,6 @@ pidgin_blist_show_context_menu(GtkWidget
 			          (caps & PURPLE_MEDIA_CAPS_VIDEO);
 			g_simple_action_set_enabled(G_SIMPLE_ACTION(action), enabled);
 		}
-#endif /* USE_VV */
 
 		/* Set the proper state of the block action. */
 		action = g_action_map_lookup_action(action_map, "buddy-block");
@@ -3215,12 +3205,10 @@ pidgin_blist_populate_menus(void) {
 	target = gtk_application_get_menu_by_id(application, "buddy-custom-icon");
 	g_menu_append_section(target, NULL, G_MENU_MODEL(source));
 
-#ifdef USE_VV
 	/* Add the voice and video menu to the buddy menu. */
 	source = gtk_application_get_menu_by_id(application, "voice-video");
 	target = gtk_application_get_menu_by_id(application, "buddy-voice-video");
 	g_menu_append_section(target, NULL, G_MENU_MODEL(source));
-#endif /* USE_VV */
 }
 
 static void pidgin_blist_show(PurpleBuddyList *list)
diff --git a/pidgin/gtkconv.c b/pidgin/gtkconv.c
--- a/pidgin/gtkconv.c
+++ b/pidgin/gtkconv.c
@@ -343,7 +343,6 @@ unblock_cb(GtkWidget *widget, PidginConv
 		pidgin_request_add_permit(account, purple_conversation_get_name(conv));
 }
 
-#ifdef USE_VV
 static void
 menu_initiate_media_call_cb(GtkAction *action, gpointer data)
 {
@@ -360,7 +359,6 @@ menu_initiate_media_call_cb(GtkAction *a
 			PURPLE_MEDIA_VIDEO : PURPLE_MEDIA_NONE);
 #endif
 }
-#endif
 
 static void
 menu_block_cb(GtkAction *action, gpointer data)
@@ -997,12 +995,10 @@ static GtkActionEntry menu_entries[] =
 	/* Conversation menu */
 	{ "ConversationMenu", NULL, N_("_Conversation"), NULL, NULL, NULL },
 
-#ifdef USE_VV
 	{ "MediaMenu", NULL, N_("M_edia"), NULL, NULL, NULL },
 	{ "AudioCall", NULL, N_("_Audio Call"), NULL, NULL, G_CALLBACK(menu_initiate_media_call_cb) },
 	{ "VideoCall", NULL, N_("_Video Call"), NULL, NULL, G_CALLBACK(menu_initiate_media_call_cb) },
 	{ "AudioVideoCall", NULL, N_("Audio/Video _Call"), NULL, NULL, G_CALLBACK(menu_initiate_media_call_cb) },
-#endif
 
 	{ "Block", NULL, N_("_Block..."), NULL, NULL, G_CALLBACK(menu_block_cb) },
 	{ "Unblock", NULL, N_("_Unblock..."), NULL, NULL, G_CALLBACK(menu_unblock_cb) },
diff --git a/pidgin/gtkmedia.c b/pidgin/gtkmedia.c
--- a/pidgin/gtkmedia.c
+++ b/pidgin/gtkmedia.c
@@ -34,10 +34,6 @@
 #include "pidgincore.h"
 #include "pidginkeypad.h"
 
-#ifdef USE_VV
-
-#include <gdk/gdkkeysyms.h>
-
 #define PIDGIN_TYPE_MEDIA            (pidgin_media_get_type())
 #define PIDGIN_MEDIA(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), PIDGIN_TYPE_MEDIA, PidginMedia))
 #define PIDGIN_MEDIA_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass), PIDGIN_TYPE_MEDIA, PidginMediaClass))
@@ -113,13 +109,6 @@ static void pidgin_media_get_property (G
 static void pidgin_media_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
 static void pidgin_media_set_state(PidginMedia *gtkmedia, PidginMediaState state);
 
-#if 0
-enum {
-	LAST_SIGNAL
-};
-static guint pidgin_media_signals[LAST_SIGNAL] = {0};
-#endif
-
 enum {
 	PROP_0,
 	PROP_MEDIA,
@@ -926,12 +915,10 @@ pidgin_media_new_cb(PurpleMediaManager *
 
 	return TRUE;
 }
-#endif  /* USE_VV */
 
 void
 pidgin_medias_init(void)
 {
-#ifdef USE_VV
 	PurpleMediaManager *manager = purple_media_manager_get();
 	PurpleMediaElementInfo *video_src = NULL;
 	PurpleMediaElementInfo *video_sink = NULL;
@@ -1002,5 +989,4 @@ pidgin_medias_init(void)
 	purple_media_manager_set_active_element(manager, video_sink);
 	purple_media_manager_set_active_element(manager, audio_src);
 	purple_media_manager_set_active_element(manager, audio_sink);
-#endif
 }
diff --git a/pidgin/meson.build b/pidgin/meson.build
--- a/pidgin/meson.build
+++ b/pidgin/meson.build
@@ -67,12 +67,8 @@ libpidgin_SOURCES = [
 	'prefs/pidgincredentialprefs.c',
 	'prefs/pidginnetworkprefs.c',
 	'prefs/pidginproxyprefs.c',
+	'prefs/pidginvvprefs.c',
 ]
-if enable_vv
-	libpidgin_SOURCES += [
-		'prefs/pidginvvprefs.c',
-	]
-endif
 
 libpidgin_headers = [
 	'gtkaccount.h',
@@ -145,12 +141,8 @@ libpidgin_prefs_headers = [
 	'prefs/pidgincredentialprefs.h',
 	'prefs/pidginnetworkprefs.h',
 	'prefs/pidginproxyprefs.h',
+	'prefs/pidginvvprefs.h',
 ]
-if enable_vv
-	libpidgin_prefs_headers += [
-		'prefs/pidginvvprefs.h',
-	]
-endif
 
 libpidgin_enum_headers = [
 	'gtkaccount.h',
@@ -228,7 +220,6 @@ if ENABLE_GTK
 	_libpidgin_dependencies = [
 		glib,
 		gplugin_gtk_dep,
-		gstreamer_video,
 		gtk,
 		IOKIT,
 		json,
diff --git a/pidgin/prefs/pidginprefs.c b/pidgin/prefs/pidginprefs.c
--- a/pidgin/prefs/pidginprefs.c
+++ b/pidgin/prefs/pidginprefs.c
@@ -36,15 +36,10 @@
 #include "pidginprefsinternal.h"
 #include "gtkutils.h"
 #include "pidgincore.h"
-#ifdef USE_VV
 #include "pidginvvprefs.h"
-#endif
 
 struct _PidginPrefsWindow {
 	GtkDialog parent;
-
-	/* Stack */
-	GtkWidget *stack;
 };
 
 /* Main dialog */
@@ -420,7 +415,6 @@ delete_prefs(GtkWidget *asdf, void *gdsa
 	prefs = NULL;
 }
 
-#ifdef USE_VV
 static void
 vv_test_switch_page_cb(GtkStack *stack, G_GNUC_UNUSED GParamSpec *pspec,
                        gpointer data)
@@ -432,7 +426,6 @@ vv_test_switch_page_cb(GtkStack *stack, 
 		pidgin_vv_prefs_disable_test_pipelines(vv_prefs);
 	}
 }
-#endif
 
 /******************************************************************************
  * GObject Implementation
@@ -448,26 +441,15 @@ pidgin_prefs_window_class_init(PidginPre
 	);
 
 	/* Main window */
-	gtk_widget_class_bind_template_child(widget_class, PidginPrefsWindow,
-	                                     stack);
 	gtk_widget_class_bind_template_callback(widget_class, delete_prefs);
+	gtk_widget_class_bind_template_callback(widget_class,
+	                                        vv_test_switch_page_cb);
 }
 
 static void
 pidgin_prefs_window_init(PidginPrefsWindow *win)
 {
-#ifdef USE_VV
-	GtkWidget *vv = NULL;
-#endif
-
 	gtk_widget_init_template(GTK_WIDGET(win));
-
-#ifdef USE_VV
-	vv = pidgin_vv_prefs_new();
-	gtk_stack_add_titled(GTK_STACK(win->stack), vv, "vv", _("Voice/Video"));
-	g_signal_connect(win->stack, "notify::visible-child",
-	                 G_CALLBACK(vv_test_switch_page_cb), vv);
-#endif
 }
 
 /******************************************************************************
@@ -500,7 +482,6 @@ pidgin_prefs_init(void)
 	purple_prefs_add_path(PIDGIN_PREFS_ROOT "/filelocations/last_open_folder", "");
 	purple_prefs_add_path(PIDGIN_PREFS_ROOT "/filelocations/last_icon_folder", "");
 
-#ifdef USE_VV
 	/* Voice/Video */
 	purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig");
 	purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig/audio");
@@ -514,7 +495,6 @@ pidgin_prefs_init(void)
 	purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig/video");
 	purple_prefs_add_none(PIDGIN_PREFS_ROOT "/vvconfig/video/sink");
 	purple_prefs_add_string(PIDGIN_PREFS_ROOT "/vvconfig/video/sink/device", "");
-#endif
 
 	pidgin_prefs_update_old();
 }
diff --git a/pidgin/resources/Prefs/prefs.ui b/pidgin/resources/Prefs/prefs.ui
--- a/pidgin/resources/Prefs/prefs.ui
+++ b/pidgin/resources/Prefs/prefs.ui
@@ -82,6 +82,7 @@ Foundation, Inc., 51 Franklin Street, Fi
               <object class="GtkStack" id="stack">
                 <property name="visible">True</property>
                 <property name="can-focus">False</property>
+                <signal name="notify::visible-child" handler="vv_test_switch_page_cb" object="vv" swapped="no"/>
                 <child>
                   <object class="PidginConversationPrefs">
                     <property name="visible">True</property>
@@ -137,6 +138,17 @@ Foundation, Inc., 51 Franklin Street, Fi
                     <property name="position">4</property>
                   </packing>
                 </child>
+                <child>
+                  <object class="PidginVVPrefs" id="vv">
+                    <property name="visible">True</property>
+                    <property name="can-focus">False</property>
+                  </object>
+                  <packing>
+                    <property name="name">vv</property>
+                    <property name="title" translatable="yes">Voice/Video</property>
+                    <property name="position">5</property>
+                  </packing>
+                </child>
               </object>
               <packing>
                 <property name="expand">False</property>
