diff --git a/driver.c b/driver.c
index 4af2baa36e..2c372d509d 100644
--- a/driver.c
+++ b/driver.c
@@ -220,6 +220,7 @@ static void init_filter(void)
    if (*g_settings.video.filter_path == '\0')
       return;
 
+   SSNES_LOG("Loading bSNES filter from \"%s\"\n", g_settings.video.filter_path);
    g_extern.filter.lib = dylib_load(g_settings.video.filter_path);
    if (!g_extern.filter.lib)
    {
@@ -227,8 +228,8 @@ static void init_filter(void)
       return;
    }
 
-   g_extern.filter.psize = dylib_proc(g_extern.filter.lib, "video_size");
-   g_extern.filter.prender = dylib_proc(g_extern.filter.lib, "video_render");
+   g_extern.filter.psize = dylib_proc(g_extern.filter.lib, "filter_size");
+   g_extern.filter.prender = dylib_proc(g_extern.filter.lib, "filter_render");
    if (!g_extern.filter.psize || !g_extern.filter.prender)
    {
       SSNES_ERR("Failed to find functions in filter...\n");
@@ -255,7 +256,7 @@ static void init_filter(void)
    g_extern.filter.colormap = malloc(32768 * sizeof(uint32_t));
    assert(g_extern.filter.colormap);
 
-   // TODO: Taken from bSNES source. WTF does this do?
+   // Set up conversion map from 16-bit XBGR1555 to 32-bit RGBA.
    for (int i = 0; i < 32768; i++)
    {
       unsigned r = (i >> 10) & 31;
@@ -265,7 +266,7 @@ static void init_filter(void)
       r = (r << 3) | (r >> 2);
       g = (g << 3) | (g >> 2);
       b = (b << 3) | (b >> 2);
-      g_extern.filter.colormap[i] = (r << 16) | (g << 8) | (b << 0);
+      g_extern.filter.colormap[i] = (r << 24) | (g << 16) | (b << 8);
    }
 }
 #endif
@@ -345,6 +346,8 @@ void uninit_video_input(void)
 
    if ( driver.input_data != driver.video_data && driver.input )
       driver.input->free(driver.input_data);
+
+   deinit_filter();
 }
 
 driver_t driver;
diff --git a/dynamic.c b/dynamic.c
index 33d8be2118..3e6e63fc37 100644
--- a/dynamic.c
+++ b/dynamic.c
@@ -192,10 +192,14 @@ dylib_t dylib_load(const char *path)
 void* dylib_proc(dylib_t lib, const char *proc)
 {
 #ifdef _WIN32
-   return GetProcAddress(lib, proc);
+   void *sym = (void*)GetProcAddress(lib, proc);
 #else
-   return dlsym(lib, proc);
+   void *sym = dlsym(lib, proc);
 #endif
+
+   if (!sym)
+      SSNES_WARN("Failed to load symbol \"%s\"\n", proc);
+   return sym;
 }
 
 void dylib_close(dylib_t lib)
diff --git a/ssnes.c b/ssnes.c
index a75d2f61a1..fdb0b008a9 100644
--- a/ssnes.c
+++ b/ssnes.c
@@ -104,9 +104,8 @@ static void video_frame(const uint16_t *data, unsigned width, unsigned height)
       unsigned owidth = width;
       unsigned oheight = height;
       g_extern.filter.psize(&owidth, &oheight);
-
       g_extern.filter.prender(g_extern.filter.colormap, g_extern.filter.buffer, 
-            g_extern.filter.pitch >> 2, data, (height == 448 || height == 478) ? 512 : 1024, width, height);
+            g_extern.filter.pitch, data, (height == 448 || height == 478) ? 1024 : 2048, width, height);
       if (!driver.video->frame(driver.video_data, g_extern.filter.buffer, owidth, oheight, g_extern.filter.pitch, msg))
          g_extern.video_active = false;
    }