654 Commits

Author SHA1 Message Date
jp9000
2920369daf Call send_packet instead of.. doing nothing
GCC warned of this, but strangely not clang.
2014-03-16 16:28:21 -07:00
jp9000
bb92d582bf Add atomic increment/decrement platform funcs 2014-03-16 16:23:11 -07:00
jp9000
fd37d9e9a8 Implement encoder interface (still preliminary)
- Implement OBS encoder interface.  It was previously incomplete, but
   now is reaching some level of completion, though probably should
   still be considered preliminary.

   I had originally implemented it so that encoders only have a 'reset'
   function to reset their parameters, but I felt that having both a
   'start' and 'stop' function would be useful.

   Encoders are now assigned to a specific video/audio media output each
   rather than implicitely assigned to the main obs video/audio
   contexts.  This allows separate encoder contexts that aren't
   necessarily assigned to the main video/audio context (which is useful
   for things such as recording specific sources).  Will probably have
   to do this for regular obs outputs as well.

   When creating an encoder, you must now explicitely state whether that
   encoder is an audio or video encoder.

   Audio and video can optionally be automatically converted depending
   on what the encoder specifies.

   When something 'attaches' to an encoder, the first attachment starts
   the encoder, and the encoder automatically attaches to the media
   output context associated with it.  Subsequent attachments won't have
   the same effect, they will just start receiving the same encoder data
   when the next keyframe plays (along with SEI if any).  When detaching
   from the encoder, the last detachment will fully stop the encoder and
   detach the encoder from the media output context associated with the
   encoder.

   SEI must actually be exported separately; because new encoder
   attachments may not always be at the beginning of the stream, the
   first keyframe they get must have that SEI data in it.  If the
   encoder has SEI data, it needs only add one small function to simply
   query that SEI data, and then that data will be handled automatically
   by libobs for all subsequent encoder attachments.

 - Implement x264 encoder plugin, move x264 files to separate plugin to
   separate necessary dependencies.

 - Change video/audio frame output structures to not use const
   qualifiers to prevent issues with non-const function usage elsewhere.
   This was an issue when writing the x264 encoder, as the x264 encoder
   expects non-const frame data.

   Change stagesurf_map to return a non-const data type to prevent this
   as well.

 - Change full range parameter of video scaler to be an enum rather than
   boolean
2014-03-16 16:21:34 -07:00
jp9000
04d07831cc CoreAudio: If null device id, just set to default 2014-03-11 19:45:02 -07:00
jp9000
ae1fffef7a CoreAudio: Set default audio settings on creation
device_id would end up being null, which would mess with the functions.
2014-03-11 19:42:04 -07:00
jp9000
74a3dfcf69 Fix potential uninitialized variable
if (data->output->flags & AVFMT_RAWPICTURE)

If this was true, the 'ret' variable would be used without
initialization.
2014-03-11 16:07:22 -07:00
jp9000
6578c8b03e FFmpeg plugin: Fix null pointer reference 2014-03-11 14:46:34 -07:00
jp9000
2d6a7c89ca Remove trailing whitespaces from linux plugins 2014-03-11 10:12:54 -07:00
Jim
88e4e7f1be Merge pull request #49 from fryshorts/linux-input
linux input plugins for desktop and audio capture
2014-03-11 10:07:09 -07:00
jp9000
afc798f712 Also make sure the mutex unlocks
Otherwise deadlock
2014-03-11 09:16:16 -07:00
jp9000
c09a2efc3c FFmpeg plugin: Add a few checks to be safe
Make sure it locks the write mutex before freeing the packets, and put
the detach code in the main thread loop rather than off in a separate
function for clarity
2014-03-11 09:14:21 -07:00
fryshorts
32c8cd00c5 Fixed usage of event functions
The event functions got renamed in obs.
2014-03-11 14:16:03 +01:00
fryshorts
c0ab8fadda moved and split up the linux xshm and pulseaudio capture plugins 2014-03-11 14:06:10 +01:00
fryshorts
f28912101e Use default pulse audio frame format for recording
We use the default format to avoid any resampling by pulse audio,
since obs will probably resample anyways if necessary.
2014-03-11 14:01:10 +01:00
fryshorts
ce9db65695 changed to kernel formatting and added some more documentation 2014-03-11 14:01:10 +01:00
fryshorts
63d441e182 added functions to translate obs settings to pulse 2014-03-11 14:01:10 +01:00
fryshorts
f13ae77e00 disable blending for desktop capture 2014-03-11 14:01:10 +01:00
fryshorts
47a6f54910 use pa_mainloop_iterate instead of own implementation
pulse audio provides it's own convenience function to
iterate the mainloop, no need to use a custom one.
pulseaudio provides timing information for the stream, we use
that instead of system time.
2014-03-11 14:01:10 +01:00
fryshorts
9095ad0a00 reformatted source to kernel style 2014-03-11 14:01:10 +01:00
fryshorts
09a75c5394 fixed warnings 2014-03-11 14:01:10 +01:00
fryshorts
c558a7b6fa Removed unnecessary buffer
Instead of copying the data from pulse to a local buffer and
then push it to obs, the pointer from pulse is now used and
pa_stream_drop() called afterwards.
2014-03-11 14:01:10 +01:00
Ziemas
e67d7607e4 In the API update the diffuse effect got renamed to image. 2014-03-11 14:01:10 +01:00
fryshorts
42bc5eddbb added initial pulse audio input plugin
- first try at implementing a pulse audio input plugin,
  it is currently completely untested.

