2013-09-30 19:37:13 -07:00
|
|
|
/******************************************************************************
|
2016-03-12 06:28:59 -08:00
|
|
|
Copyright (C) 2013-2014 by Hugh Bailey <jim@obsproject.com>
|
2013-09-30 19:37:13 -07:00
|
|
|
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
2013-12-02 21:24:38 -08:00
|
|
|
the Free Software Foundation, either version 2 of the License, or
|
2013-09-30 19:37:13 -07:00
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
******************************************************************************/
|
|
|
|
|
2013-10-14 04:21:15 -07:00
|
|
|
#pragma once
|
2013-09-30 19:37:13 -07:00
|
|
|
|
|
|
|
#include "util/c99defs.h"
|
2013-12-30 09:14:28 -08:00
|
|
|
#include "util/bmem.h"
|
2015-08-02 03:06:00 -07:00
|
|
|
#include "util/profiler.h"
|
2014-07-09 21:28:40 -07:00
|
|
|
#include "util/text-lookup.h"
|
2013-09-30 19:37:13 -07:00
|
|
|
#include "graphics/graphics.h"
|
|
|
|
#include "graphics/vec2.h"
|
2014-06-15 00:16:03 -07:00
|
|
|
#include "graphics/vec3.h"
|
Simplify media i/o interfaces
Completely revamped the entire media i/o data and handlers. The
original idea was to have a system that would have connecting media
inputs and outputs, but at a certain point I realized that this was an
unnecessary complexity for what we wanted to do. (Also, it reminded me
of directshow filters, and I HATE directshow with a passion, and
wouldn't wish it upon my greatest enemy)
Now, audio/video outputs are connected to directly, with better callback
handlers, and will eventually have the ability to automatically handle
conversions such as 4:4:4 to 4:2:0 when connecting to an input that uses
them. Doing this will allow the video/audio i/o handlers to also
prevent duplicate conversion, as well as make it easier/simple to use.
My true goal for this is to make output and encoder plugins as simple to
create as possible. I want to be able to be able to create an output
plugin with almost no real hassle of having to worry about image
conversions, media inputs/outputs, etc. A plugin developer shouldn't
have to handle that sort of stuff when he/she doesn't really need to.
Plugins will be able to simply create a callback via obs_video() and/or
obs_audio(), and they will automatically receive the audio/video data in
the formats requested via a simple callback, without needing to do
almost anything else at all.
2014-01-14 00:58:47 -08:00
|
|
|
#include "media-io/audio-io.h"
|
|
|
|
#include "media-io/video-io.h"
|
2013-12-26 22:10:15 -08:00
|
|
|
#include "callback/signal.h"
|
|
|
|
#include "callback/proc.h"
|
2013-09-30 19:37:13 -07:00
|
|
|
|
2014-05-21 03:58:20 -07:00
|
|
|
#include "obs-config.h"
|
2014-02-12 11:57:51 -08:00
|
|
|
#include "obs-defs.h"
|
|
|
|
#include "obs-data.h"
|
|
|
|
#include "obs-ui.h"
|
|
|
|
#include "obs-properties.h"
|
2014-09-14 13:31:57 -07:00
|
|
|
#include "obs-interaction.h"
|
2014-02-12 11:57:51 -08:00
|
|
|
|
2014-06-15 00:16:03 -07:00
|
|
|
struct matrix4;
|
|
|
|
|
Revamp API and start using doxygen
The API used to be designed in such a way to where it would expect
exports for each individual source/output/encoder/etc. You would export
functions for each and it would automatically load those functions based
on a specific naming scheme from the module.
The idea behind this was that I wanted to limit the usage of structures
in the API so only functions could be used. It was an interesting idea
in theory, but this idea turned out to be flawed in a number of ways:
1.) Requiring exports to create sources/outputs/encoders/etc meant that
you could not create them by any other means, which meant that
things like faruton's .net plugin would become difficult.
2.) Export function declarations could not be checked, therefore if you
created a function with the wrong parameters and parameter types,
the compiler wouldn't know how to check for that.
3.) Required overly complex load functions in libobs just to handle it.
It makes much more sense to just have a load function that you call
manually. Complexity is the bane of all good programs.
4.) It required that you have functions of specific names, which looked
and felt somewhat unsightly.
So, to fix these issues, I replaced it with a more commonly used API
scheme, seen commonly in places like kernels and typical C libraries
with abstraction. You simply create a structure that contains the
callback definitions, and you pass it to a function to register that
definition (such as obs_register_source), which you call in the
obs_module_load of the module.
It will also automatically check the structure size and ensure that it
only loads the required values if the structure happened to add new
values in an API change.
The "main" source file for each module must include obs-module.h, and
must use OBS_DECLARE_MODULE() within that source file.
Also, started writing some doxygen documentation in to the main library
headers. Will add more detailed documentation as I go.
2014-02-12 07:04:50 -08:00
|
|
|
/* opaque types */
|
|
|
|
struct obs_display;
|
2014-02-13 09:21:16 -08:00
|
|
|
struct obs_view;
|
Revamp API and start using doxygen
The API used to be designed in such a way to where it would expect
exports for each individual source/output/encoder/etc. You would export
functions for each and it would automatically load those functions based
on a specific naming scheme from the module.
The idea behind this was that I wanted to limit the usage of structures
in the API so only functions could be used. It was an interesting idea
in theory, but this idea turned out to be flawed in a number of ways:
1.) Requiring exports to create sources/outputs/encoders/etc meant that
you could not create them by any other means, which meant that
things like faruton's .net plugin would become difficult.
2.) Export function declarations could not be checked, therefore if you
created a function with the wrong parameters and parameter types,
the compiler wouldn't know how to check for that.
3.) Required overly complex load functions in libobs just to handle it.
It makes much more sense to just have a load function that you call
manually. Complexity is the bane of all good programs.
4.) It required that you have functions of specific names, which looked
and felt somewhat unsightly.
So, to fix these issues, I replaced it with a more commonly used API
scheme, seen commonly in places like kernels and typical C libraries
with abstraction. You simply create a structure that contains the
callback definitions, and you pass it to a function to register that
definition (such as obs_register_source), which you call in the
obs_module_load of the module.
It will also automatically check the structure size and ensure that it
only loads the required values if the structure happened to add new
values in an API change.
The "main" source file for each module must include obs-module.h, and
must use OBS_DECLARE_MODULE() within that source file.
Also, started writing some doxygen documentation in to the main library
headers. Will add more detailed documentation as I go.
2014-02-12 07:04:50 -08:00
|
|
|
struct obs_source;
|
|
|
|
struct obs_scene;
|
|
|
|
struct obs_scene_item;
|
|
|
|
struct obs_output;
|
|
|
|
struct obs_encoder;
|
|
|
|
struct obs_service;
|
(API Change) Refactor module handling
Changed API:
- char *obs_find_plugin_file(const char *sub_path);
Changed to: char *obs_module_file(const char *file);
Cahnge it so you no longer need to specify a sub-path such as:
obs_find_plugin_file("module_name/file.ext")
Instead, now automatically handle the module data path so all you need
to do is:
obs_module_file("file.ext")
- int obs_load_module(const char *name);
Changed to: int obs_open_module(obs_module_t *module,
const char *path,
const char *data_path);
bool obs_init_module(obs_module_t module);
Change the module loading API so that if the front-end chooses, it can
load modules directly from a specified path, and associate a data
directory with it on the spot.
The module will not be initialized immediately; obs_init_module must
be called on the module pointer in order to fully initialize the
module. This is done so a module can be disabled by the front-end if
the it so chooses.
New API:
- void obs_add_module_path(const char *bin, const char *data);
These functions allow you to specify new module search paths to add,
and allow you to search through them, or optionally just load all
modules from them. If the string %module% is included, it will
replace it with the module's name when that string is used as a
lookup. Data paths are now directly added to the module's internal
storage structure, and when obs_find_module_file is used, it will look
up the pointer to the obs_module structure and get its data directory
that way.
Example:
obs_add_module_path("/opt/obs/my-modules/%module%/bin",
"/opt/obs/my-modules/%module%/data");
This would cause it to additionally look for the binary of a
hypthetical module named "foo" at /opt/obs/my-modules/foo/bin/foo.so
(or libfoo.so), and then look for the data in
/opt/obs/my-modules/foo/data.
This gives the front-end more flexibility for handling third-party
plugin modules, or handling all plugin modules in a custom way.
- void obs_find_modules(obs_find_module_callback_t callback, void
*param);
This searches the existing paths for modules and calls the callback
function when any are found. Useful for plugin management and custom
handling of the paths by the front-end if desired.
- void obs_load_all_modules(void);
Search through the paths and both loads and initializes all modules
automatically without custom handling.
- void obs_enum_modules(obs_enum_module_callback_t callback,
void *param);
Enumerates currently opened modules.
2014-07-27 12:00:11 -07:00
|
|
|
struct obs_module;
|
2014-11-18 15:50:32 -08:00
|
|
|
struct obs_fader;
|
2014-11-20 12:08:26 -08:00
|
|
|
struct obs_volmeter;
|
Revamp API and start using doxygen
The API used to be designed in such a way to where it would expect
exports for each individual source/output/encoder/etc. You would export
functions for each and it would automatically load those functions based
on a specific naming scheme from the module.
The idea behind this was that I wanted to limit the usage of structures
in the API so only functions could be used. It was an interesting idea
in theory, but this idea turned out to be flawed in a number of ways:
1.) Requiring exports to create sources/outputs/encoders/etc meant that
you could not create them by any other means, which meant that
things like faruton's .net plugin would become difficult.
2.) Export function declarations could not be checked, therefore if you
created a function with the wrong parameters and parameter types,
the compiler wouldn't know how to check for that.
3.) Required overly complex load functions in libobs just to handle it.
It makes much more sense to just have a load function that you call
manually. Complexity is the bane of all good programs.
4.) It required that you have functions of specific names, which looked
and felt somewhat unsightly.
So, to fix these issues, I replaced it with a more commonly used API
scheme, seen commonly in places like kernels and typical C libraries
with abstraction. You simply create a structure that contains the
callback definitions, and you pass it to a function to register that
definition (such as obs_register_source), which you call in the
obs_module_load of the module.
It will also automatically check the structure size and ensure that it
only loads the required values if the structure happened to add new
values in an API change.
The "main" source file for each module must include obs-module.h, and
must use OBS_DECLARE_MODULE() within that source file.
Also, started writing some doxygen documentation in to the main library
headers. Will add more detailed documentation as I go.
2014-02-12 07:04:50 -08:00
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
typedef struct obs_display obs_display_t;
|
|
|
|
typedef struct obs_view obs_view_t;
|
|
|
|
typedef struct obs_source obs_source_t;
|
|
|
|
typedef struct obs_scene obs_scene_t;
|
|
|
|
typedef struct obs_scene_item obs_sceneitem_t;
|
|
|
|
typedef struct obs_output obs_output_t;
|
|
|
|
typedef struct obs_encoder obs_encoder_t;
|
|
|
|
typedef struct obs_service obs_service_t;
|
|
|
|
typedef struct obs_module obs_module_t;
|
2014-11-18 15:50:32 -08:00
|
|
|
typedef struct obs_fader obs_fader_t;
|
2014-11-20 12:08:26 -08:00
|
|
|
typedef struct obs_volmeter obs_volmeter_t;
|
Revamp API and start using doxygen
The API used to be designed in such a way to where it would expect
exports for each individual source/output/encoder/etc. You would export
functions for each and it would automatically load those functions based
on a specific naming scheme from the module.
The idea behind this was that I wanted to limit the usage of structures
in the API so only functions could be used. It was an interesting idea
in theory, but this idea turned out to be flawed in a number of ways:
1.) Requiring exports to create sources/outputs/encoders/etc meant that
you could not create them by any other means, which meant that
things like faruton's .net plugin would become difficult.
2.) Export function declarations could not be checked, therefore if you
created a function with the wrong parameters and parameter types,
the compiler wouldn't know how to check for that.
3.) Required overly complex load functions in libobs just to handle it.
It makes much more sense to just have a load function that you call
manually. Complexity is the bane of all good programs.
4.) It required that you have functions of specific names, which looked
and felt somewhat unsightly.
So, to fix these issues, I replaced it with a more commonly used API
scheme, seen commonly in places like kernels and typical C libraries
with abstraction. You simply create a structure that contains the
callback definitions, and you pass it to a function to register that
definition (such as obs_register_source), which you call in the
obs_module_load of the module.
It will also automatically check the structure size and ensure that it
only loads the required values if the structure happened to add new
values in an API change.
The "main" source file for each module must include obs-module.h, and
must use OBS_DECLARE_MODULE() within that source file.
Also, started writing some doxygen documentation in to the main library
headers. Will add more detailed documentation as I go.
2014-02-12 07:04:50 -08:00
|
|
|
|
2015-05-03 11:45:41 -07:00
|
|
|
typedef struct obs_weak_source obs_weak_source_t;
|
2015-05-03 16:55:43 -07:00
|
|
|
typedef struct obs_weak_output obs_weak_output_t;
|
2015-05-03 17:01:38 -07:00
|
|
|
typedef struct obs_weak_encoder obs_weak_encoder_t;
|
2015-05-03 17:07:43 -07:00
|
|
|
typedef struct obs_weak_service obs_weak_service_t;
|
2015-05-03 11:45:41 -07:00
|
|
|
|
Revamp API and start using doxygen
The API used to be designed in such a way to where it would expect
exports for each individual source/output/encoder/etc. You would export
functions for each and it would automatically load those functions based
on a specific naming scheme from the module.
The idea behind this was that I wanted to limit the usage of structures
in the API so only functions could be used. It was an interesting idea
in theory, but this idea turned out to be flawed in a number of ways:
1.) Requiring exports to create sources/outputs/encoders/etc meant that
you could not create them by any other means, which meant that
things like faruton's .net plugin would become difficult.
2.) Export function declarations could not be checked, therefore if you
created a function with the wrong parameters and parameter types,
the compiler wouldn't know how to check for that.
3.) Required overly complex load functions in libobs just to handle it.
It makes much more sense to just have a load function that you call
manually. Complexity is the bane of all good programs.
4.) It required that you have functions of specific names, which looked
and felt somewhat unsightly.
So, to fix these issues, I replaced it with a more commonly used API
scheme, seen commonly in places like kernels and typical C libraries
with abstraction. You simply create a structure that contains the
callback definitions, and you pass it to a function to register that
definition (such as obs_register_source), which you call in the
obs_module_load of the module.
It will also automatically check the structure size and ensure that it
only loads the required values if the structure happened to add new
values in an API change.
The "main" source file for each module must include obs-module.h, and
must use OBS_DECLARE_MODULE() within that source file.
Also, started writing some doxygen documentation in to the main library
headers. Will add more detailed documentation as I go.
2014-02-12 07:04:50 -08:00
|
|
|
#include "obs-source.h"
|
|
|
|
#include "obs-encoder.h"
|
|
|
|
#include "obs-output.h"
|
|
|
|
#include "obs-service.h"
|
2014-11-18 15:50:32 -08:00
|
|
|
#include "obs-audio-controls.h"
|
2014-11-01 13:41:17 -07:00
|
|
|
#include "obs-hotkey.h"
|
2014-01-31 23:49:50 -08:00
|
|
|
|
2014-10-12 07:43:30 -07:00
|
|
|
/**
|
2014-02-13 04:27:35 -08:00
|
|
|
* @file
|
2014-10-12 07:43:30 -07:00
|
|
|
* @brief Main libobs header used by applications.
|
|
|
|
*
|
|
|
|
* @mainpage
|
|
|
|
*
|
|
|
|
* @section intro_sec Introduction
|
|
|
|
*
|
|
|
|
* This document describes the api for libobs to be used by applications as well
|
|
|
|
* as @ref modules_page implementing some kind of functionality.
|
2014-02-13 04:27:35 -08:00
|
|
|
*
|
2013-09-30 19:37:13 -07:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
2014-02-13 04:27:35 -08:00
|
|
|
/** Used for changing the order of items (for example, filters in a source,
|
2013-10-24 01:03:45 -07:00
|
|
|
* or items in a scene) */
|
2014-08-02 01:33:53 -07:00
|
|
|
enum obs_order_movement {
|
|
|
|
OBS_ORDER_MOVE_UP,
|
|
|
|
OBS_ORDER_MOVE_DOWN,
|
|
|
|
OBS_ORDER_MOVE_TOP,
|
|
|
|
OBS_ORDER_MOVE_BOTTOM
|
2013-09-30 19:37:13 -07:00
|
|
|
};
|
|
|
|
|
2014-02-13 04:27:35 -08:00
|
|
|
/**
|
|
|
|
* Used with obs_source_process_filter to specify whether the filter should
|
|
|
|
* render the source directly with the specified effect, or whether it should
|
|
|
|
* render it to a texture
|
|
|
|
*/
|
2014-08-02 08:21:00 -07:00
|
|
|
enum obs_allow_direct_render {
|
|
|
|
OBS_NO_DIRECT_RENDERING,
|
|
|
|
OBS_ALLOW_DIRECT_RENDERING,
|
2013-12-22 01:03:40 -08:00
|
|
|
};
|
|
|
|
|
2014-12-14 23:45:44 -08:00
|
|
|
enum obs_scale_type {
|
2016-06-29 06:08:54 -07:00
|
|
|
OBS_SCALE_DISABLE,
|
|
|
|
OBS_SCALE_POINT,
|
2014-12-14 23:45:44 -08:00
|
|
|
OBS_SCALE_BICUBIC,
|
|
|
|
OBS_SCALE_BILINEAR,
|
|
|
|
OBS_SCALE_LANCZOS
|
|
|
|
};
|
|
|
|
|
2014-06-15 00:16:03 -07:00
|
|
|
/**
|
|
|
|
* Used with scene items to indicate the type of bounds to use for scene items.
|
|
|
|
* Mostly determines how the image will be scaled within those bounds, or
|
|
|
|
* whether to use bounds at all.
|
|
|
|
*/
|
|
|
|
enum obs_bounds_type {
|
|
|
|
OBS_BOUNDS_NONE, /**< no bounds */
|
UI: Add scene editing
So, scene editing was interesting (and by interesting I mean
excruciating). I almost implemented 'manipulator' visuals (ala 3dsmax
for example), and used 3 modes for controlling position/rotation/size,
but in a 2D editing, it felt clunky, so I defaulted back to simply
click-and-drag for movement, and then took a similar though slightly
different looking approach for handling scaling and reszing.
I also added a number of menu item helpers related to positioning,
scaling, rotating, flipping, and resetting the transform back to
default.
There is also a new 'transform' dialog (accessible via menu) which will
allow you to manually edit every single transform variable of a scene
item directly if desired.
If a scene item does not have bounds active, pulling on the sides of a
source will cause it to resize it via base scale rather than by the
bounding box system (if the source resizes that scale will apply). If
bounds are active, it will modify the bounding box only instead.
How a source scales when a bounding box is active depends on the type of
bounds being used. You can set it to scale to the inner bounds, the
outer bounds, scale to bounds width only, scale to bounds height only,
and a setting to stretch to bounds (which forces a source to always draw
at the bounding box size rather than be affected by its internal size).
You can also set it to be used as a 'maximum' size, so that the source
doesn't necessarily get scaled unless it extends beyond the bounds.
Like in OBS1, objects will snap to the edges unless the control key is
pressed. However, this will now happen even if the object is rotated or
oriented in any strange way. Snapping will also occur when stretching
or changing the bounding box size.
2014-06-15 00:54:48 -07:00
|
|
|
OBS_BOUNDS_STRETCH, /**< stretch (ignores base scale) */
|
2014-06-15 00:16:03 -07:00
|
|
|
OBS_BOUNDS_SCALE_INNER, /**< scales to inner rectangle */
|
|
|
|
OBS_BOUNDS_SCALE_OUTER, /**< scales to outer rectangle */
|
|
|
|
OBS_BOUNDS_SCALE_TO_WIDTH, /**< scales to the width */
|
|
|
|
OBS_BOUNDS_SCALE_TO_HEIGHT, /**< scales to the height */
|
UI: Add scene editing
So, scene editing was interesting (and by interesting I mean
excruciating). I almost implemented 'manipulator' visuals (ala 3dsmax
for example), and used 3 modes for controlling position/rotation/size,
but in a 2D editing, it felt clunky, so I defaulted back to simply
click-and-drag for movement, and then took a similar though slightly
different looking approach for handling scaling and reszing.
I also added a number of menu item helpers related to positioning,
scaling, rotating, flipping, and resetting the transform back to
default.
There is also a new 'transform' dialog (accessible via menu) which will
allow you to manually edit every single transform variable of a scene
item directly if desired.
If a scene item does not have bounds active, pulling on the sides of a
source will cause it to resize it via base scale rather than by the
bounding box system (if the source resizes that scale will apply). If
bounds are active, it will modify the bounding box only instead.
How a source scales when a bounding box is active depends on the type of
bounds being used. You can set it to scale to the inner bounds, the
outer bounds, scale to bounds width only, scale to bounds height only,
and a setting to stretch to bounds (which forces a source to always draw
at the bounding box size rather than be affected by its internal size).
You can also set it to be used as a 'maximum' size, so that the source
doesn't necessarily get scaled unless it extends beyond the bounds.
Like in OBS1, objects will snap to the edges unless the control key is
pressed. However, this will now happen even if the object is rotated or
oriented in any strange way. Snapping will also occur when stretching
or changing the bounding box size.
2014-06-15 00:54:48 -07:00
|
|
|
OBS_BOUNDS_MAX_ONLY, /**< no scaling, maximum size only */
|
2014-06-15 00:16:03 -07:00
|
|
|
};
|
|
|
|
|
2014-08-01 23:33:45 -07:00
|
|
|
struct obs_transform_info {
|
2014-06-15 00:16:03 -07:00
|
|
|
struct vec2 pos;
|
|
|
|
float rot;
|
|
|
|
struct vec2 scale;
|
|
|
|
uint32_t alignment;
|
|
|
|
|
|
|
|
enum obs_bounds_type bounds_type;
|
|
|
|
uint32_t bounds_alignment;
|
|
|
|
struct vec2 bounds;
|
|
|
|
};
|
|
|
|
|
2014-02-13 04:27:35 -08:00
|
|
|
/**
|
|
|
|
* Video initialization structure
|
|
|
|
*/
|
2013-11-20 14:00:16 -08:00
|
|
|
struct obs_video_info {
|
2014-02-13 04:27:35 -08:00
|
|
|
/**
|
2014-06-15 00:16:03 -07:00
|
|
|
* Graphics module to use (usually "libobs-opengl" or "libobs-d3d11")
|
2014-02-13 04:27:35 -08:00
|
|
|
*/
|
2013-11-20 14:00:16 -08:00
|
|
|
const char *graphics_module;
|
2013-11-26 21:20:11 -08:00
|
|
|
|
2014-02-13 04:27:35 -08:00
|
|
|
uint32_t fps_num; /**< Output FPS numerator */
|
|
|
|
uint32_t fps_den; /**< Output FPS denominator */
|
2013-11-26 21:20:11 -08:00
|
|
|
|
2014-02-13 04:27:35 -08:00
|
|
|
uint32_t base_width; /**< Base compositing width */
|
|
|
|
uint32_t base_height; /**< Base compositing height */
|
2013-11-26 21:20:11 -08:00
|
|
|
|
2014-02-13 04:27:35 -08:00
|
|
|
uint32_t output_width; /**< Output width */
|
|
|
|
uint32_t output_height; /**< Output height */
|
|
|
|
enum video_format output_format; /**< Output format */
|
2013-11-26 21:20:11 -08:00
|
|
|
|
2014-02-13 04:27:35 -08:00
|
|
|
/** Video adapter index to use (NOTE: avoid for optimus laptops) */
|
2013-11-20 14:00:16 -08:00
|
|
|
uint32_t adapter;
|
2013-11-26 21:20:11 -08:00
|
|
|
|
2014-02-16 18:28:21 -08:00
|
|
|
/** Use shaders to convert to different color formats */
|
|
|
|
bool gpu_conversion;
|
2014-12-11 19:51:30 -08:00
|
|
|
|
|
|
|
enum video_colorspace colorspace; /**< YUV type (if YUV) */
|
|
|
|
enum video_range_type range; /**< YUV range (if YUV) */
|
2014-12-14 23:45:44 -08:00
|
|
|
|
|
|
|
enum obs_scale_type scale_type; /**< How to scale if scaling */
|
2013-11-20 14:00:16 -08:00
|
|
|
};
|
|
|
|
|
2015-03-07 04:47:12 -08:00
|
|
|
/**
|
|
|
|
* Audio initialization structure
|
|
|
|
*/
|
|
|
|
struct obs_audio_info {
|
|
|
|
uint32_t samples_per_sec;
|
|
|
|
enum speaker_layout speakers;
|
|
|
|
};
|
|
|
|
|
2014-02-13 04:27:35 -08:00
|
|
|
/**
|
|
|
|
* Sent to source filters via the filter_audio callback to allow filtering of
|
|
|
|
* audio data
|
|
|
|
*/
|
2014-08-02 08:32:53 -07:00
|
|
|
struct obs_audio_data {
|
2014-02-14 14:13:36 -08:00
|
|
|
uint8_t *data[MAX_AV_PLANES];
|
2013-10-31 10:28:47 -07:00
|
|
|
uint32_t frames;
|
|
|
|
uint64_t timestamp;
|
|
|
|
};
|
|
|
|
|
2014-02-13 04:27:35 -08:00
|
|
|
/**
|
|
|
|
* Source audio output structure. Used with obs_source_output_audio to output
|
|
|
|
* source audio. Audio is automatically resampled and remixed as necessary.
|
|
|
|
*/
|
2014-08-02 08:42:04 -07:00
|
|
|
struct obs_source_audio {
|
2014-02-14 14:13:36 -08:00
|
|
|
const uint8_t *data[MAX_AV_PLANES];
|
2013-10-30 17:07:01 -07:00
|
|
|
uint32_t frames;
|
2013-10-24 00:57:55 -07:00
|
|
|
|
2013-10-30 17:07:01 -07:00
|
|
|
enum speaker_layout speakers;
|
2013-10-31 10:28:47 -07:00
|
|
|
enum audio_format format;
|
2013-10-30 17:07:01 -07:00
|
|
|
uint32_t samples_per_sec;
|
2013-10-24 00:57:55 -07:00
|
|
|
|
2013-10-30 17:07:01 -07:00
|
|
|
uint64_t timestamp;
|
2013-10-24 00:57:55 -07:00
|
|
|
};
|
|
|
|
|
2014-02-13 04:27:35 -08:00
|
|
|
/**
|
|
|
|
* Source asynchronous video output structure. Used with
|
|
|
|
* obs_source_output_video to output asynchronous video. Video is buffered as
|
|
|
|
* necessary to play according to timestamps. When used with audio output,
|
|
|
|
* audio is synced to video as it is played.
|
|
|
|
*
|
|
|
|
* If a YUV format is specified, it will be automatically upsampled and
|
|
|
|
* converted to RGB via shader on the graphics processor.
|
|
|
|
*/
|
2014-08-02 01:04:45 -07:00
|
|
|
struct obs_source_frame {
|
2014-02-14 14:13:36 -08:00
|
|
|
uint8_t *data[MAX_AV_PLANES];
|
|
|
|
uint32_t linesize[MAX_AV_PLANES];
|
2013-10-30 17:07:01 -07:00
|
|
|
uint32_t width;
|
|
|
|
uint32_t height;
|
|
|
|
uint64_t timestamp;
|
|
|
|
|
2013-10-31 10:28:47 -07:00
|
|
|
enum video_format format;
|
2014-02-05 19:36:21 -08:00
|
|
|
float color_matrix[16];
|
2014-04-23 15:24:51 -07:00
|
|
|
bool full_range;
|
|
|
|
float color_range_min[3];
|
|
|
|
float color_range_max[3];
|
2013-10-30 17:07:01 -07:00
|
|
|
bool flip;
|
2015-03-07 08:47:49 -08:00
|
|
|
|
|
|
|
/* used internally by libobs */
|
|
|
|
volatile long refs;
|
2016-03-15 20:39:36 -07:00
|
|
|
bool prev_frame;
|
2013-10-24 00:57:55 -07:00
|
|
|
};
|
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/* ------------------------------------------------------------------------- */
|
|
|
|
/* OBS context */
|
|
|
|
|
2014-06-25 00:21:16 -07:00
|
|
|
/**
|
|
|
|
* Initializes OBS
|
|
|
|
*
|
2015-08-09 05:09:07 -07:00
|
|
|
* @param locale The locale to use for modules
|
|
|
|
* @param module_config_path Path to module config storage directory
|
|
|
|
* (or NULL if none)
|
|
|
|
* @param store The profiler name store for OBS to use or NULL
|
2014-06-25 00:21:16 -07:00
|
|
|
*/
|
2015-08-09 05:09:07 -07:00
|
|
|
EXPORT bool obs_startup(const char *locale, const char *module_config_path,
|
|
|
|
profiler_name_store_t *store);
|
2014-02-13 04:27:35 -08:00
|
|
|
|
|
|
|
/** Releases all data associated with OBS and terminates the OBS context */
|
2013-10-14 12:37:52 -07:00
|
|
|
EXPORT void obs_shutdown(void);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
2014-02-13 07:58:31 -08:00
|
|
|
/** @return true if the main OBS context has been initialized */
|
|
|
|
EXPORT bool obs_initialized(void);
|
|
|
|
|
2014-07-27 09:43:32 -07:00
|
|
|
/** @return The current core version */
|
|
|
|
EXPORT uint32_t obs_get_version(void);
|
|
|
|
|
2014-06-25 00:21:16 -07:00
|
|
|
/**
|
|
|
|
* Sets a new locale to use for modules. This will call obs_module_set_locale
|
|
|
|
* for each module with the new locale.
|
|
|
|
*
|
|
|
|
* @param locale The locale to use for modules
|
|
|
|
*/
|
|
|
|
EXPORT void obs_set_locale(const char *locale);
|
|
|
|
|
|
|
|
/** @return the current locale */
|
|
|
|
EXPORT const char *obs_get_locale(void);
|
|
|
|
|
2015-08-02 03:06:00 -07:00
|
|
|
/**
|
|
|
|
* Returns the profiler name store (see util/profiler.h) used by OBS, which is
|
|
|
|
* either a name store passed to obs_startup, an internal name store, or NULL
|
|
|
|
* in case obs_initialized() returns false.
|
|
|
|
*/
|
|
|
|
EXPORT profiler_name_store_t *obs_get_profiler_name_store(void);
|
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/**
|
2014-07-20 17:40:57 -07:00
|
|
|
* Sets base video ouput base resolution/fps/format.
|
2013-09-30 19:37:13 -07:00
|
|
|
*
|
2014-07-20 17:40:57 -07:00
|
|
|
* @note This data cannot be changed if an output is corrently active.
|
|
|
|
* @note The graphics module cannot be changed without fully destroying the
|
|
|
|
* OBS context.
|
|
|
|
*
|
|
|
|
* @param ovi Pointer to an obs_video_info structure containing the
|
|
|
|
* specification of the graphics subsystem,
|
|
|
|
* @return OBS_VIDEO_SUCCESS if sucessful
|
|
|
|
* OBS_VIDEO_NOT_SUPPORTED if the adapter lacks capabilities
|
|
|
|
* OBS_VIDEO_INVALID_PARAM if a parameter is invalid
|
|
|
|
* OBS_VIDEO_CURRENTLY_ACTIVE if video is currently active
|
|
|
|
* OBS_VIDEO_MODULE_NOT_FOUND if the graphics module is not found
|
|
|
|
* OBS_VIDEO_FAIL for generic failure
|
2013-09-30 19:37:13 -07:00
|
|
|
*/
|
2014-07-20 17:40:57 -07:00
|
|
|
EXPORT int obs_reset_video(struct obs_video_info *ovi);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/**
|
|
|
|
* Sets base audio output format/channels/samples/etc
|
|
|
|
*
|
2014-02-13 04:27:35 -08:00
|
|
|
* @note Cannot reset base audio if an output is currently active.
|
2013-09-30 19:37:13 -07:00
|
|
|
*/
|
2015-03-07 04:47:12 -08:00
|
|
|
EXPORT bool obs_reset_audio(const struct obs_audio_info *oai);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
2014-02-13 04:27:35 -08:00
|
|
|
/** Gets the current video settings, returns false if no video */
|
2013-12-06 05:38:19 -08:00
|
|
|
EXPORT bool obs_get_video_info(struct obs_video_info *ovi);
|
|
|
|
|
2014-02-13 04:27:35 -08:00
|
|
|
/** Gets the current audio settings, returns false if no audio */
|
2015-03-07 04:47:12 -08:00
|
|
|
EXPORT bool obs_get_audio_info(struct obs_audio_info *oai);
|
2013-12-06 05:38:19 -08:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/**
|
(API Change) Refactor module handling
Changed API:
- char *obs_find_plugin_file(const char *sub_path);
Changed to: char *obs_module_file(const char *file);
Cahnge it so you no longer need to specify a sub-path such as:
obs_find_plugin_file("module_name/file.ext")
Instead, now automatically handle the module data path so all you need
to do is:
obs_module_file("file.ext")
- int obs_load_module(const char *name);
Changed to: int obs_open_module(obs_module_t *module,
const char *path,
const char *data_path);
bool obs_init_module(obs_module_t module);
Change the module loading API so that if the front-end chooses, it can
load modules directly from a specified path, and associate a data
directory with it on the spot.
The module will not be initialized immediately; obs_init_module must
be called on the module pointer in order to fully initialize the
module. This is done so a module can be disabled by the front-end if
the it so chooses.
New API:
- void obs_add_module_path(const char *bin, const char *data);
These functions allow you to specify new module search paths to add,
and allow you to search through them, or optionally just load all
modules from them. If the string %module% is included, it will
replace it with the module's name when that string is used as a
lookup. Data paths are now directly added to the module's internal
storage structure, and when obs_find_module_file is used, it will look
up the pointer to the obs_module structure and get its data directory
that way.
Example:
obs_add_module_path("/opt/obs/my-modules/%module%/bin",
"/opt/obs/my-modules/%module%/data");
This would cause it to additionally look for the binary of a
hypthetical module named "foo" at /opt/obs/my-modules/foo/bin/foo.so
(or libfoo.so), and then look for the data in
/opt/obs/my-modules/foo/data.
This gives the front-end more flexibility for handling third-party
plugin modules, or handling all plugin modules in a custom way.
- void obs_find_modules(obs_find_module_callback_t callback, void
*param);
This searches the existing paths for modules and calls the callback
function when any are found. Useful for plugin management and custom
handling of the paths by the front-end if desired.
- void obs_load_all_modules(void);
Search through the paths and both loads and initializes all modules
automatically without custom handling.
- void obs_enum_modules(obs_enum_module_callback_t callback,
void *param);
Enumerates currently opened modules.
2014-07-27 12:00:11 -07:00
|
|
|
* Opens a plugin module directly from a specific path.
|
2013-09-30 19:37:13 -07:00
|
|
|
*
|
(API Change) Refactor module handling
Changed API:
- char *obs_find_plugin_file(const char *sub_path);
Changed to: char *obs_module_file(const char *file);
Cahnge it so you no longer need to specify a sub-path such as:
obs_find_plugin_file("module_name/file.ext")
Instead, now automatically handle the module data path so all you need
to do is:
obs_module_file("file.ext")
- int obs_load_module(const char *name);
Changed to: int obs_open_module(obs_module_t *module,
const char *path,
const char *data_path);
bool obs_init_module(obs_module_t module);
Change the module loading API so that if the front-end chooses, it can
load modules directly from a specified path, and associate a data
directory with it on the spot.
The module will not be initialized immediately; obs_init_module must
be called on the module pointer in order to fully initialize the
module. This is done so a module can be disabled by the front-end if
the it so chooses.
New API:
- void obs_add_module_path(const char *bin, const char *data);
These functions allow you to specify new module search paths to add,
and allow you to search through them, or optionally just load all
modules from them. If the string %module% is included, it will
replace it with the module's name when that string is used as a
lookup. Data paths are now directly added to the module's internal
storage structure, and when obs_find_module_file is used, it will look
up the pointer to the obs_module structure and get its data directory
that way.
Example:
obs_add_module_path("/opt/obs/my-modules/%module%/bin",
"/opt/obs/my-modules/%module%/data");
This would cause it to additionally look for the binary of a
hypthetical module named "foo" at /opt/obs/my-modules/foo/bin/foo.so
(or libfoo.so), and then look for the data in
/opt/obs/my-modules/foo/data.
This gives the front-end more flexibility for handling third-party
plugin modules, or handling all plugin modules in a custom way.
- void obs_find_modules(obs_find_module_callback_t callback, void
*param);
This searches the existing paths for modules and calls the callback
function when any are found. Useful for plugin management and custom
handling of the paths by the front-end if desired.
- void obs_load_all_modules(void);
Search through the paths and both loads and initializes all modules
automatically without custom handling.
- void obs_enum_modules(obs_enum_module_callback_t callback,
void *param);
Enumerates currently opened modules.
2014-07-27 12:00:11 -07:00
|
|
|
* If the module already exists then the function will return successful, and
|
|
|
|
* the module parameter will be given the pointer to the existing module.
|
|
|
|
*
|
|
|
|
* This does not initialize the module, it only loads the module image. To
|
|
|
|
* initialize the module, call obs_init_module.
|
|
|
|
*
|
|
|
|
* @param module The pointer to the created module.
|
|
|
|
* @param path Specifies the path to the module library file. If the
|
|
|
|
* extension is not specified, it will use the extension
|
|
|
|
* appropriate to the operating system.
|
|
|
|
* @param data_path Specifies the path to the directory where the module's
|
|
|
|
* data files are stored.
|
|
|
|
* @returns MODULE_SUCCESS if successful
|
|
|
|
* MODULE_ERROR if a generic error occurred
|
|
|
|
* MODULE_FILE_NOT_FOUND if the module was not found
|
|
|
|
* MODULE_MISSING_EXPORTS if required exports are missing
|
|
|
|
* MODULE_INCOMPATIBLE_VER if incompatible version
|
2013-09-30 19:37:13 -07:00
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT int obs_open_module(obs_module_t **module, const char *path,
|
(API Change) Refactor module handling
Changed API:
- char *obs_find_plugin_file(const char *sub_path);
Changed to: char *obs_module_file(const char *file);
Cahnge it so you no longer need to specify a sub-path such as:
obs_find_plugin_file("module_name/file.ext")
Instead, now automatically handle the module data path so all you need
to do is:
obs_module_file("file.ext")
- int obs_load_module(const char *name);
Changed to: int obs_open_module(obs_module_t *module,
const char *path,
const char *data_path);
bool obs_init_module(obs_module_t module);
Change the module loading API so that if the front-end chooses, it can
load modules directly from a specified path, and associate a data
directory with it on the spot.
The module will not be initialized immediately; obs_init_module must
be called on the module pointer in order to fully initialize the
module. This is done so a module can be disabled by the front-end if
the it so chooses.
New API:
- void obs_add_module_path(const char *bin, const char *data);
These functions allow you to specify new module search paths to add,
and allow you to search through them, or optionally just load all
modules from them. If the string %module% is included, it will
replace it with the module's name when that string is used as a
lookup. Data paths are now directly added to the module's internal
storage structure, and when obs_find_module_file is used, it will look
up the pointer to the obs_module structure and get its data directory
that way.
Example:
obs_add_module_path("/opt/obs/my-modules/%module%/bin",
"/opt/obs/my-modules/%module%/data");
This would cause it to additionally look for the binary of a
hypthetical module named "foo" at /opt/obs/my-modules/foo/bin/foo.so
(or libfoo.so), and then look for the data in
/opt/obs/my-modules/foo/data.
This gives the front-end more flexibility for handling third-party
plugin modules, or handling all plugin modules in a custom way.
- void obs_find_modules(obs_find_module_callback_t callback, void
*param);
This searches the existing paths for modules and calls the callback
function when any are found. Useful for plugin management and custom
handling of the paths by the front-end if desired.
- void obs_load_all_modules(void);
Search through the paths and both loads and initializes all modules
automatically without custom handling.
- void obs_enum_modules(obs_enum_module_callback_t callback,
void *param);
Enumerates currently opened modules.
2014-07-27 12:00:11 -07:00
|
|
|
const char *data_path);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initializes the module, which calls its obs_module_load export. If the
|
|
|
|
* module is alrady loaded, then this function does nothing and returns
|
|
|
|
* successful.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT bool obs_init_module(obs_module_t *module);
|
(API Change) Refactor module handling
Changed API:
- char *obs_find_plugin_file(const char *sub_path);
Changed to: char *obs_module_file(const char *file);
Cahnge it so you no longer need to specify a sub-path such as:
obs_find_plugin_file("module_name/file.ext")
Instead, now automatically handle the module data path so all you need
to do is:
obs_module_file("file.ext")
- int obs_load_module(const char *name);
Changed to: int obs_open_module(obs_module_t *module,
const char *path,
const char *data_path);
bool obs_init_module(obs_module_t module);
Change the module loading API so that if the front-end chooses, it can
load modules directly from a specified path, and associate a data
directory with it on the spot.
The module will not be initialized immediately; obs_init_module must
be called on the module pointer in order to fully initialize the
module. This is done so a module can be disabled by the front-end if
the it so chooses.
New API:
- void obs_add_module_path(const char *bin, const char *data);
These functions allow you to specify new module search paths to add,
and allow you to search through them, or optionally just load all
modules from them. If the string %module% is included, it will
replace it with the module's name when that string is used as a
lookup. Data paths are now directly added to the module's internal
storage structure, and when obs_find_module_file is used, it will look
up the pointer to the obs_module structure and get its data directory
that way.
Example:
obs_add_module_path("/opt/obs/my-modules/%module%/bin",
"/opt/obs/my-modules/%module%/data");
This would cause it to additionally look for the binary of a
hypthetical module named "foo" at /opt/obs/my-modules/foo/bin/foo.so
(or libfoo.so), and then look for the data in
/opt/obs/my-modules/foo/data.
This gives the front-end more flexibility for handling third-party
plugin modules, or handling all plugin modules in a custom way.
- void obs_find_modules(obs_find_module_callback_t callback, void
*param);
This searches the existing paths for modules and calls the callback
function when any are found. Useful for plugin management and custom
handling of the paths by the front-end if desired.
- void obs_load_all_modules(void);
Search through the paths and both loads and initializes all modules
automatically without custom handling.
- void obs_enum_modules(obs_enum_module_callback_t callback,
void *param);
Enumerates currently opened modules.
2014-07-27 12:00:11 -07:00
|
|
|
|
2016-08-05 17:25:29 -07:00
|
|
|
/** Logs loaded modules */
|
|
|
|
EXPORT void obs_log_loaded_modules(void);
|
|
|
|
|
2014-07-27 12:47:29 -07:00
|
|
|
/** Returns the module file name */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT const char *obs_get_module_file_name(obs_module_t *module);
|
2014-07-27 12:47:29 -07:00
|
|
|
|
|
|
|
/** Returns the module full name */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT const char *obs_get_module_name(obs_module_t *module);
|
2014-07-27 12:47:29 -07:00
|
|
|
|
|
|
|
/** Returns the module author(s) */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT const char *obs_get_module_author(obs_module_t *module);
|
2014-07-27 12:47:29 -07:00
|
|
|
|
|
|
|
/** Returns the module description */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT const char *obs_get_module_description(obs_module_t *module);
|
2014-07-27 12:47:29 -07:00
|
|
|
|
2014-08-31 07:44:43 -07:00
|
|
|
/** Returns the module binary path */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT const char *obs_get_module_binary_path(obs_module_t *module);
|
2014-08-31 07:44:43 -07:00
|
|
|
|
|
|
|
/** Returns the module data path */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT const char *obs_get_module_data_path(obs_module_t *module);
|
2014-08-31 07:44:43 -07:00
|
|
|
|
(API Change) Refactor module handling
Changed API:
- char *obs_find_plugin_file(const char *sub_path);
Changed to: char *obs_module_file(const char *file);
Cahnge it so you no longer need to specify a sub-path such as:
obs_find_plugin_file("module_name/file.ext")
Instead, now automatically handle the module data path so all you need
to do is:
obs_module_file("file.ext")
- int obs_load_module(const char *name);
Changed to: int obs_open_module(obs_module_t *module,
const char *path,
const char *data_path);
bool obs_init_module(obs_module_t module);
Change the module loading API so that if the front-end chooses, it can
load modules directly from a specified path, and associate a data
directory with it on the spot.
The module will not be initialized immediately; obs_init_module must
be called on the module pointer in order to fully initialize the
module. This is done so a module can be disabled by the front-end if
the it so chooses.
New API:
- void obs_add_module_path(const char *bin, const char *data);
These functions allow you to specify new module search paths to add,
and allow you to search through them, or optionally just load all
modules from them. If the string %module% is included, it will
replace it with the module's name when that string is used as a
lookup. Data paths are now directly added to the module's internal
storage structure, and when obs_find_module_file is used, it will look
up the pointer to the obs_module structure and get its data directory
that way.
Example:
obs_add_module_path("/opt/obs/my-modules/%module%/bin",
"/opt/obs/my-modules/%module%/data");
This would cause it to additionally look for the binary of a
hypthetical module named "foo" at /opt/obs/my-modules/foo/bin/foo.so
(or libfoo.so), and then look for the data in
/opt/obs/my-modules/foo/data.
This gives the front-end more flexibility for handling third-party
plugin modules, or handling all plugin modules in a custom way.
- void obs_find_modules(obs_find_module_callback_t callback, void
*param);
This searches the existing paths for modules and calls the callback
function when any are found. Useful for plugin management and custom
handling of the paths by the front-end if desired.
- void obs_load_all_modules(void);
Search through the paths and both loads and initializes all modules
automatically without custom handling.
- void obs_enum_modules(obs_enum_module_callback_t callback,
void *param);
Enumerates currently opened modules.
2014-07-27 12:00:11 -07:00
|
|
|
/**
|
|
|
|
* Adds a module search path to be used with obs_find_modules. If the search
|
|
|
|
* path strings contain %module%, that text will be replaced with the module
|
|
|
|
* name when used.
|
|
|
|
*
|
|
|
|
* @param bin Specifies the module's binary directory search path.
|
|
|
|
* @param data Specifies the module's data directory search path.
|
|
|
|
*/
|
|
|
|
EXPORT void obs_add_module_path(const char *bin, const char *data);
|
|
|
|
|
|
|
|
/** Automatically loads all modules from module paths (convenience function) */
|
|
|
|
EXPORT void obs_load_all_modules(void);
|
|
|
|
|
|
|
|
struct obs_module_info {
|
|
|
|
const char *bin_path;
|
|
|
|
const char *data_path;
|
|
|
|
};
|
|
|
|
|
|
|
|
typedef void (*obs_find_module_callback_t)(void *param,
|
|
|
|
const struct obs_module_info *info);
|
|
|
|
|
|
|
|
/** Finds all modules within the search paths added by obs_add_module_path. */
|
|
|
|
EXPORT void obs_find_modules(obs_find_module_callback_t callback, void *param);
|
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
typedef void (*obs_enum_module_callback_t)(void *param, obs_module_t *module);
|
(API Change) Refactor module handling
Changed API:
- char *obs_find_plugin_file(const char *sub_path);
Changed to: char *obs_module_file(const char *file);
Cahnge it so you no longer need to specify a sub-path such as:
obs_find_plugin_file("module_name/file.ext")
Instead, now automatically handle the module data path so all you need
to do is:
obs_module_file("file.ext")
- int obs_load_module(const char *name);
Changed to: int obs_open_module(obs_module_t *module,
const char *path,
const char *data_path);
bool obs_init_module(obs_module_t module);
Change the module loading API so that if the front-end chooses, it can
load modules directly from a specified path, and associate a data
directory with it on the spot.
The module will not be initialized immediately; obs_init_module must
be called on the module pointer in order to fully initialize the
module. This is done so a module can be disabled by the front-end if
the it so chooses.
New API:
- void obs_add_module_path(const char *bin, const char *data);
These functions allow you to specify new module search paths to add,
and allow you to search through them, or optionally just load all
modules from them. If the string %module% is included, it will
replace it with the module's name when that string is used as a
lookup. Data paths are now directly added to the module's internal
storage structure, and when obs_find_module_file is used, it will look
up the pointer to the obs_module structure and get its data directory
that way.
Example:
obs_add_module_path("/opt/obs/my-modules/%module%/bin",
"/opt/obs/my-modules/%module%/data");
This would cause it to additionally look for the binary of a
hypthetical module named "foo" at /opt/obs/my-modules/foo/bin/foo.so
(or libfoo.so), and then look for the data in
/opt/obs/my-modules/foo/data.
This gives the front-end more flexibility for handling third-party
plugin modules, or handling all plugin modules in a custom way.
- void obs_find_modules(obs_find_module_callback_t callback, void
*param);
This searches the existing paths for modules and calls the callback
function when any are found. Useful for plugin management and custom
handling of the paths by the front-end if desired.
- void obs_load_all_modules(void);
Search through the paths and both loads and initializes all modules
automatically without custom handling.
- void obs_enum_modules(obs_enum_module_callback_t callback,
void *param);
Enumerates currently opened modules.
2014-07-27 12:00:11 -07:00
|
|
|
|
|
|
|
/** Enumerates all loaded modules */
|
|
|
|
EXPORT void obs_enum_modules(obs_enum_module_callback_t callback, void *param);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
2014-07-09 21:28:40 -07:00
|
|
|
/** Helper function for using default module locale */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT lookup_t *obs_module_load_locale(obs_module_t *module,
|
2014-07-09 21:28:40 -07:00
|
|
|
const char *default_locale, const char *locale);
|
|
|
|
|
(API Change) Refactor module handling
Changed API:
- char *obs_find_plugin_file(const char *sub_path);
Changed to: char *obs_module_file(const char *file);
Cahnge it so you no longer need to specify a sub-path such as:
obs_find_plugin_file("module_name/file.ext")
Instead, now automatically handle the module data path so all you need
to do is:
obs_module_file("file.ext")
- int obs_load_module(const char *name);
Changed to: int obs_open_module(obs_module_t *module,
const char *path,
const char *data_path);
bool obs_init_module(obs_module_t module);
Change the module loading API so that if the front-end chooses, it can
load modules directly from a specified path, and associate a data
directory with it on the spot.
The module will not be initialized immediately; obs_init_module must
be called on the module pointer in order to fully initialize the
module. This is done so a module can be disabled by the front-end if
the it so chooses.
New API:
- void obs_add_module_path(const char *bin, const char *data);
These functions allow you to specify new module search paths to add,
and allow you to search through them, or optionally just load all
modules from them. If the string %module% is included, it will
replace it with the module's name when that string is used as a
lookup. Data paths are now directly added to the module's internal
storage structure, and when obs_find_module_file is used, it will look
up the pointer to the obs_module structure and get its data directory
that way.
Example:
obs_add_module_path("/opt/obs/my-modules/%module%/bin",
"/opt/obs/my-modules/%module%/data");
This would cause it to additionally look for the binary of a
hypthetical module named "foo" at /opt/obs/my-modules/foo/bin/foo.so
(or libfoo.so), and then look for the data in
/opt/obs/my-modules/foo/data.
This gives the front-end more flexibility for handling third-party
plugin modules, or handling all plugin modules in a custom way.
- void obs_find_modules(obs_find_module_callback_t callback, void
*param);
This searches the existing paths for modules and calls the callback
function when any are found. Useful for plugin management and custom
handling of the paths by the front-end if desired.
- void obs_load_all_modules(void);
Search through the paths and both loads and initializes all modules
automatically without custom handling.
- void obs_enum_modules(obs_enum_module_callback_t callback,
void *param);
Enumerates currently opened modules.
2014-07-27 12:00:11 -07:00
|
|
|
/**
|
|
|
|
* Returns the location of a plugin module data file.
|
|
|
|
*
|
|
|
|
* @note Modules should use obs_module_file function defined in obs-module.h
|
|
|
|
* as a more elegant means of getting their files without having to
|
|
|
|
* specify the module parameter.
|
|
|
|
*
|
|
|
|
* @param module The module associated with the file to locate
|
|
|
|
* @param file The file to locate
|
|
|
|
* @return Path string, or NULL if not found. Use bfree to free string.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT char *obs_find_module_file(obs_module_t *module, const char *file);
|
(API Change) Refactor module handling
Changed API:
- char *obs_find_plugin_file(const char *sub_path);
Changed to: char *obs_module_file(const char *file);
Cahnge it so you no longer need to specify a sub-path such as:
obs_find_plugin_file("module_name/file.ext")
Instead, now automatically handle the module data path so all you need
to do is:
obs_module_file("file.ext")
- int obs_load_module(const char *name);
Changed to: int obs_open_module(obs_module_t *module,
const char *path,
const char *data_path);
bool obs_init_module(obs_module_t module);
Change the module loading API so that if the front-end chooses, it can
load modules directly from a specified path, and associate a data
directory with it on the spot.
The module will not be initialized immediately; obs_init_module must
be called on the module pointer in order to fully initialize the
module. This is done so a module can be disabled by the front-end if
the it so chooses.
New API:
- void obs_add_module_path(const char *bin, const char *data);
These functions allow you to specify new module search paths to add,
and allow you to search through them, or optionally just load all
modules from them. If the string %module% is included, it will
replace it with the module's name when that string is used as a
lookup. Data paths are now directly added to the module's internal
storage structure, and when obs_find_module_file is used, it will look
up the pointer to the obs_module structure and get its data directory
that way.
Example:
obs_add_module_path("/opt/obs/my-modules/%module%/bin",
"/opt/obs/my-modules/%module%/data");
This would cause it to additionally look for the binary of a
hypthetical module named "foo" at /opt/obs/my-modules/foo/bin/foo.so
(or libfoo.so), and then look for the data in
/opt/obs/my-modules/foo/data.
This gives the front-end more flexibility for handling third-party
plugin modules, or handling all plugin modules in a custom way.
- void obs_find_modules(obs_find_module_callback_t callback, void
*param);
This searches the existing paths for modules and calls the callback
function when any are found. Useful for plugin management and custom
handling of the paths by the front-end if desired.
- void obs_load_all_modules(void);
Search through the paths and both loads and initializes all modules
automatically without custom handling.
- void obs_enum_modules(obs_enum_module_callback_t callback,
void *param);
Enumerates currently opened modules.
2014-07-27 12:00:11 -07:00
|
|
|
|
2015-08-09 05:35:24 -07:00
|
|
|
/**
|
|
|
|
* Returns the path of a plugin module config file (whether it exists or not)
|
|
|
|
*
|
|
|
|
* @note Modules should use obs_module_config_path function defined in
|
|
|
|
* obs-module.h as a more elegant means of getting their files without
|
|
|
|
* having to specify the module parameter.
|
|
|
|
*
|
|
|
|
* @param module The module associated with the path
|
|
|
|
* @param file The file to get a path to
|
|
|
|
* @return Path string, or NULL if not found. Use bfree to free string.
|
|
|
|
*/
|
|
|
|
EXPORT char *obs_module_get_config_path(obs_module_t *module, const char *file);
|
|
|
|
|
2015-12-29 16:08:36 -08:00
|
|
|
/** Enumerates all source types (inputs, filters, transitions, etc). */
|
|
|
|
EXPORT bool obs_enum_source_types(size_t idx, const char **id);
|
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/**
|
2013-11-22 15:18:31 -08:00
|
|
|
* Enumerates all available inputs source types.
|
2013-09-30 19:37:13 -07:00
|
|
|
*
|
|
|
|
* Inputs are general source inputs (such as capture sources, device sources,
|
|
|
|
* etc).
|
|
|
|
*/
|
2013-12-20 16:23:19 -08:00
|
|
|
EXPORT bool obs_enum_input_types(size_t idx, const char **id);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/**
|
2013-11-22 15:18:31 -08:00
|
|
|
* Enumerates all available filter source types.
|
2013-09-30 19:37:13 -07:00
|
|
|
*
|
|
|
|
* Filters are sources that are used to modify the video/audio output of
|
|
|
|
* other sources.
|
|
|
|
*/
|
2013-12-20 16:23:19 -08:00
|
|
|
EXPORT bool obs_enum_filter_types(size_t idx, const char **id);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/**
|
2013-11-22 15:18:31 -08:00
|
|
|
* Enumerates all available transition source types.
|
2013-09-30 19:37:13 -07:00
|
|
|
*
|
|
|
|
* Transitions are sources used to transition between two or more other
|
|
|
|
* sources.
|
|
|
|
*/
|
2013-12-20 16:23:19 -08:00
|
|
|
EXPORT bool obs_enum_transition_types(size_t idx, const char **id);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
libobs: Add services API, reduce repeated code
Add API for streaming services. The services API simplifies the
creation of custom service features and user interface.
Custom streaming services later on will be able to do things such as:
- Be able to use service-specific APIs via modules, allowing a more
direct means of communicating with the service and requesting or
setting service-specific information
- Get URL/stream key via other means of authentication such as OAuth,
or be able to build custom URLs for services that require that sort
of thing.
- Query information (such as viewer count, chat, follower
notifications, and other information)
- Set channel information (such as current game, current channel title,
activating commercials)
Also, I reduce some repeated code that was used for all libobs objects.
This includes the name of the object, the private data, settings, as
well as the signal and procedure handlers.
I also switched to using linked lists for the global object lists,
rather than using an array of pointers (you could say it was..
pointless.) ..Anyway, the linked list info is also stored in the shared
context data structure.
2014-04-19 20:38:53 -07:00
|
|
|
/** Enumerates all available output types. */
|
2013-12-20 16:23:19 -08:00
|
|
|
EXPORT bool obs_enum_output_types(size_t idx, const char **id);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
libobs: Add services API, reduce repeated code
Add API for streaming services. The services API simplifies the
creation of custom service features and user interface.
Custom streaming services later on will be able to do things such as:
- Be able to use service-specific APIs via modules, allowing a more
direct means of communicating with the service and requesting or
setting service-specific information
- Get URL/stream key via other means of authentication such as OAuth,
or be able to build custom URLs for services that require that sort
of thing.
- Query information (such as viewer count, chat, follower
notifications, and other information)
- Set channel information (such as current game, current channel title,
activating commercials)
Also, I reduce some repeated code that was used for all libobs objects.
This includes the name of the object, the private data, settings, as
well as the signal and procedure handlers.
I also switched to using linked lists for the global object lists,
rather than using an array of pointers (you could say it was..
pointless.) ..Anyway, the linked list info is also stored in the shared
context data structure.
2014-04-19 20:38:53 -07:00
|
|
|
/** Enumerates all available encoder types. */
|
|
|
|
EXPORT bool obs_enum_encoder_types(size_t idx, const char **id);
|
|
|
|
|
|
|
|
/** Enumerates all available service types. */
|
|
|
|
EXPORT bool obs_enum_service_types(size_t idx, const char **id);
|
|
|
|
|
2014-08-04 05:48:58 -07:00
|
|
|
/** Helper function for entering the OBS graphics context */
|
|
|
|
EXPORT void obs_enter_graphics(void);
|
|
|
|
|
|
|
|
/** Helper function for leaving the OBS graphics context */
|
|
|
|
EXPORT void obs_leave_graphics(void);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2014-02-13 07:58:31 -08:00
|
|
|
/** Gets the main audio output handler for this OBS context */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT audio_t *obs_get_audio(void);
|
2014-02-13 07:58:31 -08:00
|
|
|
|
|
|
|
/** Gets the main video output handler for this OBS context */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT video_t *obs_get_video(void);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
2013-11-22 15:18:31 -08:00
|
|
|
/** Sets the primary output source for a channel. */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_set_output_source(uint32_t channel, obs_source_t *source);
|
2013-11-22 15:18:31 -08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the primary output source for a channel and increments the reference
|
|
|
|
* counter for that source. Use obs_source_release to release.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_source_t *obs_get_output_source(uint32_t channel);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
2013-12-20 18:35:12 -08:00
|
|
|
/**
|
2015-10-29 13:26:19 -07:00
|
|
|
* Enumerates all input sources
|
2013-12-20 18:35:12 -08:00
|
|
|
*
|
|
|
|
* Callback function returns true to continue enumeration, or false to end
|
|
|
|
* enumeration.
|
2015-05-03 11:45:41 -07:00
|
|
|
*
|
|
|
|
* Use obs_source_get_ref or obs_source_get_weak_source if you want to retain
|
|
|
|
* a reference after obs_enum_sources finishes
|
2013-12-20 18:35:12 -08:00
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_enum_sources(bool (*enum_proc)(void*, obs_source_t*),
|
Add preliminary output/encoder interface
- First, I redid the output interface for libobs. I feel like it's
going in a pretty good direction in terms of design.
Right now, the design is so that outputs and encoders are separate.
One or more outputs can connect to a specific encoder to receive its
data, or the output can connect directly to raw data from libobs
output itself, if the output doesn't want to use a designated encoder.
Data is received via callbacks set when you connect to the encoder or
raw output. Multiple outputs can receive the data from a single
encoder context if need be (such as for streaming to multiple channels
at once, and/or recording with the same data).
When an encoder is first connected to, it will connect to raw output,
and start encoding. Additional connections will receive that same
data being encoded as well after that. When the last encoder has
disconnected, it will stop encoding. If for some reason the encoder
needs to stop, it will use the callback with NULL to signal that
encoding has stopped. Some of these things may be subject to change
in the future, though it feels pretty good with this design so far.
Will have to see how well it works out in practice versus theory.
- Second, Started adding preliminary RTMP/x264 output plugin code.
To speed things up, I might just make a direct raw->FFmpeg output to
create a quick output plugin that we can start using for testing all
the subsystems.
2014-01-16 21:34:51 -08:00
|
|
|
void *param);
|
|
|
|
|
|
|
|
/** Enumerates outputs */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_enum_outputs(bool (*enum_proc)(void*, obs_output_t*),
|
Add preliminary output/encoder interface
- First, I redid the output interface for libobs. I feel like it's
going in a pretty good direction in terms of design.
Right now, the design is so that outputs and encoders are separate.
One or more outputs can connect to a specific encoder to receive its
data, or the output can connect directly to raw data from libobs
output itself, if the output doesn't want to use a designated encoder.
Data is received via callbacks set when you connect to the encoder or
raw output. Multiple outputs can receive the data from a single
encoder context if need be (such as for streaming to multiple channels
at once, and/or recording with the same data).
When an encoder is first connected to, it will connect to raw output,
and start encoding. Additional connections will receive that same
data being encoded as well after that. When the last encoder has
disconnected, it will stop encoding. If for some reason the encoder
needs to stop, it will use the callback with NULL to signal that
encoding has stopped. Some of these things may be subject to change
in the future, though it feels pretty good with this design so far.
Will have to see how well it works out in practice versus theory.
- Second, Started adding preliminary RTMP/x264 output plugin code.
To speed things up, I might just make a direct raw->FFmpeg output to
create a quick output plugin that we can start using for testing all
the subsystems.
2014-01-16 21:34:51 -08:00
|
|
|
void *param);
|
|
|
|
|
|
|
|
/** Enumerates encoders */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_enum_encoders(bool (*enum_proc)(void*, obs_encoder_t*),
|
2013-12-20 18:35:12 -08:00
|
|
|
void *param);
|
|
|
|
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
/** Enumerates encoders */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_enum_services(bool (*enum_proc)(void*, obs_service_t*),
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
void *param);
|
|
|
|
|
2013-12-20 18:35:12 -08:00
|
|
|
/**
|
|
|
|
* Gets a source by its name.
|
|
|
|
*
|
|
|
|
* Increments the source reference counter, use obs_source_release to
|
|
|
|
* release it when complete.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_source_t *obs_get_source_by_name(const char *name);
|
2013-11-22 15:18:31 -08:00
|
|
|
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
/** Gets an output by its name. */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_output_t *obs_get_output_by_name(const char *name);
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
|
|
|
|
/** Gets an encoder by its name. */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_encoder_t *obs_get_encoder_by_name(const char *name);
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
|
|
|
|
/** Gets an service by its name. */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_service_t *obs_get_service_by_name(const char *name);
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
|
2015-10-16 07:31:52 -07:00
|
|
|
enum obs_base_effect {
|
|
|
|
OBS_EFFECT_DEFAULT, /**< RGB/YUV */
|
|
|
|
OBS_EFFECT_DEFAULT_RECT, /**< RGB/YUV (using texture_rect) */
|
|
|
|
OBS_EFFECT_OPAQUE, /**< RGB/YUV (alpha set to 1.0) */
|
|
|
|
OBS_EFFECT_SOLID, /**< RGB/YUV (solid color only) */
|
|
|
|
OBS_EFFECT_BICUBIC, /**< Bicubic downscale */
|
|
|
|
OBS_EFFECT_LANCZOS, /**< Lanczos downscale */
|
|
|
|
OBS_EFFECT_BILINEAR_LOWRES, /**< Bilinear low resolution downscale */
|
2016-03-26 21:41:49 -07:00
|
|
|
OBS_EFFECT_PREMULTIPLIED_ALPHA,/**< Premultiplied alpha */
|
2015-10-16 07:31:52 -07:00
|
|
|
};
|
2014-12-14 23:45:44 -08:00
|
|
|
|
2015-10-16 07:31:52 -07:00
|
|
|
/** Returns a commonly used base effect */
|
|
|
|
EXPORT gs_effect_t *obs_get_base_effect(enum obs_base_effect effect);
|
2015-04-06 07:09:47 -07:00
|
|
|
|
2015-12-11 16:47:22 -08:00
|
|
|
/* DEPRECATED: gets texture_rect default effect */
|
2016-12-07 07:30:06 -08:00
|
|
|
DEPRECATED
|
|
|
|
EXPORT gs_effect_t *obs_get_default_rect_effect(void);
|
2015-12-11 16:47:22 -08:00
|
|
|
|
2013-12-26 22:10:15 -08:00
|
|
|
/** Returns the primary obs signal handler */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT signal_handler_t *obs_get_signal_handler(void);
|
2013-12-26 22:10:15 -08:00
|
|
|
|
|
|
|
/** Returns the primary obs procedure handler */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT proc_handler_t *obs_get_proc_handler(void);
|
2013-12-26 22:10:15 -08:00
|
|
|
|
2014-02-13 09:21:16 -08:00
|
|
|
/** Renders the main view */
|
|
|
|
EXPORT void obs_render_main_view(void);
|
2014-02-13 07:58:31 -08:00
|
|
|
|
2014-02-20 14:53:16 -08:00
|
|
|
/** Sets the master user volume */
|
|
|
|
EXPORT void obs_set_master_volume(float volume);
|
|
|
|
|
|
|
|
/** Gets the master user volume */
|
|
|
|
EXPORT float obs_get_master_volume(void);
|
|
|
|
|
2014-05-03 22:54:38 -07:00
|
|
|
/** Saves a source to settings data */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_data_t *obs_save_source(obs_source_t *source);
|
2014-05-03 22:54:38 -07:00
|
|
|
|
|
|
|
/** Loads a source from settings data */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_source_t *obs_load_source(obs_data_t *data);
|
2014-02-20 14:53:16 -08:00
|
|
|
|
2016-03-04 12:56:09 -08:00
|
|
|
typedef void (*obs_load_source_cb)(void *private_data, obs_source_t *source);
|
|
|
|
|
2014-04-26 23:47:50 -07:00
|
|
|
/** Loads sources from a data array */
|
2016-03-04 12:56:09 -08:00
|
|
|
EXPORT void obs_load_sources(obs_data_array_t *array, obs_load_source_cb cb,
|
|
|
|
void *private_data);
|
2014-04-26 23:47:50 -07:00
|
|
|
|
|
|
|
/** Saves sources to a data array */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_data_array_t *obs_save_sources(void);
|
2014-04-26 23:47:50 -07:00
|
|
|
|
2015-10-30 03:10:06 -07:00
|
|
|
typedef bool (*obs_save_source_filter_cb)(void *data, obs_source_t *source);
|
|
|
|
EXPORT obs_data_array_t *obs_save_sources_filtered(obs_save_source_filter_cb cb,
|
|
|
|
void *data);
|
|
|
|
|
2016-02-26 18:18:00 -08:00
|
|
|
enum obs_obj_type {
|
|
|
|
OBS_OBJ_TYPE_INVALID,
|
|
|
|
OBS_OBJ_TYPE_SOURCE,
|
|
|
|
OBS_OBJ_TYPE_OUTPUT,
|
|
|
|
OBS_OBJ_TYPE_ENCODER,
|
|
|
|
OBS_OBJ_TYPE_SERVICE
|
|
|
|
};
|
|
|
|
|
|
|
|
EXPORT enum obs_obj_type obs_obj_get_type(void *obj);
|
2016-02-26 18:19:58 -08:00
|
|
|
EXPORT const char *obs_obj_get_id(void *obj);
|
2016-04-03 21:44:04 -07:00
|
|
|
EXPORT bool obs_obj_invalid(void *obj);
|
2016-02-26 18:18:00 -08:00
|
|
|
|
2014-02-13 07:58:31 -08:00
|
|
|
|
|
|
|
/* ------------------------------------------------------------------------- */
|
2014-02-13 09:21:16 -08:00
|
|
|
/* View context */
|
2014-02-13 07:58:31 -08:00
|
|
|
|
|
|
|
/**
|
2014-02-13 09:21:16 -08:00
|
|
|
* Creates a view context.
|
2014-02-13 07:58:31 -08:00
|
|
|
*
|
2014-02-13 09:21:16 -08:00
|
|
|
* A view can be used for things like separate previews, or drawing
|
2014-02-13 07:58:31 -08:00
|
|
|
* sources separately.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_view_t *obs_view_create(void);
|
2014-02-13 07:58:31 -08:00
|
|
|
|
2014-02-13 09:21:16 -08:00
|
|
|
/** Destroys this view context */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_view_destroy(obs_view_t *view);
|
2014-02-13 07:58:31 -08:00
|
|
|
|
2014-02-13 09:21:16 -08:00
|
|
|
/** Sets the source to be used for this view context. */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_view_set_source(obs_view_t *view, uint32_t channel,
|
|
|
|
obs_source_t *source);
|
2014-02-13 07:58:31 -08:00
|
|
|
|
2014-02-13 09:21:16 -08:00
|
|
|
/** Gets the source currently in use for this view context */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_source_t *obs_view_get_source(obs_view_t *view,
|
2014-02-13 07:58:31 -08:00
|
|
|
uint32_t channel);
|
|
|
|
|
2014-02-13 09:21:16 -08:00
|
|
|
/** Renders the sources of this view context */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_view_render(obs_view_t *view);
|
2014-02-13 07:58:31 -08:00
|
|
|
|
2016-01-17 17:39:32 -08:00
|
|
|
EXPORT uint64_t obs_get_video_frame_time(void);
|
|
|
|
|
2016-08-22 12:04:23 -07:00
|
|
|
EXPORT double obs_get_active_fps(void);
|
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
|
|
/* Display context */
|
|
|
|
|
|
|
|
/**
|
2014-02-13 07:58:31 -08:00
|
|
|
* Adds a new window display linked to the main render pipeline. This creates
|
|
|
|
* a new swap chain which updates every frame.
|
2013-09-30 19:37:13 -07:00
|
|
|
*
|
2014-02-13 07:58:31 -08:00
|
|
|
* @param graphics_data The swap chain initialization data.
|
|
|
|
* @return The new display context, or NULL if failed.
|
2013-09-30 19:37:13 -07:00
|
|
|
*/
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_display_t *obs_display_create(
|
|
|
|
const struct gs_init_data *graphics_data);
|
2014-02-13 07:58:31 -08:00
|
|
|
|
|
|
|
/** Destroys a display context */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_display_destroy(obs_display_t *display);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2014-02-13 07:58:31 -08:00
|
|
|
/** Changes the size of this display */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_display_resize(obs_display_t *display, uint32_t cx,
|
|
|
|
uint32_t cy);
|
2014-02-13 07:58:31 -08:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds a draw callback for this display context
|
|
|
|
*
|
|
|
|
* @param display The display context.
|
|
|
|
* @param draw The draw callback which is called each time a frame
|
|
|
|
* updates.
|
|
|
|
* @param param The user data to be associated with this draw callback.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_display_add_draw_callback(obs_display_t *display,
|
2014-02-13 07:58:31 -08:00
|
|
|
void (*draw)(void *param, uint32_t cx, uint32_t cy),
|
|
|
|
void *param);
|
|
|
|
|
|
|
|
/** Removes a draw callback for this display context */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_display_remove_draw_callback(obs_display_t *display,
|
2014-02-13 07:58:31 -08:00
|
|
|
void (*draw)(void *param, uint32_t cx, uint32_t cy),
|
|
|
|
void *param);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
2015-04-01 16:22:28 -07:00
|
|
|
EXPORT void obs_display_set_enabled(obs_display_t *display, bool enable);
|
|
|
|
EXPORT bool obs_display_enabled(obs_display_t *display);
|
|
|
|
|
2015-04-04 00:35:09 -07:00
|
|
|
EXPORT void obs_display_set_background_color(obs_display_t *display,
|
|
|
|
uint32_t color);
|
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
|
|
/* Sources */
|
|
|
|
|
2014-02-01 21:46:13 -08:00
|
|
|
/** Returns the translated display name of a source */
|
2015-12-29 15:25:45 -08:00
|
|
|
EXPORT const char *obs_source_get_display_name(const char *id);
|
2013-11-13 05:24:20 -08:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/**
|
|
|
|
* Creates a source of the specified type with the specified settings.
|
|
|
|
*
|
|
|
|
* The "source" context is used for anything related to presenting
|
2013-12-20 18:35:12 -08:00
|
|
|
* or modifying video/audio. Use obs_source_release to release it.
|
2013-09-30 19:37:13 -07:00
|
|
|
*/
|
2015-12-29 15:25:45 -08:00
|
|
|
EXPORT obs_source_t *obs_source_create(const char *id, const char *name,
|
|
|
|
obs_data_t *settings, obs_data_t *hotkey_data);
|
2013-11-20 17:36:46 -08:00
|
|
|
|
2016-01-09 13:27:16 -08:00
|
|
|
EXPORT obs_source_t *obs_source_create_private(const char *id,
|
|
|
|
const char *name, obs_data_t *settings);
|
2016-01-12 16:30:15 -08:00
|
|
|
|
|
|
|
/* if source has OBS_SOURCE_DO_NOT_DUPLICATE output flag set, only returns a
|
|
|
|
* reference */
|
|
|
|
EXPORT obs_source_t *obs_source_duplicate(obs_source_t *source,
|
|
|
|
const char *desired_name, bool create_private);
|
2013-11-20 17:36:46 -08:00
|
|
|
/**
|
|
|
|
* Adds/releases a reference to a source. When the last reference is
|
|
|
|
* released, the source is destroyed.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_addref(obs_source_t *source);
|
|
|
|
EXPORT void obs_source_release(obs_source_t *source);
|
2013-11-20 17:36:46 -08:00
|
|
|
|
2015-05-03 11:45:41 -07:00
|
|
|
EXPORT void obs_weak_source_addref(obs_weak_source_t *weak);
|
|
|
|
EXPORT void obs_weak_source_release(obs_weak_source_t *weak);
|
|
|
|
|
|
|
|
EXPORT obs_source_t *obs_source_get_ref(obs_source_t *source);
|
|
|
|
EXPORT obs_weak_source_t *obs_source_get_weak_source(obs_source_t *source);
|
|
|
|
EXPORT obs_source_t *obs_weak_source_get_source(obs_weak_source_t *weak);
|
|
|
|
|
|
|
|
EXPORT bool obs_weak_source_references_source(obs_weak_source_t *weak,
|
|
|
|
obs_source_t *source);
|
|
|
|
|
2013-12-15 16:41:35 -08:00
|
|
|
/** Notifies all references that the source should be released */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_remove(obs_source_t *source);
|
2013-11-20 14:00:16 -08:00
|
|
|
|
|
|
|
/** Returns true if the source should be released */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT bool obs_source_removed(const obs_source_t *source);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2015-03-23 09:11:34 -07:00
|
|
|
/** Returns capability flags of a source */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT uint32_t obs_source_get_output_flags(const obs_source_t *source);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2015-03-23 09:05:05 -07:00
|
|
|
/** Returns capability flags of a source type */
|
2015-12-29 15:25:45 -08:00
|
|
|
EXPORT uint32_t obs_get_source_output_flags(const char *id);
|
2015-03-23 09:05:05 -07:00
|
|
|
|
2014-03-07 05:55:21 -08:00
|
|
|
/** Gets the default settings for a source type */
|
2015-12-29 15:25:45 -08:00
|
|
|
EXPORT obs_data_t *obs_get_source_defaults(const char *id);
|
2014-03-07 05:55:21 -08:00
|
|
|
|
2014-02-01 21:46:13 -08:00
|
|
|
/** Returns the property list, if any. Free with obs_properties_destroy */
|
2015-12-29 15:25:45 -08:00
|
|
|
EXPORT obs_properties_t *obs_get_source_properties(const char *id);
|
2014-02-01 21:46:13 -08:00
|
|
|
|
2016-01-10 17:07:01 -08:00
|
|
|
/** Returns whether the source has custom properties or not */
|
|
|
|
EXPORT bool obs_is_source_configurable(const char *id);
|
|
|
|
|
|
|
|
EXPORT bool obs_source_configurable(const obs_source_t *source);
|
|
|
|
|
2014-03-23 01:07:54 -07:00
|
|
|
/**
|
|
|
|
* Returns the properties list for a specific existing source. Free with
|
|
|
|
* obs_properties_destroy
|
|
|
|
*/
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_properties_t *obs_source_properties(const obs_source_t *source);
|
2014-03-23 01:07:54 -07:00
|
|
|
|
2014-01-17 05:24:34 -08:00
|
|
|
/** Updates settings for this source */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_update(obs_source_t *source, obs_data_t *settings);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/** Renders a video source. */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_video_render(obs_source_t *source);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/** Gets the width of a source (if it has video) */
|
2015-02-25 21:02:42 -08:00
|
|
|
EXPORT uint32_t obs_source_get_width(obs_source_t *source);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/** Gets the height of a source (if it has video) */
|
2015-02-25 21:02:42 -08:00
|
|
|
EXPORT uint32_t obs_source_get_height(obs_source_t *source);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2015-03-07 09:37:07 -08:00
|
|
|
/**
|
|
|
|
* If the source is a filter, returns the parent source of the filter. Only
|
|
|
|
* guaranteed to be valid inside of the video_render, filter_audio,
|
|
|
|
* filter_video, and filter_remove callbacks.
|
|
|
|
*/
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_source_t *obs_filter_get_parent(const obs_source_t *filter);
|
2013-12-22 00:30:18 -08:00
|
|
|
|
2015-03-07 09:37:07 -08:00
|
|
|
/**
|
|
|
|
* If the source is a filter, returns the target source of the filter. Only
|
|
|
|
* guaranteed to be valid inside of the video_render, filter_audio,
|
|
|
|
* filter_video, and filter_remove callbacks.
|
|
|
|
*/
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_source_t *obs_filter_get_target(const obs_source_t *filter);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/** Adds a filter to the source (which is used whenever the source is used) */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_filter_add(obs_source_t *source, obs_source_t *filter);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/** Removes a filter from the source */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_filter_remove(obs_source_t *source,
|
|
|
|
obs_source_t *filter);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/** Modifies the order of a specific filter */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_filter_set_order(obs_source_t *source,
|
|
|
|
obs_source_t *filter, enum obs_order_movement movement);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
|
|
|
/** Gets the settings string for a source */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_data_t *obs_source_get_settings(const obs_source_t *source);
|
2013-12-20 18:35:12 -08:00
|
|
|
|
|
|
|
/** Gets the name of a source */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT const char *obs_source_get_name(const obs_source_t *source);
|
2013-12-20 18:35:12 -08:00
|
|
|
|
|
|
|
/** Sets the name of a source */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_set_name(obs_source_t *source, const char *name);
|
2013-12-20 18:35:12 -08:00
|
|
|
|
2014-08-02 12:42:47 -07:00
|
|
|
/** Gets the source type */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT enum obs_source_type obs_source_get_type(const obs_source_t *source);
|
2014-08-02 12:42:47 -07:00
|
|
|
|
|
|
|
/** Gets the source identifier */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT const char *obs_source_get_id(const obs_source_t *source);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
2013-12-26 22:10:15 -08:00
|
|
|
/** Returns the signal handler for a source */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT signal_handler_t *obs_source_get_signal_handler(
|
|
|
|
const obs_source_t *source);
|
2013-12-26 22:10:15 -08:00
|
|
|
|
|
|
|
/** Returns the procedure handler for a source */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT proc_handler_t *obs_source_get_proc_handler(const obs_source_t *source);
|
2013-12-26 22:10:15 -08:00
|
|
|
|
2014-02-20 14:53:16 -08:00
|
|
|
/** Sets the user volume for a source that has audio output */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_set_volume(obs_source_t *source, float volume);
|
2014-01-07 10:03:15 -08:00
|
|
|
|
2014-02-20 14:53:16 -08:00
|
|
|
/** Gets the user volume for a source that has audio output */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT float obs_source_get_volume(const obs_source_t *source);
|
2014-01-07 10:03:15 -08:00
|
|
|
|
2014-02-20 15:16:25 -08:00
|
|
|
/** Sets the audio sync offset (in nanoseconds) for a source */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_set_sync_offset(obs_source_t *source, int64_t offset);
|
2014-02-20 15:16:25 -08:00
|
|
|
|
|
|
|
/** Gets the audio sync offset (in nanoseconds) for a source */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT int64_t obs_source_get_sync_offset(const obs_source_t *source);
|
2014-02-20 15:16:25 -08:00
|
|
|
|
2015-12-22 04:59:02 -08:00
|
|
|
/** Enumerates active child sources used by this source */
|
|
|
|
EXPORT void obs_source_enum_active_sources(obs_source_t *source,
|
2014-02-20 16:44:42 -08:00
|
|
|
obs_source_enum_proc_t enum_callback,
|
|
|
|
void *param);
|
|
|
|
|
2015-12-22 04:59:02 -08:00
|
|
|
/** Enumerates the entire active child source tree used by this source */
|
|
|
|
EXPORT void obs_source_enum_active_tree(obs_source_t *source,
|
2014-02-20 16:44:42 -08:00
|
|
|
obs_source_enum_proc_t enum_callback,
|
|
|
|
void *param);
|
|
|
|
|
2014-02-20 21:04:14 -08:00
|
|
|
/** Returns true if active, false if not */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT bool obs_source_active(const obs_source_t *source);
|
2014-02-20 21:04:14 -08:00
|
|
|
|
2014-12-31 15:26:02 -08:00
|
|
|
/**
|
|
|
|
* Returns true if currently displayed somewhere (active or not), false if not
|
|
|
|
*/
|
|
|
|
EXPORT bool obs_source_showing(const obs_source_t *source);
|
|
|
|
|
2014-10-23 09:56:50 -07:00
|
|
|
/** Specifies that async video frames should be played as soon as possible */
|
2014-12-27 21:29:48 -08:00
|
|
|
#define OBS_SOURCE_FLAG_UNBUFFERED (1<<0)
|
2014-12-28 00:34:35 -08:00
|
|
|
/** Specifies to force audio to mono */
|
|
|
|
#define OBS_SOURCE_FLAG_FORCE_MONO (1<<1)
|
2014-10-23 09:56:50 -07:00
|
|
|
|
2015-01-14 01:07:41 -08:00
|
|
|
/**
|
|
|
|
* Sets source flags. Note that these are different from the main output
|
|
|
|
* flags. These are generally things that can be set by the source or user,
|
|
|
|
* while the output flags are more used to determine capabilities of a source.
|
|
|
|
*/
|
2014-10-23 09:56:50 -07:00
|
|
|
EXPORT void obs_source_set_flags(obs_source_t *source, uint32_t flags);
|
|
|
|
|
|
|
|
/** Gets source flags. */
|
|
|
|
EXPORT uint32_t obs_source_get_flags(const obs_source_t *source);
|
|
|
|
|
(API Change) Add support for multiple audio mixers
API changed:
--------------------------
void obs_output_set_audio_encoder(
obs_output_t *output,
obs_encoder_t *encoder);
obs_encoder_t *obs_output_get_audio_encoder(
const obs_output_t *output);
obs_encoder_t *obs_audio_encoder_create(
const char *id,
const char *name,
obs_data_t *settings);
Changed to:
--------------------------
/* 'idx' specifies the track index of the output */
void obs_output_set_audio_encoder(
obs_output_t *output,
obs_encoder_t *encoder,
size_t idx);
/* 'idx' specifies the track index of the output */
obs_encoder_t *obs_output_get_audio_encoder(
const obs_output_t *output,
size_t idx);
/* 'mixer_idx' specifies the mixer index to capture audio from */
obs_encoder_t *obs_audio_encoder_create(
const char *id,
const char *name,
obs_data_t *settings,
size_t mixer_idx);
Overview
--------------------------
This feature allows multiple audio mixers to be used at a time. This
capability was able to be added with surprisingly very little extra
overhead. Audio will not be mixed unless it's assigned to a specific
mixer, and mixers will not mix unless they have an active mix
connection.
Mostly this will be useful for being able to separate out specific audio
for recording versus streaming, but will also be useful for certain
streaming services that support multiple audio streams via RTMP.
I didn't want to use a variable amount of mixers due to the desire to
reduce heap allocations, so currently I set the limit to 4 simultaneous
mixers; this number can be increased later if needed, but honestly I
feel like it's just the right number to use.
Sources:
Sources can now specify which audio mixers their audio is mixed to; this
can be a single mixer or multiple mixers at a time. The
obs_source_set_audio_mixers function sets the audio mixer which an audio
source applies to. For example, 0xF would mean that the source applies
to all four mixers.
Audio Encoders:
Audio encoders now must specify which specific audio mixer they use when
they encode audio data.
Outputs:
Outputs that use encoders can now support multiple audio tracks at once
if they have the OBS_OUTPUT_MULTI_TRACK capability flag set. This is
mostly only useful for certain types of RTMP transmissions, though may
be useful for file formats that support multiple audio tracks as well
later on.
2015-01-14 02:12:08 -08:00
|
|
|
/**
|
|
|
|
* Sets audio mixer flags. These flags are used to specify which mixers
|
|
|
|
* the source's audio should be applied to.
|
|
|
|
*/
|
|
|
|
EXPORT void obs_source_set_audio_mixers(obs_source_t *source, uint32_t mixers);
|
|
|
|
|
|
|
|
/** Gets audio mixer flags */
|
|
|
|
EXPORT uint32_t obs_source_get_audio_mixers(const obs_source_t *source);
|
|
|
|
|
2015-03-02 00:44:42 -08:00
|
|
|
/**
|
|
|
|
* Increments the 'showing' reference counter to indicate that the source is
|
|
|
|
* being shown somewhere. If the reference counter was 0, will call the 'show'
|
|
|
|
* callback.
|
|
|
|
*/
|
|
|
|
EXPORT void obs_source_inc_showing(obs_source_t *source);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Decrements the 'showing' reference counter to indicate that the source is
|
|
|
|
* no longer being shown somewhere. If the reference counter is set to 0,
|
|
|
|
* will call the 'hide' callback
|
|
|
|
*/
|
|
|
|
EXPORT void obs_source_dec_showing(obs_source_t *source);
|
|
|
|
|
2015-02-25 21:14:11 -08:00
|
|
|
/** Enumerates filters assigned to the source */
|
|
|
|
EXPORT void obs_source_enum_filters(obs_source_t *source,
|
|
|
|
obs_source_enum_proc_t callback, void *param);
|
|
|
|
|
2015-02-25 21:14:57 -08:00
|
|
|
/** Gets a filter of a source by its display name. */
|
|
|
|
EXPORT obs_source_t *obs_source_get_filter_by_name(obs_source_t *source,
|
|
|
|
const char *name);
|
|
|
|
|
2015-03-17 18:15:50 -07:00
|
|
|
EXPORT bool obs_source_enabled(const obs_source_t *source);
|
|
|
|
EXPORT void obs_source_set_enabled(obs_source_t *source, bool enabled);
|
|
|
|
|
2015-03-22 14:54:07 -07:00
|
|
|
EXPORT bool obs_source_muted(const obs_source_t *source);
|
|
|
|
EXPORT void obs_source_set_muted(obs_source_t *source, bool muted);
|
|
|
|
|
2015-04-30 18:22:12 -07:00
|
|
|
EXPORT bool obs_source_push_to_mute_enabled(obs_source_t *source);
|
|
|
|
EXPORT void obs_source_enable_push_to_mute(obs_source_t *source, bool enabled);
|
|
|
|
|
|
|
|
EXPORT uint64_t obs_source_get_push_to_mute_delay(obs_source_t *source);
|
|
|
|
EXPORT void obs_source_set_push_to_mute_delay(obs_source_t *source,
|
|
|
|
uint64_t delay);
|
|
|
|
|
|
|
|
EXPORT bool obs_source_push_to_talk_enabled(obs_source_t *source);
|
|
|
|
EXPORT void obs_source_enable_push_to_talk(obs_source_t *source, bool enabled);
|
|
|
|
|
|
|
|
EXPORT uint64_t obs_source_get_push_to_talk_delay(obs_source_t *source);
|
|
|
|
EXPORT void obs_source_set_push_to_talk_delay(obs_source_t *source,
|
|
|
|
uint64_t delay);
|
|
|
|
|
2016-01-07 19:48:36 -08:00
|
|
|
typedef void (*obs_source_audio_capture_t)(void *param, obs_source_t *source,
|
|
|
|
const struct audio_data *audio_data, bool muted);
|
|
|
|
|
|
|
|
EXPORT void obs_source_add_audio_capture_callback(obs_source_t *source,
|
|
|
|
obs_source_audio_capture_t callback, void *param);
|
|
|
|
EXPORT void obs_source_remove_audio_capture_callback(obs_source_t *source,
|
|
|
|
obs_source_audio_capture_t callback, void *param);
|
|
|
|
|
2016-03-15 20:39:36 -07:00
|
|
|
enum obs_deinterlace_mode {
|
|
|
|
OBS_DEINTERLACE_MODE_DISABLE,
|
|
|
|
OBS_DEINTERLACE_MODE_DISCARD,
|
|
|
|
OBS_DEINTERLACE_MODE_RETRO,
|
|
|
|
OBS_DEINTERLACE_MODE_BLEND,
|
|
|
|
OBS_DEINTERLACE_MODE_BLEND_2X,
|
|
|
|
OBS_DEINTERLACE_MODE_LINEAR,
|
|
|
|
OBS_DEINTERLACE_MODE_LINEAR_2X,
|
|
|
|
OBS_DEINTERLACE_MODE_YADIF,
|
|
|
|
OBS_DEINTERLACE_MODE_YADIF_2X
|
|
|
|
};
|
|
|
|
|
|
|
|
enum obs_deinterlace_field_order {
|
|
|
|
OBS_DEINTERLACE_FIELD_ORDER_TOP,
|
|
|
|
OBS_DEINTERLACE_FIELD_ORDER_BOTTOM
|
|
|
|
};
|
|
|
|
|
|
|
|
EXPORT void obs_source_set_deinterlace_mode(obs_source_t *source,
|
|
|
|
enum obs_deinterlace_mode mode);
|
|
|
|
EXPORT enum obs_deinterlace_mode obs_source_get_deinterlace_mode(
|
|
|
|
const obs_source_t *source);
|
|
|
|
EXPORT void obs_source_set_deinterlace_field_order(obs_source_t *source,
|
|
|
|
enum obs_deinterlace_field_order field_order);
|
|
|
|
EXPORT enum obs_deinterlace_field_order obs_source_get_deinterlace_field_order(
|
|
|
|
const obs_source_t *source);
|
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/* ------------------------------------------------------------------------- */
|
|
|
|
/* Functions used by sources */
|
|
|
|
|
2015-09-15 22:51:37 -07:00
|
|
|
EXPORT void *obs_source_get_type_data(obs_source_t *source);
|
|
|
|
|
Add helper functions for drawing sources
If you look at the previous commits, you'll see I had added
obs_source_draw before. For custom drawn sources in particular, each
time obs_source_draw was called, it would restart the effect and its
passes for each draw call, which was not optimal. It should really use
the effect functions for that. I'll have to add a function to simplify
effect usage.
I also realized that including the color matrix parameters in
obs_source_draw made the function kind of messy to use; instead,
separating the color matrix stuff out to
obs_source_draw_set_color_matrix feels a lot more clean.
On top of that, having the ability to set the position would be nice to
have as well, rather than having to mess with the matrix stuff each
time, so I also added that for the sake of convenience.
obs_source_draw will draw a texture sprite, optionally of a specific
size and/or at a specific position, as well as optionally inverted. The
texture used will be set to the 'image' parameter of whatever effect is
currently active.
obs_source_draw_set_color_matrix will set the color matrix value if the
drawing requires color matrices. It will set the 'color_matrix',
'color_range_min', and 'color_range_max' parameters of whatever effect
is currently active.
Overall, these feel much more clean to use than the previous iteration.
2014-11-19 17:36:12 -08:00
|
|
|
/**
|
|
|
|
* Helper function to set the color matrix information when drawing the source.
|
|
|
|
*
|
|
|
|
* @param color_matrix The color matrix. Assigns to the 'color_matrix'
|
|
|
|
* effect variable.
|
|
|
|
* @param color_range_min The minimum color range. Assigns to the
|
|
|
|
* 'color_range_min' effect variable. If NULL,
|
|
|
|
* {0.0f, 0.0f, 0.0f} is used.
|
|
|
|
* @param color_range_max The maximum color range. Assigns to the
|
|
|
|
* 'color_range_max' effect variable. If NULL,
|
|
|
|
* {1.0f, 1.0f, 1.0f} is used.
|
|
|
|
*/
|
|
|
|
EXPORT void obs_source_draw_set_color_matrix(
|
|
|
|
const struct matrix4 *color_matrix,
|
|
|
|
const struct vec3 *color_range_min,
|
|
|
|
const struct vec3 *color_range_max);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Helper function to draw sprites for a source (synchronous video).
|
|
|
|
*
|
|
|
|
* @param image The sprite texture to draw. Assigns to the 'image' variable
|
|
|
|
* of the current effect.
|
|
|
|
* @param x X position of the sprite.
|
|
|
|
* @param y Y position of the sprite.
|
|
|
|
* @param cx Width of the sprite. If 0, uses the texture width.
|
|
|
|
* @param cy Height of the sprite. If 0, uses the texture height.
|
|
|
|
* @param flip Specifies whether to flip the image vertically.
|
|
|
|
*/
|
|
|
|
EXPORT void obs_source_draw(gs_texture_t *image, int x, int y,
|
|
|
|
uint32_t cx, uint32_t cy, bool flip);
|
|
|
|
|
2015-01-03 20:47:29 -08:00
|
|
|
/** Outputs asynchronous video data. Set to NULL to deactivate the texture */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_output_video(obs_source_t *source,
|
2014-08-02 01:04:45 -07:00
|
|
|
const struct obs_source_frame *frame);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/** Outputs audio data (always asynchronous) */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_output_audio(obs_source_t *source,
|
2014-08-02 08:42:04 -07:00
|
|
|
const struct obs_source_audio *audio);
|
2013-10-24 00:57:55 -07:00
|
|
|
|
2014-09-30 06:40:46 -07:00
|
|
|
/** Signal an update to any currently used properties via 'update_properties' */
|
|
|
|
EXPORT void obs_source_update_properties(obs_source_t *source);
|
|
|
|
|
2013-10-24 00:57:55 -07:00
|
|
|
/** Gets the current async video frame */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT struct obs_source_frame *obs_source_get_frame(obs_source_t *source);
|
2013-10-24 00:57:55 -07:00
|
|
|
|
2013-10-24 01:03:45 -07:00
|
|
|
/** Releases the current async video frame */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_release_frame(obs_source_t *source,
|
2014-08-02 01:04:45 -07:00
|
|
|
struct obs_source_frame *frame);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
2015-03-08 11:48:36 -07:00
|
|
|
/**
|
|
|
|
* Default RGB filter handler for generic effect filters. Processes the
|
|
|
|
* filter chain and renders them to texture if needed, then the filter is
|
|
|
|
* drawn with
|
|
|
|
*
|
|
|
|
* After calling this, set your parameters for the effect, then call
|
|
|
|
* obs_source_process_filter_end to draw the filter.
|
2016-04-22 10:15:50 -07:00
|
|
|
*
|
|
|
|
* Returns true if filtering should continue, false if the filter is bypassed
|
|
|
|
* for whatever reason.
|
2015-03-08 11:48:36 -07:00
|
|
|
*/
|
2016-04-22 10:15:50 -07:00
|
|
|
EXPORT bool obs_source_process_filter_begin(obs_source_t *filter,
|
2015-03-08 11:48:36 -07:00
|
|
|
enum gs_color_format format,
|
2014-08-02 08:21:00 -07:00
|
|
|
enum obs_allow_direct_render allow_direct);
|
2013-12-22 00:30:18 -08:00
|
|
|
|
2015-03-08 11:48:36 -07:00
|
|
|
/**
|
|
|
|
* Draws the filter.
|
|
|
|
*
|
|
|
|
* Before calling this function, first call obs_source_process_filter_begin and
|
|
|
|
* then set the effect parameters, and then call this function to finalize the
|
|
|
|
* filter.
|
|
|
|
*/
|
|
|
|
EXPORT void obs_source_process_filter_end(obs_source_t *filter,
|
|
|
|
gs_effect_t *effect, uint32_t width, uint32_t height);
|
|
|
|
|
2015-05-22 11:01:00 -07:00
|
|
|
/**
|
|
|
|
* Draws the filter with a specific technique.
|
|
|
|
*
|
|
|
|
* Before calling this function, first call obs_source_process_filter_begin and
|
|
|
|
* then set the effect parameters, and then call this function to finalize the
|
|
|
|
* filter.
|
|
|
|
*/
|
|
|
|
EXPORT void obs_source_process_filter_tech_end(obs_source_t *filter,
|
|
|
|
gs_effect_t *effect, uint32_t width, uint32_t height,
|
|
|
|
const char *tech_name);
|
|
|
|
|
2015-02-26 20:15:10 -08:00
|
|
|
/** Skips the filter if the filter is invalid and cannot be rendered */
|
|
|
|
EXPORT void obs_source_skip_video_filter(obs_source_t *filter);
|
|
|
|
|
2014-02-20 21:04:14 -08:00
|
|
|
/**
|
2015-12-22 04:59:02 -08:00
|
|
|
* Adds an active child source. Must be called by parent sources on child
|
|
|
|
* sources when the child is added and active. This ensures that the source is
|
|
|
|
* properly activated if the parent is active.
|
2014-12-27 20:21:22 -08:00
|
|
|
*
|
|
|
|
* @returns true if source can be added, false if it causes recursion
|
2014-02-20 21:04:14 -08:00
|
|
|
*/
|
2015-12-22 04:59:02 -08:00
|
|
|
EXPORT bool obs_source_add_active_child(obs_source_t *parent,
|
|
|
|
obs_source_t *child);
|
2014-02-20 21:04:14 -08:00
|
|
|
|
|
|
|
/**
|
2015-12-22 04:59:02 -08:00
|
|
|
* Removes an active child source. Must be called by parent sources on child
|
|
|
|
* sources when the child is removed or inactive. This ensures that the source
|
|
|
|
* is properly deactivated if the parent is no longer active.
|
2014-02-20 21:04:14 -08:00
|
|
|
*/
|
2015-12-22 04:59:02 -08:00
|
|
|
EXPORT void obs_source_remove_active_child(obs_source_t *parent,
|
|
|
|
obs_source_t *child);
|
2014-02-20 21:04:14 -08:00
|
|
|
|
2014-09-14 13:31:57 -07:00
|
|
|
/** Sends a mouse down/up event to a source */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_send_mouse_click(obs_source_t *source,
|
2014-09-14 13:31:57 -07:00
|
|
|
const struct obs_mouse_event *event,
|
|
|
|
int32_t type, bool mouse_up,
|
|
|
|
uint32_t click_count);
|
|
|
|
|
|
|
|
/** Sends a mouse move event to a source. */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_send_mouse_move(obs_source_t *source,
|
2014-09-14 13:31:57 -07:00
|
|
|
const struct obs_mouse_event *event, bool mouse_leave);
|
|
|
|
|
|
|
|
/** Sends a mouse wheel event to a source */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_send_mouse_wheel(obs_source_t *source,
|
2014-09-14 13:31:57 -07:00
|
|
|
const struct obs_mouse_event *event, int x_delta, int y_delta);
|
|
|
|
|
|
|
|
/** Sends a got-focus or lost-focus event to a source */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_send_focus(obs_source_t *source, bool focus);
|
2014-09-14 13:31:57 -07:00
|
|
|
|
|
|
|
/** Sends a key up/down event to a source */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_source_send_key_click(obs_source_t *source,
|
2014-09-14 13:31:57 -07:00
|
|
|
const struct obs_key_event *event, bool key_up);
|
|
|
|
|
2014-12-31 21:58:45 -08:00
|
|
|
/** Sets the default source flags. */
|
|
|
|
EXPORT void obs_source_set_default_flags(obs_source_t *source, uint32_t flags);
|
|
|
|
|
2015-03-08 06:56:41 -07:00
|
|
|
/** Gets the base width for a source (not taking in to account filtering) */
|
|
|
|
EXPORT uint32_t obs_source_get_base_width(obs_source_t *source);
|
|
|
|
|
|
|
|
/** Gets the base height for a source (not taking in to account filtering) */
|
|
|
|
EXPORT uint32_t obs_source_get_base_height(obs_source_t *source);
|
|
|
|
|
libobs: Implement new audio subsystem
The new audio subsystem fixes two issues:
- First Primary issue it fixes is the ability for parent sources to
intercept the audio of child sources, and do custom processing on
them. The main reason for this was the ability to do custom
cross-fading in transitions, but it's also useful for things such as
side-chain effects, applying audio effects to entire scenes, applying
scene-specific audio filters on sub-sources, and other such
possibilities.
- The secondary issue that needed fixing was audio buffering.
Previously, audio buffering was always a fixed buffer size, so it
would always have exactly a certain number of milliseconds of audio
buffering (and thus output delay). Instead, it now dynamically
increases audio buffering only as necessary, minimizing output delay,
and removing the need for users to have to worry about an audio
buffering setting.
The new design makes it so that audio from the leaves of the scene graph
flow to the root nodes, and can be intercepted by parent sources. Each
audio source handles its own buffering, and each audio tick a specific
number of audio frames are popped from the front of the circular buffer
on each audio source. Composite sources (such as scenes) can access the
audio for child sources and do custom processing or mixing on that
audio. Composite sources use the audio_render callback of sources to do
synchronous or deferred audio processing per audio tick. Things like
scenes now mix audio from their sub-sources.
2015-12-20 03:06:35 -08:00
|
|
|
EXPORT bool obs_source_audio_pending(const obs_source_t *source);
|
2015-12-17 04:28:35 -08:00
|
|
|
EXPORT uint64_t obs_source_get_audio_timestamp(const obs_source_t *source);
|
|
|
|
EXPORT void obs_source_get_audio_mix(const obs_source_t *source,
|
|
|
|
struct obs_source_audio_mix *audio);
|
|
|
|
|
libobs: Implement transition sources
Transition sources are implemented by registering a source type as
OBS_SOURCE_TYPE_TRANSITION. They're automatically marked as video
composite sources, and video_render/audio_render callbacks must be set
when registering the source. get_width and get_height callbacks are
unused for these types of sources, as transitions automatically handle
width/height behind the scenes with the transition settings.
In the video_render callback, the helper function
obs_transition_video_render is used to assist in automatically
processing and rendering the audio. A render callback is passed to the
function, which in turn passes to/from textures that are automatically
rendered in the back-end.
Similarly, in the audio_render callback, the helper function
obs_transition_audio_render is used to assist in automatically
processing and rendering the audio. Two mix callbacks are used to
handle how the source/destination sources are mixed together. To ensure
the best possible quality, audio processing is per-sample.
Transitions can be set to automatically resize, or they can be set to
have a fixed size. Sources within transitions can be made to scale to
the transition size (with or without aspect ratio), or to not scale
unless they're bigger than the transition. They can have a specific
alignment within the transition, or they just default to top-left.
These features are implemented for the purpose of extending transitions
to also act as "switch" sources later, where you can switch to/from two
different sources using the transition animation.
Planned (but not yet implemented and lower priority) features:
- "Switch" transitions which allow the ability to switch back and forth
between two sources with a transitioning animation without discarding
the references
- Easing options to allow the option to transition with a bezier or
custom curve
- Manual transitioning to allow the front-end/user to manually control
the transition offset
2016-01-03 16:41:14 -08:00
|
|
|
/* ------------------------------------------------------------------------- */
|
|
|
|
/* Transition-specific functions */
|
|
|
|
enum obs_transition_target {
|
|
|
|
OBS_TRANSITION_SOURCE_A,
|
|
|
|
OBS_TRANSITION_SOURCE_B
|
|
|
|
};
|
|
|
|
|
|
|
|
EXPORT obs_source_t *obs_transition_get_source(obs_source_t *transition,
|
|
|
|
enum obs_transition_target target);
|
|
|
|
EXPORT void obs_transition_clear(obs_source_t *transition);
|
|
|
|
|
|
|
|
EXPORT obs_source_t *obs_transition_get_active_source(obs_source_t *transition);
|
|
|
|
|
|
|
|
enum obs_transition_mode {
|
|
|
|
OBS_TRANSITION_MODE_AUTO,
|
|
|
|
};
|
|
|
|
|
|
|
|
EXPORT bool obs_transition_start(obs_source_t *transition,
|
|
|
|
enum obs_transition_mode mode, uint32_t duration_ms,
|
|
|
|
obs_source_t *dest);
|
|
|
|
|
|
|
|
EXPORT void obs_transition_set(obs_source_t *transition, obs_source_t *source);
|
|
|
|
|
|
|
|
enum obs_transition_scale_type {
|
|
|
|
OBS_TRANSITION_SCALE_MAX_ONLY,
|
|
|
|
OBS_TRANSITION_SCALE_ASPECT,
|
|
|
|
OBS_TRANSITION_SCALE_STRETCH,
|
|
|
|
};
|
|
|
|
|
|
|
|
EXPORT void obs_transition_set_scale_type(obs_source_t *transition,
|
|
|
|
enum obs_transition_scale_type type);
|
|
|
|
EXPORT enum obs_transition_scale_type obs_transition_get_scale_type(
|
|
|
|
const obs_source_t *transition);
|
|
|
|
|
|
|
|
EXPORT void obs_transition_set_alignment(obs_source_t *transition,
|
|
|
|
uint32_t alignment);
|
|
|
|
EXPORT uint32_t obs_transition_get_alignment(const obs_source_t *transition);
|
|
|
|
|
|
|
|
EXPORT void obs_transition_set_size(obs_source_t *transition,
|
|
|
|
uint32_t cx, uint32_t cy);
|
|
|
|
EXPORT void obs_transition_get_size(const obs_source_t *transition,
|
|
|
|
uint32_t *cx, uint32_t *cy);
|
|
|
|
|
|
|
|
/* function used by transitions */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Enables fixed transitions (videos or specific types of transitions that
|
|
|
|
* are of fixed duration and linearly interpolated
|
|
|
|
*/
|
|
|
|
EXPORT void obs_transition_enable_fixed(obs_source_t *transition, bool enable,
|
|
|
|
uint32_t duration_ms);
|
|
|
|
EXPORT bool obs_transition_fixed(obs_source_t *transition);
|
|
|
|
|
|
|
|
typedef void (*obs_transition_video_render_callback_t)(void *data,
|
|
|
|
gs_texture_t *a, gs_texture_t *b, float t,
|
|
|
|
uint32_t cx, uint32_t cy);
|
|
|
|
typedef float (*obs_transition_audio_mix_callback_t)(void *data, float t);
|
|
|
|
|
|
|
|
EXPORT void obs_transition_video_render(obs_source_t *transition,
|
|
|
|
obs_transition_video_render_callback_t callback);
|
|
|
|
|
|
|
|
EXPORT bool obs_transition_audio_render(obs_source_t *transition,
|
|
|
|
uint64_t *ts_out, struct obs_source_audio_mix *audio,
|
|
|
|
uint32_t mixers, size_t channels, size_t sample_rate,
|
|
|
|
obs_transition_audio_mix_callback_t mix_a_callback,
|
|
|
|
obs_transition_audio_mix_callback_t mix_b_callback);
|
|
|
|
|
|
|
|
/* swaps transition sources and textures as an optimization and to reduce
|
|
|
|
* memory usage when switching between transitions */
|
|
|
|
EXPORT void obs_transition_swap_begin(obs_source_t *tr_dest,
|
|
|
|
obs_source_t *tr_source);
|
|
|
|
EXPORT void obs_transition_swap_end(obs_source_t *tr_dest,
|
|
|
|
obs_source_t *tr_source);
|
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
|
|
/* Scenes */
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Creates a scene.
|
|
|
|
*
|
|
|
|
* A scene is a source which is a container of other sources with specific
|
|
|
|
* display oriantations. Scenes can also be used like any other source.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_scene_t *obs_scene_create(const char *name);
|
2013-12-30 05:56:39 -08:00
|
|
|
|
2016-01-12 16:56:16 -08:00
|
|
|
EXPORT obs_scene_t *obs_scene_create_private(const char *name);
|
|
|
|
|
2016-01-12 17:04:01 -08:00
|
|
|
enum obs_scene_duplicate_type {
|
|
|
|
OBS_SCENE_DUP_REFS, /**< Source refs only */
|
|
|
|
OBS_SCENE_DUP_COPY, /**< Fully duplicate */
|
|
|
|
OBS_SCENE_DUP_PRIVATE_REFS, /**< Source refs only (as private) */
|
|
|
|
OBS_SCENE_DUP_PRIVATE_COPY /**< Fully duplicate (as private) */
|
|
|
|
};
|
|
|
|
|
2015-08-28 15:01:15 -07:00
|
|
|
/**
|
|
|
|
* Duplicates a scene.
|
|
|
|
*/
|
2016-01-12 17:04:01 -08:00
|
|
|
EXPORT obs_scene_t *obs_scene_duplicate(obs_scene_t *scene, const char *name,
|
|
|
|
enum obs_scene_duplicate_type type);
|
2015-08-28 15:01:15 -07:00
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_scene_addref(obs_scene_t *scene);
|
|
|
|
EXPORT void obs_scene_release(obs_scene_t *scene);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/** Gets the scene's source context */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_source_t *obs_scene_get_source(const obs_scene_t *scene);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
2013-12-28 04:33:16 -08:00
|
|
|
/** Gets the scene from its source, or NULL if not a scene */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_scene_t *obs_scene_from_source(const obs_source_t *source);
|
2013-12-28 04:33:16 -08:00
|
|
|
|
2014-01-01 09:22:55 -08:00
|
|
|
/** Determines whether a source is within a scene */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_sceneitem_t *obs_scene_find_source(obs_scene_t *scene,
|
2014-01-01 09:22:55 -08:00
|
|
|
const char *name);
|
|
|
|
|
|
|
|
/** Enumerates sources within a scene */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_scene_enum_items(obs_scene_t *scene,
|
|
|
|
bool (*callback)(obs_scene_t*, obs_sceneitem_t*, void*),
|
2014-01-01 09:22:55 -08:00
|
|
|
void *param);
|
|
|
|
|
2015-06-26 18:47:46 -07:00
|
|
|
EXPORT bool obs_scene_reorder_items(obs_scene_t *scene,
|
|
|
|
obs_sceneitem_t * const *item_order, size_t item_order_size);
|
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/** Adds/creates a new scene item for a source */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_sceneitem_t *obs_scene_add(obs_scene_t *scene, obs_source_t *source);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
2015-06-26 19:18:13 -07:00
|
|
|
typedef void (*obs_scene_atomic_update_func)(void *, obs_scene_t *scene);
|
|
|
|
EXPORT void obs_scene_atomic_update(obs_scene_t *scene,
|
|
|
|
obs_scene_atomic_update_func func, void *data);
|
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_sceneitem_addref(obs_sceneitem_t *item);
|
|
|
|
EXPORT void obs_sceneitem_release(obs_sceneitem_t *item);
|
2013-12-30 05:56:39 -08:00
|
|
|
|
2014-01-30 00:31:52 -08:00
|
|
|
/** Removes a scene item. */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_sceneitem_remove(obs_sceneitem_t *item);
|
2014-01-30 00:31:52 -08:00
|
|
|
|
|
|
|
/** Gets the scene parent associated with the scene item. */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_scene_t *obs_sceneitem_get_scene(const obs_sceneitem_t *item);
|
2014-01-04 12:38:56 -08:00
|
|
|
|
2014-01-30 00:31:52 -08:00
|
|
|
/** Gets the source of a scene item. */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_source_t *obs_sceneitem_get_source(const obs_sceneitem_t *item);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_sceneitem_select(obs_sceneitem_t *item, bool select);
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT bool obs_sceneitem_selected(const obs_sceneitem_t *item);
|
2014-06-15 00:16:03 -07:00
|
|
|
|
|
|
|
/* Functions for gettings/setting specific orientation of a scene item */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_sceneitem_set_pos(obs_sceneitem_t *item, const struct vec2 *pos);
|
|
|
|
EXPORT void obs_sceneitem_set_rot(obs_sceneitem_t *item, float rot_deg);
|
|
|
|
EXPORT void obs_sceneitem_set_scale(obs_sceneitem_t *item,
|
2013-10-14 12:37:52 -07:00
|
|
|
const struct vec2 *scale);
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_sceneitem_set_alignment(obs_sceneitem_t *item,
|
2014-06-15 00:16:03 -07:00
|
|
|
uint32_t alignment);
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_sceneitem_set_order(obs_sceneitem_t *item,
|
2014-08-02 01:33:53 -07:00
|
|
|
enum obs_order_movement movement);
|
2015-02-13 08:29:48 -08:00
|
|
|
EXPORT void obs_sceneitem_set_order_position(obs_sceneitem_t *item,
|
|
|
|
int position);
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_sceneitem_set_bounds_type(obs_sceneitem_t *item,
|
2014-06-15 00:16:03 -07:00
|
|
|
enum obs_bounds_type type);
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_sceneitem_set_bounds_alignment(obs_sceneitem_t *item,
|
2014-06-15 00:16:03 -07:00
|
|
|
uint32_t alignment);
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_sceneitem_set_bounds(obs_sceneitem_t *item,
|
2014-06-15 00:16:03 -07:00
|
|
|
const struct vec2 *bounds);
|
|
|
|
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT void obs_sceneitem_get_pos(const obs_sceneitem_t *item,
|
|
|
|
struct vec2 *pos);
|
|
|
|
EXPORT float obs_sceneitem_get_rot(const obs_sceneitem_t *item);
|
|
|
|
EXPORT void obs_sceneitem_get_scale(const obs_sceneitem_t *item,
|
|
|
|
struct vec2 *scale);
|
|
|
|
EXPORT uint32_t obs_sceneitem_get_alignment(const obs_sceneitem_t *item);
|
2014-06-15 00:16:03 -07:00
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT enum obs_bounds_type obs_sceneitem_get_bounds_type(
|
2014-09-26 15:25:59 -07:00
|
|
|
const obs_sceneitem_t *item);
|
|
|
|
EXPORT uint32_t obs_sceneitem_get_bounds_alignment(const obs_sceneitem_t *item);
|
|
|
|
EXPORT void obs_sceneitem_get_bounds(const obs_sceneitem_t *item,
|
2014-09-25 17:44:05 -07:00
|
|
|
struct vec2 *bounds);
|
2014-06-15 00:16:03 -07:00
|
|
|
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT void obs_sceneitem_get_info(const obs_sceneitem_t *item,
|
2014-08-01 23:33:45 -07:00
|
|
|
struct obs_transform_info *info);
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_sceneitem_set_info(obs_sceneitem_t *item,
|
2014-08-01 23:33:45 -07:00
|
|
|
const struct obs_transform_info *info);
|
2014-06-15 00:16:03 -07:00
|
|
|
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT void obs_sceneitem_get_draw_transform(const obs_sceneitem_t *item,
|
2014-06-15 00:16:03 -07:00
|
|
|
struct matrix4 *transform);
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT void obs_sceneitem_get_box_transform(const obs_sceneitem_t *item,
|
2014-06-15 00:16:03 -07:00
|
|
|
struct matrix4 *transform);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
2015-03-22 20:28:27 -07:00
|
|
|
EXPORT bool obs_sceneitem_visible(const obs_sceneitem_t *item);
|
2015-12-22 05:25:31 -08:00
|
|
|
EXPORT bool obs_sceneitem_set_visible(obs_sceneitem_t *item, bool visible);
|
2015-03-22 20:28:27 -07:00
|
|
|
|
2016-03-30 18:42:25 -07:00
|
|
|
struct obs_sceneitem_crop {
|
|
|
|
int left;
|
|
|
|
int top;
|
|
|
|
int right;
|
|
|
|
int bottom;
|
|
|
|
};
|
|
|
|
|
|
|
|
EXPORT void obs_sceneitem_set_crop(obs_sceneitem_t *item,
|
|
|
|
const struct obs_sceneitem_crop *crop);
|
|
|
|
EXPORT void obs_sceneitem_get_crop(const obs_sceneitem_t *item,
|
|
|
|
struct obs_sceneitem_crop *crop);
|
|
|
|
|
2016-06-29 06:08:54 -07:00
|
|
|
EXPORT void obs_sceneitem_set_scale_filter(obs_sceneitem_t *item,
|
|
|
|
enum obs_scale_type filter);
|
|
|
|
EXPORT enum obs_scale_type obs_sceneitem_get_scale_filter(
|
|
|
|
obs_sceneitem_t *item);
|
|
|
|
|
2016-03-30 18:35:59 -07:00
|
|
|
EXPORT void obs_sceneitem_defer_update_begin(obs_sceneitem_t *item);
|
|
|
|
EXPORT void obs_sceneitem_defer_update_end(obs_sceneitem_t *item);
|
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
|
|
/* Outputs */
|
|
|
|
|
2014-08-04 08:41:15 -07:00
|
|
|
EXPORT const char *obs_output_get_display_name(const char *id);
|
Add preliminary output/encoder interface
- First, I redid the output interface for libobs. I feel like it's
going in a pretty good direction in terms of design.
Right now, the design is so that outputs and encoders are separate.
One or more outputs can connect to a specific encoder to receive its
data, or the output can connect directly to raw data from libobs
output itself, if the output doesn't want to use a designated encoder.
Data is received via callbacks set when you connect to the encoder or
raw output. Multiple outputs can receive the data from a single
encoder context if need be (such as for streaming to multiple channels
at once, and/or recording with the same data).
When an encoder is first connected to, it will connect to raw output,
and start encoding. Additional connections will receive that same
data being encoded as well after that. When the last encoder has
disconnected, it will stop encoding. If for some reason the encoder
needs to stop, it will use the callback with NULL to signal that
encoding has stopped. Some of these things may be subject to change
in the future, though it feels pretty good with this design so far.
Will have to see how well it works out in practice versus theory.
- Second, Started adding preliminary RTMP/x264 output plugin code.
To speed things up, I might just make a direct raw->FFmpeg output to
create a quick output plugin that we can start using for testing all
the subsystems.
2014-01-16 21:34:51 -08:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/**
|
|
|
|
* Creates an output.
|
|
|
|
*
|
|
|
|
* Outputs allow outputting to file, outputting to network, outputting to
|
|
|
|
* directshow, or other custom outputs.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_output_t *obs_output_create(const char *id, const char *name,
|
2014-11-01 13:41:17 -07:00
|
|
|
obs_data_t *settings, obs_data_t *hotkey_data);
|
2015-05-03 16:55:43 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Adds/releases a reference to an output. When the last reference is
|
|
|
|
* released, the output is destroyed.
|
|
|
|
*/
|
|
|
|
EXPORT void obs_output_addref(obs_output_t *output);
|
|
|
|
EXPORT void obs_output_release(obs_output_t *output);
|
|
|
|
|
|
|
|
EXPORT void obs_weak_output_addref(obs_weak_output_t *weak);
|
|
|
|
EXPORT void obs_weak_output_release(obs_weak_output_t *weak);
|
|
|
|
|
|
|
|
EXPORT obs_output_t *obs_output_get_ref(obs_output_t *output);
|
|
|
|
EXPORT obs_weak_output_t *obs_output_get_weak_output(obs_output_t *output);
|
|
|
|
EXPORT obs_output_t *obs_weak_output_get_output(obs_weak_output_t *weak);
|
|
|
|
|
|
|
|
EXPORT bool obs_weak_output_references_output(obs_weak_output_t *weak,
|
|
|
|
obs_output_t *output);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT const char *obs_output_get_name(const obs_output_t *output);
|
2014-07-01 16:29:38 -07:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/** Starts the output. */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT bool obs_output_start(obs_output_t *output);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/** Stops the output. */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_output_stop(obs_output_t *output);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
libobs: Add encoded output delay support
This feature allows a user to delay an output (as long as the output
itself supports it). Needless to say this intended for live streams,
where users may want to delay their streams to prevent stream sniping,
cheating, and other such things.
The design this time was a bit more elaborate, but still simple in
design: the user can now schedule stops/starts without having to wait
for the stream itself to stop before being able to take any action.
Optionally, they can also forcibly stop stream (and delay) in case
something happens which they might not want to be streamed.
Additionally, a new option was added to preserve stream cutoff point on
disconnections/reconnections, so that if you get disconnected while
streaming, when it reconnects, it will reconnect right at the point
where it left off. This will probably be quite useful for a number of
applications in addition to regular delay, such as setting the delay to
1 second and then using this feature to minimize, for example, a
critical stream such as a tournament stream from getting any of its
stream data cut off. However, using this feature will of course cause
the stream data to buffer and increase delay (and memory usage) while
it's in the process of reconnecting.
2015-09-06 15:39:46 -07:00
|
|
|
/**
|
|
|
|
* On reconnection, start where it left of on reconnection. Note however that
|
|
|
|
* this option will consume extra memory to continually increase delay while
|
|
|
|
* waiting to reconnect.
|
|
|
|
*/
|
|
|
|
#define OBS_OUTPUT_DELAY_PRESERVE (1<<0)
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the current output delay, in seconds (if the output supports delay).
|
|
|
|
*
|
|
|
|
* If delay is currently active, it will set the delay value, but will not
|
|
|
|
* affect the current delay, it will only affect the next time the output is
|
|
|
|
* activated.
|
|
|
|
*/
|
|
|
|
EXPORT void obs_output_set_delay(obs_output_t *output, uint32_t delay_sec,
|
|
|
|
uint32_t flags);
|
|
|
|
|
|
|
|
/** Gets the currently set delay value, in seconds. */
|
|
|
|
EXPORT uint32_t obs_output_get_delay(const obs_output_t *output);
|
|
|
|
|
|
|
|
/** If delay is active, gets the currently active delay value, in seconds. */
|
|
|
|
EXPORT uint32_t obs_output_get_active_delay(const obs_output_t *output);
|
|
|
|
|
|
|
|
/** Forces the output to stop. Usually only used with delay. */
|
|
|
|
EXPORT void obs_output_force_stop(obs_output_t *output);
|
|
|
|
|
Add preliminary output/encoder interface
- First, I redid the output interface for libobs. I feel like it's
going in a pretty good direction in terms of design.
Right now, the design is so that outputs and encoders are separate.
One or more outputs can connect to a specific encoder to receive its
data, or the output can connect directly to raw data from libobs
output itself, if the output doesn't want to use a designated encoder.
Data is received via callbacks set when you connect to the encoder or
raw output. Multiple outputs can receive the data from a single
encoder context if need be (such as for streaming to multiple channels
at once, and/or recording with the same data).
When an encoder is first connected to, it will connect to raw output,
and start encoding. Additional connections will receive that same
data being encoded as well after that. When the last encoder has
disconnected, it will stop encoding. If for some reason the encoder
needs to stop, it will use the callback with NULL to signal that
encoding has stopped. Some of these things may be subject to change
in the future, though it feels pretty good with this design so far.
Will have to see how well it works out in practice versus theory.
- Second, Started adding preliminary RTMP/x264 output plugin code.
To speed things up, I might just make a direct raw->FFmpeg output to
create a quick output plugin that we can start using for testing all
the subsystems.
2014-01-16 21:34:51 -08:00
|
|
|
/** Returns whether the output is active */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT bool obs_output_active(const obs_output_t *output);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2014-03-07 05:55:21 -08:00
|
|
|
/** Gets the default settings for an output type */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_data_t *obs_output_defaults(const char *id);
|
2014-03-07 05:55:21 -08:00
|
|
|
|
2014-02-01 21:46:13 -08:00
|
|
|
/** Returns the property list, if any. Free with obs_properties_destroy */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_properties_t *obs_get_output_properties(const char *id);
|
2014-03-23 01:07:54 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the property list of an existing output, if any. Free with
|
|
|
|
* obs_properties_destroy
|
|
|
|
*/
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_properties_t *obs_output_properties(const obs_output_t *output);
|
2014-02-01 21:46:13 -08:00
|
|
|
|
Add preliminary output/encoder interface
- First, I redid the output interface for libobs. I feel like it's
going in a pretty good direction in terms of design.
Right now, the design is so that outputs and encoders are separate.
One or more outputs can connect to a specific encoder to receive its
data, or the output can connect directly to raw data from libobs
output itself, if the output doesn't want to use a designated encoder.
Data is received via callbacks set when you connect to the encoder or
raw output. Multiple outputs can receive the data from a single
encoder context if need be (such as for streaming to multiple channels
at once, and/or recording with the same data).
When an encoder is first connected to, it will connect to raw output,
and start encoding. Additional connections will receive that same
data being encoded as well after that. When the last encoder has
disconnected, it will stop encoding. If for some reason the encoder
needs to stop, it will use the callback with NULL to signal that
encoding has stopped. Some of these things may be subject to change
in the future, though it feels pretty good with this design so far.
Will have to see how well it works out in practice versus theory.
- Second, Started adding preliminary RTMP/x264 output plugin code.
To speed things up, I might just make a direct raw->FFmpeg output to
create a quick output plugin that we can start using for testing all
the subsystems.
2014-01-16 21:34:51 -08:00
|
|
|
/** Updates the settings for this output context */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_output_update(obs_output_t *output, obs_data_t *settings);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/** Specifies whether the output can be paused */
|
2015-10-21 07:32:01 -07:00
|
|
|
EXPORT bool obs_output_can_pause(const obs_output_t *output);
|
2013-10-14 12:37:52 -07:00
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
/** Pauses the output (if the functionality is allowed by the output */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_output_pause(obs_output_t *output);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
|
|
|
/* Gets the current output settings string */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_data_t *obs_output_get_settings(const obs_output_t *output);
|
2013-09-30 19:37:13 -07:00
|
|
|
|
2014-03-10 13:10:35 -07:00
|
|
|
/** Returns the signal handler for an output */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT signal_handler_t *obs_output_get_signal_handler(
|
|
|
|
const obs_output_t *output);
|
2014-03-10 13:10:35 -07:00
|
|
|
|
|
|
|
/** Returns the procedure handler for an output */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT proc_handler_t *obs_output_get_proc_handler(const obs_output_t *output);
|
2014-03-10 13:10:35 -07:00
|
|
|
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
/**
|
|
|
|
* Sets the current video media context associated with this output,
|
|
|
|
* required for non-encoded outputs
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_output_set_video(obs_output_t *output, video_t *video);
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the current audio/video media contexts associated with this output,
|
|
|
|
* required for non-encoded outputs. Can be null.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_output_set_media(obs_output_t *output,
|
|
|
|
video_t *video, audio_t *audio);
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
|
|
|
|
/** Returns the video media context associated with this output */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT video_t *obs_output_video(const obs_output_t *output);
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
|
|
|
|
/** Returns the audio media context associated with this output */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT audio_t *obs_output_audio(const obs_output_t *output);
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
|
(API Change) Add support for multiple audio mixers
API changed:
--------------------------
void obs_output_set_audio_encoder(
obs_output_t *output,
obs_encoder_t *encoder);
obs_encoder_t *obs_output_get_audio_encoder(
const obs_output_t *output);
obs_encoder_t *obs_audio_encoder_create(
const char *id,
const char *name,
obs_data_t *settings);
Changed to:
--------------------------
/* 'idx' specifies the track index of the output */
void obs_output_set_audio_encoder(
obs_output_t *output,
obs_encoder_t *encoder,
size_t idx);
/* 'idx' specifies the track index of the output */
obs_encoder_t *obs_output_get_audio_encoder(
const obs_output_t *output,
size_t idx);
/* 'mixer_idx' specifies the mixer index to capture audio from */
obs_encoder_t *obs_audio_encoder_create(
const char *id,
const char *name,
obs_data_t *settings,
size_t mixer_idx);
Overview
--------------------------
This feature allows multiple audio mixers to be used at a time. This
capability was able to be added with surprisingly very little extra
overhead. Audio will not be mixed unless it's assigned to a specific
mixer, and mixers will not mix unless they have an active mix
connection.
Mostly this will be useful for being able to separate out specific audio
for recording versus streaming, but will also be useful for certain
streaming services that support multiple audio streams via RTMP.
I didn't want to use a variable amount of mixers due to the desire to
reduce heap allocations, so currently I set the limit to 4 simultaneous
mixers; this number can be increased later if needed, but honestly I
feel like it's just the right number to use.
Sources:
Sources can now specify which audio mixers their audio is mixed to; this
can be a single mixer or multiple mixers at a time. The
obs_source_set_audio_mixers function sets the audio mixer which an audio
source applies to. For example, 0xF would mean that the source applies
to all four mixers.
Audio Encoders:
Audio encoders now must specify which specific audio mixer they use when
they encode audio data.
Outputs:
Outputs that use encoders can now support multiple audio tracks at once
if they have the OBS_OUTPUT_MULTI_TRACK capability flag set. This is
mostly only useful for certain types of RTMP transmissions, though may
be useful for file formats that support multiple audio tracks as well
later on.
2015-01-14 02:12:08 -08:00
|
|
|
/** Sets the current audio mixer for non-encoded outputs */
|
|
|
|
EXPORT void obs_output_set_mixer(obs_output_t *output, size_t mixer_idx);
|
|
|
|
|
|
|
|
/** Gets the current audio mixer for non-encoded outputs */
|
|
|
|
EXPORT size_t obs_output_get_mixer(const obs_output_t *output);
|
|
|
|
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
/**
|
|
|
|
* Sets the current video encoder associated with this output,
|
|
|
|
* required for encoded outputs
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_output_set_video_encoder(obs_output_t *output,
|
|
|
|
obs_encoder_t *encoder);
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets the current audio encoder associated with this output,
|
(API Change) Add support for multiple audio mixers
API changed:
--------------------------
void obs_output_set_audio_encoder(
obs_output_t *output,
obs_encoder_t *encoder);
obs_encoder_t *obs_output_get_audio_encoder(
const obs_output_t *output);
obs_encoder_t *obs_audio_encoder_create(
const char *id,
const char *name,
obs_data_t *settings);
Changed to:
--------------------------
/* 'idx' specifies the track index of the output */
void obs_output_set_audio_encoder(
obs_output_t *output,
obs_encoder_t *encoder,
size_t idx);
/* 'idx' specifies the track index of the output */
obs_encoder_t *obs_output_get_audio_encoder(
const obs_output_t *output,
size_t idx);
/* 'mixer_idx' specifies the mixer index to capture audio from */
obs_encoder_t *obs_audio_encoder_create(
const char *id,
const char *name,
obs_data_t *settings,
size_t mixer_idx);
Overview
--------------------------
This feature allows multiple audio mixers to be used at a time. This
capability was able to be added with surprisingly very little extra
overhead. Audio will not be mixed unless it's assigned to a specific
mixer, and mixers will not mix unless they have an active mix
connection.
Mostly this will be useful for being able to separate out specific audio
for recording versus streaming, but will also be useful for certain
streaming services that support multiple audio streams via RTMP.
I didn't want to use a variable amount of mixers due to the desire to
reduce heap allocations, so currently I set the limit to 4 simultaneous
mixers; this number can be increased later if needed, but honestly I
feel like it's just the right number to use.
Sources:
Sources can now specify which audio mixers their audio is mixed to; this
can be a single mixer or multiple mixers at a time. The
obs_source_set_audio_mixers function sets the audio mixer which an audio
source applies to. For example, 0xF would mean that the source applies
to all four mixers.
Audio Encoders:
Audio encoders now must specify which specific audio mixer they use when
they encode audio data.
Outputs:
Outputs that use encoders can now support multiple audio tracks at once
if they have the OBS_OUTPUT_MULTI_TRACK capability flag set. This is
mostly only useful for certain types of RTMP transmissions, though may
be useful for file formats that support multiple audio tracks as well
later on.
2015-01-14 02:12:08 -08:00
|
|
|
* required for encoded outputs.
|
|
|
|
*
|
|
|
|
* The idx parameter specifies the audio encoder index to set the encoder to.
|
|
|
|
* Only used with outputs that have multiple audio outputs (RTMP typically),
|
|
|
|
* otherwise the parameter is ignored.
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_output_set_audio_encoder(obs_output_t *output,
|
(API Change) Add support for multiple audio mixers
API changed:
--------------------------
void obs_output_set_audio_encoder(
obs_output_t *output,
obs_encoder_t *encoder);
obs_encoder_t *obs_output_get_audio_encoder(
const obs_output_t *output);
obs_encoder_t *obs_audio_encoder_create(
const char *id,
const char *name,
obs_data_t *settings);
Changed to:
--------------------------
/* 'idx' specifies the track index of the output */
void obs_output_set_audio_encoder(
obs_output_t *output,
obs_encoder_t *encoder,
size_t idx);
/* 'idx' specifies the track index of the output */
obs_encoder_t *obs_output_get_audio_encoder(
const obs_output_t *output,
size_t idx);
/* 'mixer_idx' specifies the mixer index to capture audio from */
obs_encoder_t *obs_audio_encoder_create(
const char *id,
const char *name,
obs_data_t *settings,
size_t mixer_idx);
Overview
--------------------------
This feature allows multiple audio mixers to be used at a time. This
capability was able to be added with surprisingly very little extra
overhead. Audio will not be mixed unless it's assigned to a specific
mixer, and mixers will not mix unless they have an active mix
connection.
Mostly this will be useful for being able to separate out specific audio
for recording versus streaming, but will also be useful for certain
streaming services that support multiple audio streams via RTMP.
I didn't want to use a variable amount of mixers due to the desire to
reduce heap allocations, so currently I set the limit to 4 simultaneous
mixers; this number can be increased later if needed, but honestly I
feel like it's just the right number to use.
Sources:
Sources can now specify which audio mixers their audio is mixed to; this
can be a single mixer or multiple mixers at a time. The
obs_source_set_audio_mixers function sets the audio mixer which an audio
source applies to. For example, 0xF would mean that the source applies
to all four mixers.
Audio Encoders:
Audio encoders now must specify which specific audio mixer they use when
they encode audio data.
Outputs:
Outputs that use encoders can now support multiple audio tracks at once
if they have the OBS_OUTPUT_MULTI_TRACK capability flag set. This is
mostly only useful for certain types of RTMP transmissions, though may
be useful for file formats that support multiple audio tracks as well
later on.
2015-01-14 02:12:08 -08:00
|
|
|
obs_encoder_t *encoder, size_t idx);
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
|
|
|
|
/** Returns the current video encoder associated with this output */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_encoder_t *obs_output_get_video_encoder(const obs_output_t *output);
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
|
(API Change) Add support for multiple audio mixers
API changed:
--------------------------
void obs_output_set_audio_encoder(
obs_output_t *output,
obs_encoder_t *encoder);
obs_encoder_t *obs_output_get_audio_encoder(
const obs_output_t *output);
obs_encoder_t *obs_audio_encoder_create(
const char *id,
const char *name,
obs_data_t *settings);
Changed to:
--------------------------
/* 'idx' specifies the track index of the output */
void obs_output_set_audio_encoder(
obs_output_t *output,
obs_encoder_t *encoder,
size_t idx);
/* 'idx' specifies the track index of the output */
obs_encoder_t *obs_output_get_audio_encoder(
const obs_output_t *output,
size_t idx);
/* 'mixer_idx' specifies the mixer index to capture audio from */
obs_encoder_t *obs_audio_encoder_create(
const char *id,
const char *name,
obs_data_t *settings,
size_t mixer_idx);
Overview
--------------------------
This feature allows multiple audio mixers to be used at a time. This
capability was able to be added with surprisingly very little extra
overhead. Audio will not be mixed unless it's assigned to a specific
mixer, and mixers will not mix unless they have an active mix
connection.
Mostly this will be useful for being able to separate out specific audio
for recording versus streaming, but will also be useful for certain
streaming services that support multiple audio streams via RTMP.
I didn't want to use a variable amount of mixers due to the desire to
reduce heap allocations, so currently I set the limit to 4 simultaneous
mixers; this number can be increased later if needed, but honestly I
feel like it's just the right number to use.
Sources:
Sources can now specify which audio mixers their audio is mixed to; this
can be a single mixer or multiple mixers at a time. The
obs_source_set_audio_mixers function sets the audio mixer which an audio
source applies to. For example, 0xF would mean that the source applies
to all four mixers.
Audio Encoders:
Audio encoders now must specify which specific audio mixer they use when
they encode audio data.
Outputs:
Outputs that use encoders can now support multiple audio tracks at once
if they have the OBS_OUTPUT_MULTI_TRACK capability flag set. This is
mostly only useful for certain types of RTMP transmissions, though may
be useful for file formats that support multiple audio tracks as well
later on.
2015-01-14 02:12:08 -08:00
|
|
|
/**
|
|
|
|
* Returns the current audio encoder associated with this output
|
|
|
|
*
|
|
|
|
* The idx parameter specifies the audio encoder index. Only used with
|
|
|
|
* outputs that have multiple audio outputs, otherwise the parameter is
|
|
|
|
* ignored.
|
|
|
|
*/
|
|
|
|
EXPORT obs_encoder_t *obs_output_get_audio_encoder(const obs_output_t *output,
|
|
|
|
size_t idx);
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
/** Sets the current service associated with this output. */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_output_set_service(obs_output_t *output,
|
|
|
|
obs_service_t *service);
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
|
|
|
|
/** Gets the current service associated with this output. */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_service_t *obs_output_get_service(const obs_output_t *output);
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
|
2014-07-02 16:38:29 -07:00
|
|
|
/**
|
|
|
|
* Sets the reconnect settings. Set retry_count to 0 to disable reconnecting.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_output_set_reconnect_settings(obs_output_t *output,
|
2014-07-02 16:38:29 -07:00
|
|
|
int retry_count, int retry_sec);
|
|
|
|
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT uint64_t obs_output_get_total_bytes(const obs_output_t *output);
|
|
|
|
EXPORT int obs_output_get_frames_dropped(const obs_output_t *output);
|
|
|
|
EXPORT int obs_output_get_total_frames(const obs_output_t *output);
|
2014-07-06 14:55:56 -07:00
|
|
|
|
2014-08-10 16:50:44 -07:00
|
|
|
/**
|
|
|
|
* Sets the preferred scaled resolution for this output. Set width and height
|
|
|
|
* to 0 to disable scaling.
|
|
|
|
*
|
|
|
|
* If this output uses an encoder, it will call obs_encoder_set_scaled_size on
|
|
|
|
* the encoder before the stream is started. If the encoder is already active,
|
|
|
|
* then this function will trigger a warning and do nothing.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_output_set_preferred_size(obs_output_t *output, uint32_t width,
|
2014-08-10 16:50:44 -07:00
|
|
|
uint32_t height);
|
|
|
|
|
|
|
|
/** For video outputs, returns the width of the encoded image */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT uint32_t obs_output_get_width(const obs_output_t *output);
|
2014-08-10 16:50:44 -07:00
|
|
|
|
|
|
|
/** For video outputs, returns the height of the encoded image */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT uint32_t obs_output_get_height(const obs_output_t *output);
|
2014-08-10 16:50:44 -07:00
|
|
|
|
2015-10-19 15:01:25 -07:00
|
|
|
EXPORT const char *obs_output_get_id(const obs_output_t *output);
|
|
|
|
|
2016-11-17 05:25:23 -08:00
|
|
|
#if BUILD_CAPTIONS
|
|
|
|
EXPORT void obs_output_output_caption_text1(obs_output_t *output,
|
|
|
|
const char *text);
|
|
|
|
#endif
|
|
|
|
|
2017-01-24 15:30:01 -08:00
|
|
|
EXPORT float obs_output_get_congestion(obs_output_t *output);
|
|
|
|
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
/* ------------------------------------------------------------------------- */
|
|
|
|
/* Functions used by outputs */
|
|
|
|
|
2015-09-15 22:51:37 -07:00
|
|
|
EXPORT void *obs_output_get_type_data(obs_output_t *output);
|
|
|
|
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
/** Optionally sets the video conversion info. Used only for raw output */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_output_set_video_conversion(obs_output_t *output,
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
const struct video_scale_info *conversion);
|
|
|
|
|
|
|
|
/** Optionally sets the audio conversion info. Used only for raw output */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_output_set_audio_conversion(obs_output_t *output,
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
const struct audio_convert_info *conversion);
|
|
|
|
|
2014-04-01 11:55:18 -07:00
|
|
|
/** Returns whether data capture can begin with the specified flags */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT bool obs_output_can_begin_data_capture(const obs_output_t *output,
|
2014-04-01 11:55:18 -07:00
|
|
|
uint32_t flags);
|
|
|
|
|
Implement RTMP module (still needs drop code)
- Implement the RTMP output module. This time around, we just use a
simple FLV muxer, then just write to the stream with RTMP_Write.
Easy and effective.
- Fix the FLV muxer, the muxer now outputs proper FLV packets.
- Output API:
* When using encoders, automatically interleave encoded packets
before sending it to the output.
* Pair encoders and have them automatically wait for the other to
start to ensure sync.
* Change 'obs_output_signal_start_fail' to 'obs_output_signal_stop'
because it was a bit confusing, and doing this makes a lot more
sense for outputs that need to stop suddenly (disconnections/etc).
- Encoder API:
* Remove some unnecessary encoder functions from the actual API and
make them internal. Most of the encoder functions are handled
automatically by outputs anyway, so there's no real need to expose
them and end up inadvertently confusing plugin writers.
* Have audio encoders wait for the video encoder to get a frame, then
start at the exact data point that the first video frame starts to
ensure the most accrate sync of video/audio possible.
* Add a required 'frame_size' callback for audio encoders that
returns the expected number of frames desired to encode with. This
way, the libobs encoder API can handle the circular buffering
internally automatically for the encoder modules, so encoder
writers don't have to do it themselves.
- Fix a few bugs in the serializer interface. It was passing the wrong
variable for the data in a few cases.
- If a source has video, make obs_source_update defer the actual update
callback until the tick function is called to prevent threading
issues.
2014-04-07 22:00:10 -07:00
|
|
|
/** Initializes encoders (if any) */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT bool obs_output_initialize_encoders(obs_output_t *output,
|
|
|
|
uint32_t flags);
|
Implement RTMP module (still needs drop code)
- Implement the RTMP output module. This time around, we just use a
simple FLV muxer, then just write to the stream with RTMP_Write.
Easy and effective.
- Fix the FLV muxer, the muxer now outputs proper FLV packets.
- Output API:
* When using encoders, automatically interleave encoded packets
before sending it to the output.
* Pair encoders and have them automatically wait for the other to
start to ensure sync.
* Change 'obs_output_signal_start_fail' to 'obs_output_signal_stop'
because it was a bit confusing, and doing this makes a lot more
sense for outputs that need to stop suddenly (disconnections/etc).
- Encoder API:
* Remove some unnecessary encoder functions from the actual API and
make them internal. Most of the encoder functions are handled
automatically by outputs anyway, so there's no real need to expose
them and end up inadvertently confusing plugin writers.
* Have audio encoders wait for the video encoder to get a frame, then
start at the exact data point that the first video frame starts to
ensure the most accrate sync of video/audio possible.
* Add a required 'frame_size' callback for audio encoders that
returns the expected number of frames desired to encode with. This
way, the libobs encoder API can handle the circular buffering
internally automatically for the encoder modules, so encoder
writers don't have to do it themselves.
- Fix a few bugs in the serializer interface. It was passing the wrong
variable for the data in a few cases.
- If a source has video, make obs_source_update defer the actual update
callback until the tick function is called to prevent threading
issues.
2014-04-07 22:00:10 -07:00
|
|
|
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
/**
|
|
|
|
* Begins data capture from media/encoders.
|
|
|
|
*
|
|
|
|
* @param output Output context
|
|
|
|
* @param flags Set this to 0 to use default output flags set in the
|
|
|
|
* obs_output_info structure, otherwise set to a either
|
|
|
|
* OBS_OUTPUT_VIDEO or OBS_OUTPUT_AUDIO to specify whether to
|
|
|
|
* connect audio or video. This is useful for things like
|
|
|
|
* ffmpeg which may or may not always want to use both audio
|
|
|
|
* and video.
|
|
|
|
* @return true if successful, false otherwise.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT bool obs_output_begin_data_capture(obs_output_t *output, uint32_t flags);
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
|
|
|
|
/** Ends data capture from media/encoders */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_output_end_data_capture(obs_output_t *output);
|
Implement encoder usage with outputs
- Make it so that encoders can be assigned to outputs. If an encoder
is destroyed, it will automatically remove itself from that output.
I specifically didn't want to do reference counting because it leaves
too much potential for unchecked references and it just felt like it
would be more trouble than it's worth.
- Add a 'flags' value to the output definition structure. This lets
the output specify if it uses video/audio, and whether the output is
meant to be used with OBS encoders or not.
- Remove boilerplate code for outputs. This makes it easier to program
outputs. The boilerplate code involved before was mostly just
involving connecting to the audio/video data streams directly in each
output plugin.
Instead of doing that, simply add plugin callback functions for
receiving video/audio (either encoded or non-encoded, whichever it's
set to use), and then call obs_output_begin_data_capture and
obs_output_end_data_capture to automatically handle setting up
connections to raw or encoded video/audio streams for the plugin.
- Remove 'active' function from output callbacks, as it's no longer
really needed now that the libobs output context automatically knows
when the output is active or not.
- Make it so that an encoder cannot be destroyed until all data
connections to the encoder have been removed.
- Change the 'start' and 'stop' functions in the encoder interface to
just an 'initialize' callback, which initializes the encoder.
- Make it so that the encoder must be initialized first before the data
stream can be started. The reason why initialization was separated
from starting the encoder stream was because we need to be able to
check that the settings used with the encoder *can* be used first.
This problem was especially annoying if you had both video/audio
encoding. Before, you'd have to check the return value from
obs_encoder_start, and if that second encoder fails, then you
basically had to stop the first encoder again, making for
unnecessary boilerplate code whenever starting up two encoders.
2014-03-27 21:50:15 -07:00
|
|
|
|
Implement RTMP module (still needs drop code)
- Implement the RTMP output module. This time around, we just use a
simple FLV muxer, then just write to the stream with RTMP_Write.
Easy and effective.
- Fix the FLV muxer, the muxer now outputs proper FLV packets.
- Output API:
* When using encoders, automatically interleave encoded packets
before sending it to the output.
* Pair encoders and have them automatically wait for the other to
start to ensure sync.
* Change 'obs_output_signal_start_fail' to 'obs_output_signal_stop'
because it was a bit confusing, and doing this makes a lot more
sense for outputs that need to stop suddenly (disconnections/etc).
- Encoder API:
* Remove some unnecessary encoder functions from the actual API and
make them internal. Most of the encoder functions are handled
automatically by outputs anyway, so there's no real need to expose
them and end up inadvertently confusing plugin writers.
* Have audio encoders wait for the video encoder to get a frame, then
start at the exact data point that the first video frame starts to
ensure the most accrate sync of video/audio possible.
* Add a required 'frame_size' callback for audio encoders that
returns the expected number of frames desired to encode with. This
way, the libobs encoder API can handle the circular buffering
internally automatically for the encoder modules, so encoder
writers don't have to do it themselves.
- Fix a few bugs in the serializer interface. It was passing the wrong
variable for the data in a few cases.
- If a source has video, make obs_source_update defer the actual update
callback until the tick function is called to prevent threading
issues.
2014-04-07 22:00:10 -07:00
|
|
|
/**
|
|
|
|
* Signals that the output has stopped itself.
|
|
|
|
*
|
|
|
|
* @param output Output context
|
|
|
|
* @param code Error code (or OBS_OUTPUT_SUCCESS if not an error)
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_output_signal_stop(obs_output_t *output, int code);
|
2014-04-01 11:55:18 -07:00
|
|
|
|
2013-11-20 14:00:16 -08:00
|
|
|
|
Add preliminary output/encoder interface
- First, I redid the output interface for libobs. I feel like it's
going in a pretty good direction in terms of design.
Right now, the design is so that outputs and encoders are separate.
One or more outputs can connect to a specific encoder to receive its
data, or the output can connect directly to raw data from libobs
output itself, if the output doesn't want to use a designated encoder.
Data is received via callbacks set when you connect to the encoder or
raw output. Multiple outputs can receive the data from a single
encoder context if need be (such as for streaming to multiple channels
at once, and/or recording with the same data).
When an encoder is first connected to, it will connect to raw output,
and start encoding. Additional connections will receive that same
data being encoded as well after that. When the last encoder has
disconnected, it will stop encoding. If for some reason the encoder
needs to stop, it will use the callback with NULL to signal that
encoding has stopped. Some of these things may be subject to change
in the future, though it feels pretty good with this design so far.
Will have to see how well it works out in practice versus theory.
- Second, Started adding preliminary RTMP/x264 output plugin code.
To speed things up, I might just make a direct raw->FFmpeg output to
create a quick output plugin that we can start using for testing all
the subsystems.
2014-01-16 21:34:51 -08:00
|
|
|
/* ------------------------------------------------------------------------- */
|
2014-02-01 21:46:13 -08:00
|
|
|
/* Encoders */
|
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
|
|
|
|
2014-12-21 15:55:26 -08:00
|
|
|
EXPORT const char *obs_encoder_get_display_name(const char *id);
|
Add preliminary output/encoder interface
- First, I redid the output interface for libobs. I feel like it's
going in a pretty good direction in terms of design.
Right now, the design is so that outputs and encoders are separate.
One or more outputs can connect to a specific encoder to receive its
data, or the output can connect directly to raw data from libobs
output itself, if the output doesn't want to use a designated encoder.
Data is received via callbacks set when you connect to the encoder or
raw output. Multiple outputs can receive the data from a single
encoder context if need be (such as for streaming to multiple channels
at once, and/or recording with the same data).
When an encoder is first connected to, it will connect to raw output,
and start encoding. Additional connections will receive that same
data being encoded as well after that. When the last encoder has
disconnected, it will stop encoding. If for some reason the encoder
needs to stop, it will use the callback with NULL to signal that
encoding has stopped. Some of these things may be subject to change
in the future, though it feels pretty good with this design so far.
Will have to see how well it works out in practice versus theory.
- Second, Started adding preliminary RTMP/x264 output plugin code.
To speed things up, I might just make a direct raw->FFmpeg output to
create a quick output plugin that we can start using for testing all
the subsystems.
2014-01-16 21:34:51 -08:00
|
|
|
|
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
|
|
|
/**
|
|
|
|
* Creates a video encoder context
|
|
|
|
*
|
|
|
|
* @param id Video encoder ID
|
|
|
|
* @param name Name to assign to this context
|
|
|
|
* @param settings Settings
|
|
|
|
* @return The video encoder context, or NULL if failed or not found.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_encoder_t *obs_video_encoder_create(const char *id, const char *name,
|
2014-11-01 13:41:17 -07:00
|
|
|
obs_data_t *settings, obs_data_t *hotkey_data);
|
Add preliminary output/encoder interface
- First, I redid the output interface for libobs. I feel like it's
going in a pretty good direction in terms of design.
Right now, the design is so that outputs and encoders are separate.
One or more outputs can connect to a specific encoder to receive its
data, or the output can connect directly to raw data from libobs
output itself, if the output doesn't want to use a designated encoder.
Data is received via callbacks set when you connect to the encoder or
raw output. Multiple outputs can receive the data from a single
encoder context if need be (such as for streaming to multiple channels
at once, and/or recording with the same data).
When an encoder is first connected to, it will connect to raw output,
and start encoding. Additional connections will receive that same
data being encoded as well after that. When the last encoder has
disconnected, it will stop encoding. If for some reason the encoder
needs to stop, it will use the callback with NULL to signal that
encoding has stopped. Some of these things may be subject to change
in the future, though it feels pretty good with this design so far.
Will have to see how well it works out in practice versus theory.
- Second, Started adding preliminary RTMP/x264 output plugin code.
To speed things up, I might just make a direct raw->FFmpeg output to
create a quick output plugin that we can start using for testing all
the subsystems.
2014-01-16 21:34:51 -08:00
|
|
|
|
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
|
|
|
/**
|
|
|
|
* Creates an audio encoder context
|
|
|
|
*
|
|
|
|
* @param id Audio Encoder ID
|
|
|
|
* @param name Name to assign to this context
|
|
|
|
* @param settings Settings
|
(API Change) Add support for multiple audio mixers
API changed:
--------------------------
void obs_output_set_audio_encoder(
obs_output_t *output,
obs_encoder_t *encoder);
obs_encoder_t *obs_output_get_audio_encoder(
const obs_output_t *output);
obs_encoder_t *obs_audio_encoder_create(
const char *id,
const char *name,
obs_data_t *settings);
Changed to:
--------------------------
/* 'idx' specifies the track index of the output */
void obs_output_set_audio_encoder(
obs_output_t *output,
obs_encoder_t *encoder,
size_t idx);
/* 'idx' specifies the track index of the output */
obs_encoder_t *obs_output_get_audio_encoder(
const obs_output_t *output,
size_t idx);
/* 'mixer_idx' specifies the mixer index to capture audio from */
obs_encoder_t *obs_audio_encoder_create(
const char *id,
const char *name,
obs_data_t *settings,
size_t mixer_idx);
Overview
--------------------------
This feature allows multiple audio mixers to be used at a time. This
capability was able to be added with surprisingly very little extra
overhead. Audio will not be mixed unless it's assigned to a specific
mixer, and mixers will not mix unless they have an active mix
connection.
Mostly this will be useful for being able to separate out specific audio
for recording versus streaming, but will also be useful for certain
streaming services that support multiple audio streams via RTMP.
I didn't want to use a variable amount of mixers due to the desire to
reduce heap allocations, so currently I set the limit to 4 simultaneous
mixers; this number can be increased later if needed, but honestly I
feel like it's just the right number to use.
Sources:
Sources can now specify which audio mixers their audio is mixed to; this
can be a single mixer or multiple mixers at a time. The
obs_source_set_audio_mixers function sets the audio mixer which an audio
source applies to. For example, 0xF would mean that the source applies
to all four mixers.
Audio Encoders:
Audio encoders now must specify which specific audio mixer they use when
they encode audio data.
Outputs:
Outputs that use encoders can now support multiple audio tracks at once
if they have the OBS_OUTPUT_MULTI_TRACK capability flag set. This is
mostly only useful for certain types of RTMP transmissions, though may
be useful for file formats that support multiple audio tracks as well
later on.
2015-01-14 02:12:08 -08:00
|
|
|
* @param mixer_idx Index of the mixer to use for this audio encoder
|
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
|
|
|
* @return The video encoder context, or NULL if failed or not found.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_encoder_t *obs_audio_encoder_create(const char *id, const char *name,
|
2014-11-01 13:41:17 -07:00
|
|
|
obs_data_t *settings, size_t mixer_idx,
|
|
|
|
obs_data_t *hotkey_data);
|
2014-02-01 21:46:13 -08:00
|
|
|
|
2015-05-03 17:01:38 -07:00
|
|
|
/**
|
|
|
|
* Adds/releases a reference to an encoder. When the last reference is
|
|
|
|
* released, the encoder is destroyed.
|
|
|
|
*/
|
|
|
|
EXPORT void obs_encoder_addref(obs_encoder_t *encoder);
|
|
|
|
EXPORT void obs_encoder_release(obs_encoder_t *encoder);
|
|
|
|
|
|
|
|
EXPORT void obs_weak_encoder_addref(obs_weak_encoder_t *weak);
|
|
|
|
EXPORT void obs_weak_encoder_release(obs_weak_encoder_t *weak);
|
|
|
|
|
|
|
|
EXPORT obs_encoder_t *obs_encoder_get_ref(obs_encoder_t *encoder);
|
|
|
|
EXPORT obs_weak_encoder_t *obs_encoder_get_weak_encoder(obs_encoder_t *encoder);
|
|
|
|
EXPORT obs_encoder_t *obs_weak_encoder_get_encoder(obs_weak_encoder_t *weak);
|
|
|
|
|
|
|
|
EXPORT bool obs_weak_encoder_references_encoder(obs_weak_encoder_t *weak,
|
|
|
|
obs_encoder_t *encoder);
|
Add preliminary output/encoder interface
- First, I redid the output interface for libobs. I feel like it's
going in a pretty good direction in terms of design.
Right now, the design is so that outputs and encoders are separate.
One or more outputs can connect to a specific encoder to receive its
data, or the output can connect directly to raw data from libobs
output itself, if the output doesn't want to use a designated encoder.
Data is received via callbacks set when you connect to the encoder or
raw output. Multiple outputs can receive the data from a single
encoder context if need be (such as for streaming to multiple channels
at once, and/or recording with the same data).
When an encoder is first connected to, it will connect to raw output,
and start encoding. Additional connections will receive that same
data being encoded as well after that. When the last encoder has
disconnected, it will stop encoding. If for some reason the encoder
needs to stop, it will use the callback with NULL to signal that
encoding has stopped. Some of these things may be subject to change
in the future, though it feels pretty good with this design so far.
Will have to see how well it works out in practice versus theory.
- Second, Started adding preliminary RTMP/x264 output plugin code.
To speed things up, I might just make a direct raw->FFmpeg output to
create a quick output plugin that we can start using for testing all
the subsystems.
2014-01-16 21:34:51 -08:00
|
|
|
|
2015-01-25 19:26:31 -08:00
|
|
|
EXPORT void obs_encoder_set_name(obs_encoder_t *encoder, const char *name);
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT const char *obs_encoder_get_name(const obs_encoder_t *encoder);
|
2014-07-13 02:58:55 -07:00
|
|
|
|
2015-02-03 19:48:34 -08:00
|
|
|
/** Returns the codec of an encoder by the id */
|
|
|
|
EXPORT const char *obs_get_encoder_codec(const char *id);
|
|
|
|
|
2015-02-03 19:49:34 -08:00
|
|
|
/** Returns the type of an encoder by the id */
|
|
|
|
EXPORT enum obs_encoder_type obs_get_encoder_type(const char *id);
|
|
|
|
|
2014-04-01 11:55:18 -07:00
|
|
|
/** Returns the codec of the encoder */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT const char *obs_encoder_get_codec(const obs_encoder_t *encoder);
|
2014-04-01 11:55:18 -07:00
|
|
|
|
2015-02-03 19:49:34 -08:00
|
|
|
/** Returns the type of an encoder */
|
|
|
|
EXPORT enum obs_encoder_type obs_encoder_get_type(const obs_encoder_t *encoder);
|
|
|
|
|
2014-08-10 16:50:44 -07:00
|
|
|
/**
|
|
|
|
* Sets the scaled resolution for a video encoder. Set width and height to 0
|
|
|
|
* to disable scaling. If the encoder is active, this function will trigger
|
|
|
|
* a warning, and do nothing.
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_encoder_set_scaled_size(obs_encoder_t *encoder, uint32_t width,
|
2014-08-10 16:50:44 -07:00
|
|
|
uint32_t height);
|
|
|
|
|
|
|
|
/** For video encoders, returns the width of the encoded image */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT uint32_t obs_encoder_get_width(const obs_encoder_t *encoder);
|
2014-08-10 16:50:44 -07:00
|
|
|
|
|
|
|
/** For video encoders, returns the height of the encoded image */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT uint32_t obs_encoder_get_height(const obs_encoder_t *encoder);
|
2014-08-10 16:50:44 -07:00
|
|
|
|
2015-07-09 10:42:09 -07:00
|
|
|
/** For audio encoders, returns the sample rate of the audio */
|
|
|
|
EXPORT uint32_t obs_encoder_get_sample_rate(const obs_encoder_t *encoder);
|
|
|
|
|
2015-04-16 23:10:56 -07:00
|
|
|
/**
|
|
|
|
* Sets the preferred video format for a video encoder. If the encoder can use
|
|
|
|
* the format specified, it will force a conversion to that format if the
|
|
|
|
* obs output format does not match the preferred format.
|
|
|
|
*
|
|
|
|
* If the format is set to VIDEO_FORMAT_NONE, will revert to the default
|
|
|
|
* functionality of converting only when absolutely necessary.
|
|
|
|
*/
|
|
|
|
EXPORT void obs_encoder_set_preferred_video_format(obs_encoder_t *encoder,
|
|
|
|
enum video_format format);
|
|
|
|
EXPORT enum video_format obs_encoder_get_preferred_video_format(
|
|
|
|
const obs_encoder_t *encoder);
|
|
|
|
|
2014-03-07 05:55:21 -08:00
|
|
|
/** Gets the default settings for an encoder type */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_data_t *obs_encoder_defaults(const char *id);
|
2014-03-07 05:55:21 -08:00
|
|
|
|
2014-02-14 14:13:36 -08:00
|
|
|
/** Returns the property list, if any. Free with obs_properties_destroy */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_properties_t *obs_get_encoder_properties(const char *id);
|
2014-03-23 01:07:54 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the property list of an existing encoder, if any. Free with
|
|
|
|
* obs_properties_destroy
|
|
|
|
*/
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_properties_t *obs_encoder_properties(const obs_encoder_t *encoder);
|
2014-02-14 14:13:36 -08:00
|
|
|
|
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
|
|
|
/**
|
|
|
|
* Updates the settings of the encoder context. Usually used for changing
|
|
|
|
* bitrate while active
|
|
|
|
*/
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_encoder_update(obs_encoder_t *encoder, obs_data_t *settings);
|
Add preliminary output/encoder interface
- First, I redid the output interface for libobs. I feel like it's
going in a pretty good direction in terms of design.
Right now, the design is so that outputs and encoders are separate.
One or more outputs can connect to a specific encoder to receive its
data, or the output can connect directly to raw data from libobs
output itself, if the output doesn't want to use a designated encoder.
Data is received via callbacks set when you connect to the encoder or
raw output. Multiple outputs can receive the data from a single
encoder context if need be (such as for streaming to multiple channels
at once, and/or recording with the same data).
When an encoder is first connected to, it will connect to raw output,
and start encoding. Additional connections will receive that same
data being encoded as well after that. When the last encoder has
disconnected, it will stop encoding. If for some reason the encoder
needs to stop, it will use the callback with NULL to signal that
encoding has stopped. Some of these things may be subject to change
in the future, though it feels pretty good with this design so far.
Will have to see how well it works out in practice versus theory.
- Second, Started adding preliminary RTMP/x264 output plugin code.
To speed things up, I might just make a direct raw->FFmpeg output to
create a quick output plugin that we can start using for testing all
the subsystems.
2014-01-16 21:34:51 -08:00
|
|
|
|
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
|
|
|
/** Gets extra data (headers) associated with this context */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT bool obs_encoder_get_extra_data(const obs_encoder_t *encoder,
|
2014-02-14 14:13:36 -08:00
|
|
|
uint8_t **extra_data, size_t *size);
|
Add preliminary output/encoder interface
- First, I redid the output interface for libobs. I feel like it's
going in a pretty good direction in terms of design.
Right now, the design is so that outputs and encoders are separate.
One or more outputs can connect to a specific encoder to receive its
data, or the output can connect directly to raw data from libobs
output itself, if the output doesn't want to use a designated encoder.
Data is received via callbacks set when you connect to the encoder or
raw output. Multiple outputs can receive the data from a single
encoder context if need be (such as for streaming to multiple channels
at once, and/or recording with the same data).
When an encoder is first connected to, it will connect to raw output,
and start encoding. Additional connections will receive that same
data being encoded as well after that. When the last encoder has
disconnected, it will stop encoding. If for some reason the encoder
needs to stop, it will use the callback with NULL to signal that
encoding has stopped. Some of these things may be subject to change
in the future, though it feels pretty good with this design so far.
Will have to see how well it works out in practice versus theory.
- Second, Started adding preliminary RTMP/x264 output plugin code.
To speed things up, I might just make a direct raw->FFmpeg output to
create a quick output plugin that we can start using for testing all
the subsystems.
2014-01-16 21:34:51 -08:00
|
|
|
|
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
|
|
|
/** Returns the current settings for this encoder */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_data_t *obs_encoder_get_settings(const obs_encoder_t *encoder);
|
Add preliminary output/encoder interface
- First, I redid the output interface for libobs. I feel like it's
going in a pretty good direction in terms of design.
Right now, the design is so that outputs and encoders are separate.
One or more outputs can connect to a specific encoder to receive its
data, or the output can connect directly to raw data from libobs
output itself, if the output doesn't want to use a designated encoder.
Data is received via callbacks set when you connect to the encoder or
raw output. Multiple outputs can receive the data from a single
encoder context if need be (such as for streaming to multiple channels
at once, and/or recording with the same data).
When an encoder is first connected to, it will connect to raw output,
and start encoding. Additional connections will receive that same
data being encoded as well after that. When the last encoder has
disconnected, it will stop encoding. If for some reason the encoder
needs to stop, it will use the callback with NULL to signal that
encoding has stopped. Some of these things may be subject to change
in the future, though it feels pretty good with this design so far.
Will have to see how well it works out in practice versus theory.
- Second, Started adding preliminary RTMP/x264 output plugin code.
To speed things up, I might just make a direct raw->FFmpeg output to
create a quick output plugin that we can start using for testing all
the subsystems.
2014-01-16 21:34:51 -08:00
|
|
|
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
/** Sets the video output context to be used with this encoder */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_encoder_set_video(obs_encoder_t *encoder, video_t *video);
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
|
|
|
|
/** Sets the audio output context to be used with this encoder */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_encoder_set_audio(obs_encoder_t *encoder, audio_t *audio);
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
|
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
|
|
|
/**
|
|
|
|
* Returns the video output context used with this encoder, or NULL if not
|
|
|
|
* a video context
|
|
|
|
*/
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT video_t *obs_encoder_video(const obs_encoder_t *encoder);
|
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
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the audio output context used with this encoder, or NULL if not
|
|
|
|
* a audio context
|
|
|
|
*/
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT audio_t *obs_encoder_audio(const obs_encoder_t *encoder);
|
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
|
|
|
|
2014-06-16 21:29:11 -07:00
|
|
|
/** Returns true if encoder is active, false otherwise */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT bool obs_encoder_active(const obs_encoder_t *encoder);
|
2014-06-16 21:29:11 -07:00
|
|
|
|
2015-09-15 22:51:37 -07:00
|
|
|
EXPORT void *obs_encoder_get_type_data(obs_encoder_t *encoder);
|
|
|
|
|
2015-10-19 15:01:25 -07:00
|
|
|
EXPORT const char *obs_encoder_get_id(const obs_encoder_t *encoder);
|
|
|
|
|
2016-04-11 05:02:39 -07:00
|
|
|
EXPORT uint32_t obs_get_encoder_caps(const char *encoder_id);
|
|
|
|
|
2014-04-01 11:55:18 -07:00
|
|
|
/** Duplicates an encoder packet */
|
2016-12-07 12:45:25 -08:00
|
|
|
DEPRECATED
|
2014-04-01 11:55:18 -07:00
|
|
|
EXPORT void obs_duplicate_encoder_packet(struct encoder_packet *dst,
|
|
|
|
const struct encoder_packet *src);
|
|
|
|
|
2016-12-07 12:45:25 -08:00
|
|
|
DEPRECATED
|
2014-04-01 11:55:18 -07:00
|
|
|
EXPORT void obs_free_encoder_packet(struct encoder_packet *packet);
|
|
|
|
|
2016-12-07 12:45:25 -08:00
|
|
|
EXPORT void obs_encoder_packet_ref(struct encoder_packet *dst,
|
|
|
|
struct encoder_packet *src);
|
|
|
|
EXPORT void obs_encoder_packet_release(struct encoder_packet *packet);
|
|
|
|
|
Add preliminary output/encoder interface
- First, I redid the output interface for libobs. I feel like it's
going in a pretty good direction in terms of design.
Right now, the design is so that outputs and encoders are separate.
One or more outputs can connect to a specific encoder to receive its
data, or the output can connect directly to raw data from libobs
output itself, if the output doesn't want to use a designated encoder.
Data is received via callbacks set when you connect to the encoder or
raw output. Multiple outputs can receive the data from a single
encoder context if need be (such as for streaming to multiple channels
at once, and/or recording with the same data).
When an encoder is first connected to, it will connect to raw output,
and start encoding. Additional connections will receive that same
data being encoded as well after that. When the last encoder has
disconnected, it will stop encoding. If for some reason the encoder
needs to stop, it will use the callback with NULL to signal that
encoding has stopped. Some of these things may be subject to change
in the future, though it feels pretty good with this design so far.
Will have to see how well it works out in practice versus theory.
- Second, Started adding preliminary RTMP/x264 output plugin code.
To speed things up, I might just make a direct raw->FFmpeg output to
create a quick output plugin that we can start using for testing all
the subsystems.
2014-01-16 21:34:51 -08:00
|
|
|
|
2013-11-20 14:00:16 -08:00
|
|
|
/* ------------------------------------------------------------------------- */
|
|
|
|
/* Stream Services */
|
libobs: Add services API, reduce repeated code
Add API for streaming services. The services API simplifies the
creation of custom service features and user interface.
Custom streaming services later on will be able to do things such as:
- Be able to use service-specific APIs via modules, allowing a more
direct means of communicating with the service and requesting or
setting service-specific information
- Get URL/stream key via other means of authentication such as OAuth,
or be able to build custom URLs for services that require that sort
of thing.
- Query information (such as viewer count, chat, follower
notifications, and other information)
- Set channel information (such as current game, current channel title,
activating commercials)
Also, I reduce some repeated code that was used for all libobs objects.
This includes the name of the object, the private data, settings, as
well as the signal and procedure handlers.
I also switched to using linked lists for the global object lists,
rather than using an array of pointers (you could say it was..
pointless.) ..Anyway, the linked list info is also stored in the shared
context data structure.
2014-04-19 20:38:53 -07:00
|
|
|
|
2014-08-04 08:41:15 -07:00
|
|
|
EXPORT const char *obs_service_get_display_name(const char *id);
|
Add preliminary output/encoder interface
- First, I redid the output interface for libobs. I feel like it's
going in a pretty good direction in terms of design.
Right now, the design is so that outputs and encoders are separate.
One or more outputs can connect to a specific encoder to receive its
data, or the output can connect directly to raw data from libobs
output itself, if the output doesn't want to use a designated encoder.
Data is received via callbacks set when you connect to the encoder or
raw output. Multiple outputs can receive the data from a single
encoder context if need be (such as for streaming to multiple channels
at once, and/or recording with the same data).
When an encoder is first connected to, it will connect to raw output,
and start encoding. Additional connections will receive that same
data being encoded as well after that. When the last encoder has
disconnected, it will stop encoding. If for some reason the encoder
needs to stop, it will use the callback with NULL to signal that
encoding has stopped. Some of these things may be subject to change
in the future, though it feels pretty good with this design so far.
Will have to see how well it works out in practice versus theory.
- Second, Started adding preliminary RTMP/x264 output plugin code.
To speed things up, I might just make a direct raw->FFmpeg output to
create a quick output plugin that we can start using for testing all
the subsystems.
2014-01-16 21:34:51 -08:00
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_service_t *obs_service_create(const char *id, const char *name,
|
2014-11-01 13:41:17 -07:00
|
|
|
obs_data_t *settings, obs_data_t *hotkey_data);
|
2015-05-03 17:07:43 -07:00
|
|
|
|
2016-04-10 22:49:53 -07:00
|
|
|
EXPORT obs_service_t *obs_service_create_private(const char *id,
|
|
|
|
const char *name, obs_data_t *settings);
|
|
|
|
|
2015-05-03 17:07:43 -07:00
|
|
|
/**
|
|
|
|
* Adds/releases a reference to a service. When the last reference is
|
|
|
|
* released, the service is destroyed.
|
|
|
|
*/
|
|
|
|
EXPORT void obs_service_addref(obs_service_t *service);
|
|
|
|
EXPORT void obs_service_release(obs_service_t *service);
|
|
|
|
|
|
|
|
EXPORT void obs_weak_service_addref(obs_weak_service_t *weak);
|
|
|
|
EXPORT void obs_weak_service_release(obs_weak_service_t *weak);
|
|
|
|
|
|
|
|
EXPORT obs_service_t *obs_service_get_ref(obs_service_t *service);
|
|
|
|
EXPORT obs_weak_service_t *obs_service_get_weak_service(obs_service_t *service);
|
|
|
|
EXPORT obs_service_t *obs_weak_service_get_service(obs_weak_service_t *weak);
|
|
|
|
|
|
|
|
EXPORT bool obs_weak_service_references_service(obs_weak_service_t *weak,
|
|
|
|
obs_service_t *service);
|
2013-11-20 14:00:16 -08:00
|
|
|
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT const char *obs_service_get_name(const obs_service_t *service);
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
|
libobs: Add services API, reduce repeated code
Add API for streaming services. The services API simplifies the
creation of custom service features and user interface.
Custom streaming services later on will be able to do things such as:
- Be able to use service-specific APIs via modules, allowing a more
direct means of communicating with the service and requesting or
setting service-specific information
- Get URL/stream key via other means of authentication such as OAuth,
or be able to build custom URLs for services that require that sort
of thing.
- Query information (such as viewer count, chat, follower
notifications, and other information)
- Set channel information (such as current game, current channel title,
activating commercials)
Also, I reduce some repeated code that was used for all libobs objects.
This includes the name of the object, the private data, settings, as
well as the signal and procedure handlers.
I also switched to using linked lists for the global object lists,
rather than using an array of pointers (you could say it was..
pointless.) ..Anyway, the linked list info is also stored in the shared
context data structure.
2014-04-19 20:38:53 -07:00
|
|
|
/** Gets the default settings for a service */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_data_t *obs_service_defaults(const char *id);
|
libobs: Add services API, reduce repeated code
Add API for streaming services. The services API simplifies the
creation of custom service features and user interface.
Custom streaming services later on will be able to do things such as:
- Be able to use service-specific APIs via modules, allowing a more
direct means of communicating with the service and requesting or
setting service-specific information
- Get URL/stream key via other means of authentication such as OAuth,
or be able to build custom URLs for services that require that sort
of thing.
- Query information (such as viewer count, chat, follower
notifications, and other information)
- Set channel information (such as current game, current channel title,
activating commercials)
Also, I reduce some repeated code that was used for all libobs objects.
This includes the name of the object, the private data, settings, as
well as the signal and procedure handlers.
I also switched to using linked lists for the global object lists,
rather than using an array of pointers (you could say it was..
pointless.) ..Anyway, the linked list info is also stored in the shared
context data structure.
2014-04-19 20:38:53 -07:00
|
|
|
|
|
|
|
/** Returns the property list, if any. Free with obs_properties_destroy */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT obs_properties_t *obs_get_service_properties(const char *id);
|
libobs: Add services API, reduce repeated code
Add API for streaming services. The services API simplifies the
creation of custom service features and user interface.
Custom streaming services later on will be able to do things such as:
- Be able to use service-specific APIs via modules, allowing a more
direct means of communicating with the service and requesting or
setting service-specific information
- Get URL/stream key via other means of authentication such as OAuth,
or be able to build custom URLs for services that require that sort
of thing.
- Query information (such as viewer count, chat, follower
notifications, and other information)
- Set channel information (such as current game, current channel title,
activating commercials)
Also, I reduce some repeated code that was used for all libobs objects.
This includes the name of the object, the private data, settings, as
well as the signal and procedure handlers.
I also switched to using linked lists for the global object lists,
rather than using an array of pointers (you could say it was..
pointless.) ..Anyway, the linked list info is also stored in the shared
context data structure.
2014-04-19 20:38:53 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the property list of an existing service context, if any. Free with
|
|
|
|
* obs_properties_destroy
|
|
|
|
*/
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_properties_t *obs_service_properties(const obs_service_t *service);
|
libobs: Add services API, reduce repeated code
Add API for streaming services. The services API simplifies the
creation of custom service features and user interface.
Custom streaming services later on will be able to do things such as:
- Be able to use service-specific APIs via modules, allowing a more
direct means of communicating with the service and requesting or
setting service-specific information
- Get URL/stream key via other means of authentication such as OAuth,
or be able to build custom URLs for services that require that sort
of thing.
- Query information (such as viewer count, chat, follower
notifications, and other information)
- Set channel information (such as current game, current channel title,
activating commercials)
Also, I reduce some repeated code that was used for all libobs objects.
This includes the name of the object, the private data, settings, as
well as the signal and procedure handlers.
I also switched to using linked lists for the global object lists,
rather than using an array of pointers (you could say it was..
pointless.) ..Anyway, the linked list info is also stored in the shared
context data structure.
2014-04-19 20:38:53 -07:00
|
|
|
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
/** Gets the service type */
|
2015-02-07 08:19:34 -08:00
|
|
|
EXPORT const char *obs_service_get_type(const obs_service_t *service);
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
|
|
|
|
/** Updates the settings of the service context */
|
2014-09-25 17:44:05 -07:00
|
|
|
EXPORT void obs_service_update(obs_service_t *service, obs_data_t *settings);
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
|
|
|
|
/** Returns the current settings for this service */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT obs_data_t *obs_service_get_settings(const obs_service_t *service);
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
|
libobs: Add services API, reduce repeated code
Add API for streaming services. The services API simplifies the
creation of custom service features and user interface.
Custom streaming services later on will be able to do things such as:
- Be able to use service-specific APIs via modules, allowing a more
direct means of communicating with the service and requesting or
setting service-specific information
- Get URL/stream key via other means of authentication such as OAuth,
or be able to build custom URLs for services that require that sort
of thing.
- Query information (such as viewer count, chat, follower
notifications, and other information)
- Set channel information (such as current game, current channel title,
activating commercials)
Also, I reduce some repeated code that was used for all libobs objects.
This includes the name of the object, the private data, settings, as
well as the signal and procedure handlers.
I also switched to using linked lists for the global object lists,
rather than using an array of pointers (you could say it was..
pointless.) ..Anyway, the linked list info is also stored in the shared
context data structure.
2014-04-19 20:38:53 -07:00
|
|
|
/** Returns the URL for this service context */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT const char *obs_service_get_url(const obs_service_t *service);
|
libobs: Add services API, reduce repeated code
Add API for streaming services. The services API simplifies the
creation of custom service features and user interface.
Custom streaming services later on will be able to do things such as:
- Be able to use service-specific APIs via modules, allowing a more
direct means of communicating with the service and requesting or
setting service-specific information
- Get URL/stream key via other means of authentication such as OAuth,
or be able to build custom URLs for services that require that sort
of thing.
- Query information (such as viewer count, chat, follower
notifications, and other information)
- Set channel information (such as current game, current channel title,
activating commercials)
Also, I reduce some repeated code that was used for all libobs objects.
This includes the name of the object, the private data, settings, as
well as the signal and procedure handlers.
I also switched to using linked lists for the global object lists,
rather than using an array of pointers (you could say it was..
pointless.) ..Anyway, the linked list info is also stored in the shared
context data structure.
2014-04-19 20:38:53 -07:00
|
|
|
|
|
|
|
/** Returns the stream key (if any) for this service context */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT const char *obs_service_get_key(const obs_service_t *service);
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
|
|
|
|
/** Returns the username (if any) for this service context */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT const char *obs_service_get_username(const obs_service_t *service);
|
obs-studio UI: Implement stream settings UI
- Updated the services API so that it links up with an output and
the output gets data from that service rather than via settings.
This allows the service context to have control over how an output is
used, and makes it so that the URL/key/etc isn't necessarily some
static setting.
Also, if the service is attached to an output, it will stick around
until the output is destroyed.
- The settings interface has been updated so that it can allow the
usage of service plugins. What this means is that now you can create
a service plugin that can control aspects of the stream, and it
allows each service to create their own user interface if they create
a service plugin module.
- Testing out saving of current service information. Saves/loads from
JSON in to obs_data_t, seems to be working quite nicely, and the
service object information is saved/preserved on exit, and loaded
again on startup.
- I agonized over the settings user interface for days, and eventually
I just decided that the only way that users weren't going to be
fumbling over options was to split up the settings in to simple/basic
output, pre-configured, and then advanced for advanced use (such as
multiple outputs or services, which I'll implement later).
This was particularly painful to really design right, I wanted more
features and wanted to include everything in one interface but
ultimately just realized from experience that users are just not
technically knowledgable about it and will end up fumbling with the
settings rather than getting things done.
Basically, what this means is that casual users only have to enter in
about 3 things to configure their stream: Stream key, audio bitrate,
and video bitrate. I am really happy with this interface for those
types of users, but it definitely won't be sufficient for advanced
usage or for custom outputs, so that stuff will have to be separated.
- Improved the JSON usage for the 'common streaming services' context,
I realized that JSON arrays are there to ensure sorting, while
forgetting that general items are optimized for hashing. So
basically I'm just using arrays now to sort items in it.
2014-04-24 01:49:07 -07:00
|
|
|
|
|
|
|
/** Returns the password (if any) for this service context */
|
2014-09-26 15:25:59 -07:00
|
|
|
EXPORT const char *obs_service_get_password(const obs_service_t *service);
|
libobs: Add services API, reduce repeated code
Add API for streaming services. The services API simplifies the
creation of custom service features and user interface.
Custom streaming services later on will be able to do things such as:
- Be able to use service-specific APIs via modules, allowing a more
direct means of communicating with the service and requesting or
setting service-specific information
- Get URL/stream key via other means of authentication such as OAuth,
or be able to build custom URLs for services that require that sort
of thing.
- Query information (such as viewer count, chat, follower
notifications, and other information)
- Set channel information (such as current game, current channel title,
activating commercials)
Also, I reduce some repeated code that was used for all libobs objects.
This includes the name of the object, the private data, settings, as
well as the signal and procedure handlers.
I also switched to using linked lists for the global object lists,
rather than using an array of pointers (you could say it was..
pointless.) ..Anyway, the linked list info is also stored in the shared
context data structure.
2014-04-19 20:38:53 -07:00
|
|
|
|
2015-02-10 19:23:36 -08:00
|
|
|
/**
|
|
|
|
* Applies service-specific video encoder settings.
|
|
|
|
*
|
2015-03-07 16:32:00 -08:00
|
|
|
* @param video_encoder_settings Video encoder settings. Optional.
|
|
|
|
* @param audio_encoder_settings Audio encoder settings. Optional.
|
2015-02-10 19:23:36 -08:00
|
|
|
*/
|
|
|
|
EXPORT void obs_service_apply_encoder_settings(obs_service_t *service,
|
2015-03-07 16:32:00 -08:00
|
|
|
obs_data_t *video_encoder_settings,
|
|
|
|
obs_data_t *audio_encoder_settings);
|
2015-02-10 19:23:36 -08:00
|
|
|
|
2015-09-15 22:51:37 -07:00
|
|
|
EXPORT void *obs_service_get_type_data(obs_service_t *service);
|
|
|
|
|
2015-10-19 15:01:25 -07:00
|
|
|
EXPORT const char *obs_service_get_id(const obs_service_t *service);
|
|
|
|
|
2013-11-20 14:00:16 -08:00
|
|
|
|
2014-02-09 04:51:06 -08:00
|
|
|
/* ------------------------------------------------------------------------- */
|
|
|
|
/* Source frame allocation functions */
|
2014-08-02 01:04:45 -07:00
|
|
|
EXPORT void obs_source_frame_init(struct obs_source_frame *frame,
|
2014-02-09 04:51:06 -08:00
|
|
|
enum video_format format, uint32_t width, uint32_t height);
|
|
|
|
|
2014-08-02 01:04:45 -07:00
|
|
|
static inline void obs_source_frame_free(struct obs_source_frame *frame)
|
2014-02-09 04:51:06 -08:00
|
|
|
{
|
|
|
|
if (frame) {
|
|
|
|
bfree(frame->data[0]);
|
2014-08-02 01:04:45 -07:00
|
|
|
memset(frame, 0, sizeof(*frame));
|
2014-02-09 04:51:06 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-08-02 01:04:45 -07:00
|
|
|
static inline struct obs_source_frame *obs_source_frame_create(
|
2014-02-09 04:51:06 -08:00
|
|
|
enum video_format format, uint32_t width, uint32_t height)
|
|
|
|
{
|
2014-08-02 01:04:45 -07:00
|
|
|
struct obs_source_frame *frame;
|
2014-02-09 04:51:06 -08:00
|
|
|
|
2014-08-02 01:04:45 -07:00
|
|
|
frame = (struct obs_source_frame*)bzalloc(sizeof(*frame));
|
|
|
|
obs_source_frame_init(frame, format, width, height);
|
2014-02-09 04:51:06 -08:00
|
|
|
return frame;
|
|
|
|
}
|
|
|
|
|
2014-08-02 01:04:45 -07:00
|
|
|
static inline void obs_source_frame_destroy(struct obs_source_frame *frame)
|
2014-02-09 04:51:06 -08:00
|
|
|
{
|
|
|
|
if (frame) {
|
|
|
|
bfree(frame->data[0]);
|
|
|
|
bfree(frame);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-09-30 19:37:13 -07:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|