jp9000 afeed34b7a Change the UI to Qt (work in progress)
--------------------------------------------------
Notes and details
--------------------------------------------------
Why was this done?  Because wxWidgets was just lacking in many areas.  I
know wxWidgets is designed to be used with native controls, and that's
great, but wxWidgets just is not a feature-complete toolkit for
multiplatform applications.  It lacks in dialog editors, its code is
archaic and outdated, and I just feel frustrated every time I try to do
things with it.

Qt on the other hand..  I had to actually try Qt to realize how much
better it was as a toolkit.  They've got everything from dialog editors,
to an IDE, a debugger, build tools, just everything, and it's all
top-notch and highly maintained.  The focus of the toolkit is
application development, and they spend their time trying to help
people do exactly that:  make programs.  Great support, great tools,
and because of that, great toolkit.  I just didn't want to alienate any
developers by being stubborn about native widgets.

There *are* some things that are rather lackluster about it and design
choices I disagree with though.  For example, I realize that to have an
easy to use toolkit you have to have some level of code generation.
However, in my personal and humble opinion, moc just feels like a
terrible way to approach the problem.  Even now I feel like there are a
variety of ways you could handle code generation and automatic
management of things like that.  I don't like the idea of circumventing
the language itself like that.  It feels like one giant massive hack.

--------------------------------------------------
Things that aren't working properly:
--------------------------------------------------
 - Settings dialog is not implemented.  The dialog is complete but the
   code to handle the dialog hasn't been constructed yet.

 - There is a problem with using Qt widgets as a device target on
   windows, with at least OpenGL: if I have the preview widget
   automatically resize itself, it seems to cause some sort of video
   card failure that I don't understand.

 - Because of the above, resizing the preview widget has been disabled
   until I can figure out what's going on, so it's currently only a
   32x32 area.

 - Direct3D doesn't seem to render correctly either, seems that the
   viewport is messed up or something.  I'm sort of confused about
   what's going on with it.

 - The new main window seems to be triggering more race conditions than
   the wxWidgets main window dialog did.  I'm not entirely sure what's
   going on here, but this may just be existing race conditions within
   libobs itself that I just never spotted before (even though I tend to
   be very thorough with race conditions any time I use variables
   cross-thread)
2014-01-23 11:53:55 -07:00
2014-01-09 03:53:34 +01:00
2013-09-30 19:37:13 -07:00
2014-01-20 01:40:15 -07:00
2014-01-09 22:10:04 -07:00
2013-09-30 19:37:13 -07:00
2013-12-27 16:41:01 -06:00
2014-01-01 03:17:36 +01:00

What is OBS?

  This project is a rewrite of what was formerly known as "Open Broadcaster
  Software", software originally designed for recording and streaming live
  video content, efficiently.


What's the goal of rewriting OBS?

 - Make it multiplatform.  Use multiplatform libraries/functions/classes where
   possible to allow this.  Multi-platform support was one of the primary
   reasons for the rewrite.  This also means using a UI toolkit will be
   necessary for user interface.  It also means allowing the use of OpenGL as
   well as Direct3D.

 - Separate the application from the core, allowing custom application of
   the core if desired, and easier extending of the user interface.

 - Simplify complex systems to not only make it easier to use, but easier to
   maintain.

 - Write a better core API, and design the entire system to be modular.

 - Now that we have much more experience, improve the overall design of all
   the subsystems/API, and minimize/eliminate design flaws.  Make it so we can
   do all the things we've had trouble with before, such as custom outputs,
   multiple outputs at once, better handling of inputs, custom services.

 - Make a better/cleaner code base, use better coding standards, use standard
   libraries where possible (not just STL and C standard library, but also
   things like ffmpeg as well), and improve maintainability of the project as a
   whole.

 - Implement a new API-independent shader/effect system allowing better and
   easier shaders usage and customization without having to duplicate shader
   code.

 - Better device support.  Again, I didn't know what I was getting into when
   I originally started writing code for devices.  It evolved into a totally
   convoluted mess.  I would have improved the existing device plugin code, but
   it was just all so fundamentally bad and flawed that it would have been
   detrimental to progression to continue working on it rather than rewrite it.