- added license headers to source files
2014-03-11 14:01:10 +01:00
fryshorts
c00d9e3b4e Moved screen grabber code to _tick function
Moved the screen grabbing and texture generation to the
_tick function in order to keep _render fast.
Migrated xshm video source to the new plugin api.
2014-03-11 14:01:09 +01:00
fryshorts
820de55ae2 Added initial Mouse pointer lib
Added library to get the mouse pointer with the XFixes
extension and draw it via a sprite.
2014-03-11 14:01:09 +01:00
fryshorts
12e1855ebc added linux test module with first implementation of a screengrabber using the xshm extension for x11 2014-03-11 14:01:09 +01:00
jp9000
3aedfdfb73 Fix wrong linux function
Used the mac function instead by accident
2014-03-10 19:27:59 -07:00
jp9000
5e1cac68f4 Fix semaphore mac code and mac plugin
Didn't convert the event names and didn't have the right mac includes
2014-03-10 19:24:09 -07:00
jp9000
c023ef69ea Fix non-windows event code
And remember to compile on non-windows systems before committing
2014-03-10 19:08:42 -07:00
jp9000
585fd8f969 Fix audio streaming and mac semaphores
...The reason why audio didn't work was because I overwrote the bitrate
values.

As for semaphores, mac doesn't support unnamed semaphores without using
mach semaphores.  So, I just implemented a semaphore wrapper for each
OS.
2014-03-10 19:04:00 -07:00
jp9000
faabeff743 Allow file names to be used instead of URLs 2014-03-10 14:48:17 -07:00
jp9000
9a07f9b875 Fix minor warning (redundant code) 2014-03-10 14:00:53 -07:00
jp9000
806837873a CoreAudio: fix properties for input/output
Also, check that audio devices are available before setting defaults
2014-03-10 13:59:15 -07:00
jp9000
03fc5b92b3 Ensure URL and key are valid if trying to stream 2014-03-10 13:46:28 -07:00
jp9000
5288467aeb Ensure names are valid
Ensure that a source has a valid name.  Duplicates aren't a big deal
internally, but sources without a name are probably something that
should be avoided.  Made is so that if a source is programmatically
created without a name, it's assigned an index based name.

In the main basic-mode window, made it check to make sure the name was
valid as well.
2014-03-10 13:39:51 -07:00
jp9000
35e7a2a9fe Fix a few warnings 2014-03-10 13:23:28 -07:00
jp9000
02a07ea0a0 Add preliminary streaming code for testing
- Add some temporary streaming code using FFmpeg.  FFmpeg itself is not
   very ideal for streaming; lack of direct control of the sockets and
   no framedrop handling means that FFmpeg is definitely not something
   you want to use without wrapper code.  I'd prefer writing my own
   network framework in this particular case just because you give away
   so much control of the network interface.  Wasted an entire day
   trying to go through FFmpeg issues.

   There's just no way FFmpeg should be used for real streaming (at
   least without being patched or submitting some sort of patch, but I'm
   sort of feeling "meh" on that idea)

   I had to end up writing multiple threads just to handle both
   connecting and writing, because av_interleaved_write_frame blocks
   every call, stalling the main encoder thread, and thus also stalling
   draw signals.

 - Add some temporary user interface for streaming settings.  This is
   just temporary for the time being.  It's in the outputs section of
   the basic-mode settings

 - Make it so that dynamic arrays do not free all their data when the
   size just happens to be reduced to 0.  This prevents constant
   reallocation when an array keeps going from 1 item to 0 items.  Also,
   it was bad to become dependent upon that functionality.  You must now
   always explicitly call "free" on it to ensure the data is free, and
   that's how it should be.  Implicit functionality can lead to
   confusion and maintainability issues.
