libobs: Add planar YUV 4:2:0 reverse shader

This allows uploading of I420 textures and directly converting on the
GPU.  Cuts down upload bandwidth to 37.5% of original rate.
libobs:  Add button support to properties

This adds button support to properties, which will allow a properties
pane to let the user click a button to activate something with a
particular obs context.  When pressed, the button will execute the
callback given, with the context's private data as a parameter.
libobs:  Add planar 4:2:0 async texture support

This uses the reverse planar YUV 4:2:0 conversion shader to output a YUV
texture without having to convert it via CPU.  Again, this will reduce
video upload bandwidth usage to 37.5% of the original rate.  I suspect
this will be particularly useful for when an FFmpeg or libav input
plugin for playing videos is made.

NOTE: There's an issue with certain texture sizes right now I haven't
been able to identify, if the full size of texture data divided by the
base texture width is an uneven number, the V chroma plane seems like it
can potentially shift, though I only had this happen with 160x90
resolution C920.  Almost all resolutions tend to be even.  Needs further
testing with more devices that support planar YUV 4:2:0 output.
libobs: Init source info before calling 'create'

When a source's private data is being created by a module, it wasn't
able to call most source functions because most functions rely on the
obs_source_info part of the context to be set.  This fixes that issue.

It was strange that this wasn't already the case because the other
context types already did the same thing.
libobs/util/dstr.c:  Don't find/replace if empty
libobs/util/dstr.c:  Add missing dstr_from_wcs
libobs/util:  Fix string conversion functions

There was a fundamental flaw with the string type conversion functions
where the sizes were not being properly accounted for.  They were using
the 'len' value as a value for the output rather than only for the
input, which was bad because the output could have more or less
characters than the input.
UI:  Add support for buttons in properties view.
libobs/util:  Add DStr RAII helper class

..Could also add some super nifty stuff later on too.  However, I think
using std::string whenever possible is probably for the best.
Plugins:  Remove old dshow plugin
WASAPI plugin: Mark parameter macro
win-dshow:  Add submodule 'libdshowcapture'
libobs:  Allow deferred source udpate on create

This allows sources to optionally defer update on creation in order to
prevent updates from being called from threads other than the video
thread.
Add preliminary DirectShow capture plugin

This covers the basics of devices.  Mostly functional but not at 100%
yet.  Uses 'libdshowcapture' library to capture directshow video/audio.
Both libdshowcapture and the plugin still need some work.  Should at
least capture basic webcams and capture cards for the time being.
UI:  Add 'win-dshow' plugin initialization

I really need to make this thing automatically search for plugins some
time.  I've got to admit it's kind of annoying.
Fix win-dshow module CMakeLists.txt

Didn't include the DirectShow library, and forgot to add one source file
Fix CMakeLists.txt yet again
win-dshow module: Fix configuration issues

The biggest problem with DirectShow is that available configuration
capabilities can change if you so much as look at it the wrong way.

Previously, configuring devices often didn't configure the device
settings correctly, you would choose one setting and then another
setting wouldn't be compatible with that settings.

Let's take the terrible microsoft lifecam series for example.  First,
you'd be at 640x480 happily webcam'ing away, which is using the YUY2
format.  Then you decide "hey, this webcam resolution is a bit low.  I
would love to have it a bit high resolution so it's a bit more crisp and
clear."  You'd select 1280x720, and then suddenly the only format
supported is MJPEG output.  However, the interface has to update that
fact, it can't list YUY2 if MJPEG is the only one available for this
resolution.  This doesn't just apply to formats either, this applies to
framerates and such as well.  Some framerates will only be supported by
certain resolutions which can in turn only be supported by certain
formats.

This causes user interface for configuration to be really be a nightmare
to manage if you want these features to be available to the user.  It's
extremely annoying because you have to update all the configuration UI
after something has changed, double check the configuration values, and
if the values aren't supported, update those configuration values.
Fix byte order for PSPacked422 users

Byte order was changed in 9595a78e8a272cc15ada4d456bc547ffcac3b73e
Fix typo in conversion technique name (there is no UYUV, only UYVY)