What was wrong with the original OBS?

  The original OBS was rewritten not because it was bad, at least in terms of
  optimization.  Optimization and graphics are things I love.  However, there
  were some serious problems with the code and design that were deep and
  fundamental, which prevented myself and other developers from being able to
  improve/extend the application or add new features very easily.

  First, the design flaws:

    - The original OBS was completely and hopelessly hard-coded for windows,
      and only windows.  It was just totally impossible to use it on other
      systems.

    - All the sub-systems were written before I really knew what I was getting
      into.  When I started the project, I didn't really fully comprehend the
      scope of what I would need or how to properly design the project.  My
      design and plans for the application were just to write something that
      would "stream games and a webcam, with things like overlays and such."
      This turned out fine for most casual gamers and streamers (and very
      successful), but left anyone wanting to do anything more advanced left
      massively wanting.

    - Subsystems and core functionalities intermingled in such a way that it
      was a nightmare to get proper custom functionality out of it.  Things
      like QSV had to be meshed in with the main encoding loop, and it just
      made things a nightmare to deal with.  Custom outputs were nigh
      impossible.

    - The API was poorly designed because most of it came after I originally
      wrote the application, it was more of an afterthought, and plugin API
      would routinely break for plugin developers due to changing C++
      interfaces (one of the reasons the core is now C).

    - API was intermeshed with the main executable.  The OBSApi DLL was
      nothing more than basically this mutant growth upon OBS.exe that allowed
      plugin developers to barely write plugins, but all the important API
      code was actually stored in the executable.  Navigation was a total mess.

    - The graphics subsystem, while not bad, was incomplete, and though far
      easier to use than bare D3D, wasn't ideal, and was hard-coded for D3D
      specifically.

    - The devices and audio code was poor, I had no idea what I was getting into
      when I started writing them in.  I did not realize beforehand all the
      device-specific quirks that each device/system could have.  Some devices
      had bad timing and quirks that I never aniticipated while writing them.
      I struggled with devices, and my original design for the audio subsystem
      for example morphed over and over into an abomination that, though works,
      is basically this giant duct-taped zombie monster.

    - Shaders were difficult to customize because they had to be duplicated if
      you wanted slightly different functionality that required more than just
      changing shader constants.

    - Oriantation of sources was fixed, and required special code for each
      source to do any custom modification of rotation/position/scale/etc.
      This is one of those fundamental flaws that I look back on and regret, as
      it was a stupid idea from the beginning.  I originally thought I could
      get more accurate source position/sizes, but it just turned out to be
      totally bad.  Should have been matrices from the beginning just like with
      a regular 3D engine.

  Second, the coding flaws:

    - The coding style was inconsistent.

    - C++98, C-Style C++, there was no exception usage, no STL.  C++ used
      poorly.

    - Not Invented Here Syndrome everywhere.  Custom string functions/classes,
      custom templates, custom everything everywhere.  To be fair, it was all
      hand-me-down code from the early 2000s that I had become used to, but
      that was no excuse -- C-standard libraries and the STL should have been
      used from the beginning over anything else.  That doesn't mean to say
      that using custom stuff is always bad, but doing it to the extent I did
      definitely was.  Made it horrible to maintain as well, required extra
      knowledge for plugin developers and anyone messing with the code.

    - Giant monolithic classes everywhere, the main OBS class was paricularly
      bad in this regard.  This meant navigation was a nightmare, and no one
      really knew where to go or where to add/change things.

    - Giant monolithic functions everywhere.  This was particularly bad
      because it meant that functions became harder to debug and harder to
      keep track of what was going on in any particular function at any given
      time.  These large functions, though not inefficient, were delicate and
      easily breakable.  (See OBS::MainCaptureLoop for a nightmarish example,
      or the listbox subclass window procedure in WindowStuff.cpp)

    - Very large file sizes with everything clumped up into single files (for
      another particularly nightmarish example, see WindowStuff.cpp)

    - Bad formatting.  Code could go beyond 200 columns in some cases, making
      it very unpleasant to read with many editors.  Spaces instead of tabs,
      K&R mixed with allman (which was admittedly my fault).


New (actual) coding guidelines

 - For the C code (especially in the core), guidelines are pretty strict K&R,
   kernel style.  See the linux kernel "CodingStyle" document for more
   information.  That particular coding style guideline is for more than just
   style, it actually helps produce a better overall code base.

 - For C++ code, I still use CamelCase instead of all_lowercase just because
   I prefer it that way, it feels right with C++ for some reason.  It also
   helps make it distinguishable from C code.

 - I've started using 8-column tabs for almost everything -- I really
   personally like it over 4-column tabs.  I feel that 8-column tabs are very
   helpful in preventing large amounts of indentation.  A self-imposed
   limitation, if you will.  I also use actual tabs now, instead of spaces.
   Also, I feel that the K&R style looks much better/cleaner when viewed with
   8-column tabs.

 - Preferred maximum columns: 80.  I've also been doing this because in
   combination with 8-column tabs, it further prevents large/bad functions
   with high indentation.  Another self-imposed limitation.  Also, it makes
   for much cleaner viewing in certain editors that wrap (like vim).
Description
No description provided
Readme 60 MiB
Languages
C 56%
C++ 36.8%
CMake 3%
Objective-C++ 1.5%
Objective-C 1.3%
Other 1.4%