2014-03-10 13:10:35 -07:00
jp9000
b2202c4843 UI: Swap audio slots
Had the audio restart slot connected to things that didn't require a
restart
2014-03-07 22:34:49 -07:00
jp9000
a9f5959b3c Fix an error and a few warnings
The strings didn't have ending double quotes.  No clue why this didn't
fail in GCC and VC.  Well, VC is horrible but I expected better out of
GCC.
2014-03-07 17:19:26 -07:00
jp9000
f2ee950746 Activate user-selected audio devices
- Fix a bug where the initial audio data insertion would cause all
   audio data to unintentionally clear (mixed up < and > operators, damn
   human error)

 - Fixed a potential interdependant lock scenario with channel mutex
   locks and graphics mutex locks.  The main video thread could lock the
   graphics mutex and then while in the graphics mutex could lock the
   channels mutex.  Meanwhile in another thread, the channel mutex could
   get locked, and then the graphics mutex would get locked, causing a
   deadlock.

   The best way to deal with this is to not let mutexes lock within
   other mutexes, but sometimes it's difficult to avoid such as in the
   main video thread.

 - Audio devices should now be functional, and the devices in the audio
   settings can now be changed as desired.
2014-03-07 17:03:34 -07:00
jp9000
2c3a3f4e65 WASAPI: Change some errors messages to warnings
There shouldn't be errors if the actual source has successfully been
created, just warnings.
2014-03-07 13:04:38 -07:00
jp9000
fd579fe7f4 Make audio devices save to settings
Also, revamp the settings dialog code and make it use signals and slots
a bit better.
2014-03-07 12:56:31 -07:00
jp9000
e8044d0868 Use only one widget for preview
Modify the obs_display API so that it always uses an orthographic
projection that is the size of the display, rather than OBS' base size.
Having it do an orthographic projection to OBS' base size was silly
because it meant that everything would be skewed if you wanted to draw
1:1 in the display.  This deoes mean that the callbacks must handle
resizing the images, but it's worth it to ensure 1:1 draw sizes.

As for the preview widget, instead of making some funky widget within
widget that resizes, it's just going to be a widget within the entire
top layout.  Also changed the preview padding color to gray.
2014-03-07 10:19:03 -07:00
jp9000
7d48dbb1dc Add a way to get default settings
- Implement a means of obtaining default settings for an
   input/output/encoder.  obs_source_defaults for example will return
   the default settings for a particular source type.

 - Because C++ doesn't have designated initializers, use functions in
   the WASAPI plugin to register the sources instead.
2014-03-07 06:55:21 -07:00
jp9000
e88ee06310 Move basic mode configuration to a separate file
Having everything in global.ini meant that if you wanted different
settings for studio mode, that it would also overwrite it for basic
mode.  This way, the settings for each mode are separate, and you can
use different settings for each mode.
2014-03-06 21:08:12 -07:00
jp9000
9fb83cc233 Fixed basic settings window (forgot linux)
The function would fail to compile on linux because the variables didn't
exist
2014-03-06 12:05:19 -07:00
jp9000
2448d0f229 Load up the lists of audio devices in settings
It will now load up a the list of audio input/output devices in the
combo boxes in audio settings.
2014-03-06 07:02:25 -07:00
jp9000
4f7ab552df Reimplement monitor capture
- Implement windows monitor capture (code is so much cleaner than in
   OBS1).  Will implement duplication capture later

 - Add GDI texture support to d3d11 graphics library

 - Fix precision issue with sleep timing, you have to call
   timeBeginPeriod otherwise windows sleep will be totally erratic.
2014-03-05 10:43:14 -07:00
jp9000
3415960d02 WASAPI: Check the HRESULT values with FAILED
I can't believe I did !res there.  Well I suppose I can believe it, but
still.
2014-03-04 07:18:24 -07:00
jp9000
bec8a09bd9 CoreAudio: Separate enumeration code
The enumeration code being up at the top was making things quite messy,
so I split that code out to a separate set of files.
2014-03-04 07:10:33 -07:00