2014-04-19 20:54:18 -07:00
|
|
|
#include <util/platform.h>
|
|
|
|
#include <obs-module.h>
|
|
|
|
#include <jansson.h>
|
|
|
|
|
|
|
|
struct rtmp_common {
|
|
|
|
char *service;
|
|
|
|
char *server;
|
|
|
|
char *key;
|
|
|
|
};
|
|
|
|
|
2014-06-25 00:13:00 -07:00
|
|
|
static const char *rtmp_common_getname(void)
|
2014-04-19 20:54:18 -07:00
|
|
|
{
|
2014-07-09 22:12:57 -07:00
|
|
|
return obs_module_text("StreamingServices");
|
2014-04-19 20:54:18 -07:00
|
|
|
}
|
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
static void rtmp_common_update(void *data, obs_data_t *settings)
|
2014-04-19 20:54:18 -07:00
|
|
|
{
|
|
|
|
struct rtmp_common *service = data;
|
|
|
|
|
|
|
|
bfree(service->service);
|
|
|
|
bfree(service->server);
|
|
|
|
bfree(service->key);
|
|
|
|
|
2014-08-05 11:09:29 -07:00
|
|
|
service->service = bstrdup(obs_data_get_string(settings, "service"));
|
|
|
|
service->server = bstrdup(obs_data_get_string(settings, "server"));
|
|
|
|
service->key = bstrdup(obs_data_get_string(settings, "key"));
|
2014-04-19 20:54:18 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void rtmp_common_destroy(void *data)
|
|
|
|
{
|
|
|
|
struct rtmp_common *service = data;
|
|
|
|
|
|
|
|
bfree(service->service);
|
|
|
|
bfree(service->server);
|
|
|
|
bfree(service->key);
|
|
|
|
bfree(service);
|
|
|
|
}
|
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
static void *rtmp_common_create(obs_data_t *settings, obs_service_t *service)
|
2014-04-19 20:54:18 -07:00
|
|
|
{
|
|
|
|
struct rtmp_common *data = bzalloc(sizeof(struct rtmp_common));
|
|
|
|
rtmp_common_update(data, settings);
|
|
|
|
|
|
|
|
UNUSED_PARAMETER(service);
|
|
|
|
return data;
|
|
|
|
}
|
|
|
|
|
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
|
|
|
static inline const char *get_string_val(json_t *service, const char *key)
|
|
|
|
{
|
|
|
|
json_t *str_val = json_object_get(service, key);
|
|
|
|
if (!str_val || !json_is_string(str_val))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
return json_string_value(str_val);
|
|
|
|
}
|
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
static void add_service(obs_property_t *list, json_t *service)
|
2014-04-19 20:54:18 -07:00
|
|
|
{
|
|
|
|
json_t *servers;
|
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
|
|
|
const char *name;
|
2014-04-19 20:54:18 -07:00
|
|
|
|
|
|
|
if (!json_is_object(service)) {
|
|
|
|
blog(LOG_WARNING, "rtmp-common.c: [add_service] 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
|
|
|
"is not an object");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
name = get_string_val(service, "name");
|
|
|
|
if (!name) {
|
|
|
|
blog(LOG_WARNING, "rtmp-common.c: [add_service] service "
|
|
|
|
"has no name");
|
2014-04-19 20:54:18 -07:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
servers = json_object_get(service, "servers");
|
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
|
|
|
if (!servers || !json_is_array(servers)) {
|
2014-04-19 20:54:18 -07:00
|
|
|
blog(LOG_WARNING, "rtmp-common.c: [add_service] service "
|
|
|
|
"'%s' has no servers", name);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
obs_property_list_add_string(list, name, name);
|
|
|
|
}
|
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
static void add_services(obs_property_t *list, const char *file, json_t *root)
|
2014-04-19 20:54:18 -07:00
|
|
|
{
|
|
|
|
json_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
|
|
|
size_t index;
|
2014-04-19 20:54:18 -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
|
|
|
if (!json_is_array(root)) {
|
2014-04-19 20:54:18 -07:00
|
|
|
blog(LOG_WARNING, "rtmp-common.c: [add_services] JSON file "
|
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
|
|
|
"'%s' root is not an array", file);
|
2014-04-19 20:54:18 -07:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
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
|
|
|
json_array_foreach (root, index, service) {
|
|
|
|
add_service(list, service);
|
2014-04-19 20:54:18 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-06-16 21:31:36 -07:00
|
|
|
static json_t *open_json_file(const char *file)
|
2014-04-19 20:54:18 -07:00
|
|
|
{
|
|
|
|
char *file_data = os_quick_read_utf8_file(file);
|
|
|
|
json_error_t error;
|
|
|
|
json_t *root;
|
|
|
|
|
|
|
|
if (!file_data)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
root = json_loads(file_data, JSON_REJECT_DUPLICATES, &error);
|
|
|
|
bfree(file_data);
|
|
|
|
|
|
|
|
if (!root) {
|
2014-06-16 21:31:36 -07:00
|
|
|
blog(LOG_WARNING, "rtmp-common.c: [open_json_file] "
|
2014-04-19 20:54:18 -07:00
|
|
|
"Error reading JSON file '%s' (%d): %s",
|
|
|
|
file, error.line, error.text);
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2014-06-16 21:31:36 -07:00
|
|
|
return root;
|
|
|
|
}
|
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
static json_t *build_service_list(obs_property_t *list, const char *file)
|
2014-06-16 21:31:36 -07:00
|
|
|
{
|
|
|
|
json_t *root = open_json_file(file);
|
2014-04-19 20:54:18 -07:00
|
|
|
add_services(list, file, root);
|
|
|
|
return root;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void properties_data_destroy(void *data)
|
|
|
|
{
|
|
|
|
json_t *root = data;
|
|
|
|
if (root)
|
|
|
|
json_decref(root);
|
|
|
|
}
|
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
static void fill_servers(obs_property_t *servers_prop, json_t *service,
|
2014-04-19 20:54:18 -07:00
|
|
|
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
|
|
|
json_t *servers, *server;
|
|
|
|
size_t index;
|
2014-04-19 20:54:18 -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
|
|
|
obs_property_list_clear(servers_prop);
|
2014-04-19 20:54:18 -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
|
|
|
servers = json_object_get(service, "servers");
|
|
|
|
|
|
|
|
if (!json_is_array(servers)) {
|
2014-04-19 20:54:18 -07:00
|
|
|
blog(LOG_WARNING, "rtmp-common.c: [fill_servers] "
|
|
|
|
"Servers for service '%s' not a valid object",
|
|
|
|
name);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
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
|
|
|
json_array_foreach (servers, index, server) {
|
|
|
|
const char *server_name = get_string_val(server, "name");
|
|
|
|
const char *url = get_string_val(server, "url");
|
|
|
|
|
|
|
|
if (!server_name || !url)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
obs_property_list_add_string(servers_prop, server_name, url);
|
2014-04-19 20:54:18 -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
|
|
|
static inline json_t *find_service(json_t *root, const char *name)
|
|
|
|
{
|
|
|
|
size_t index;
|
|
|
|
json_t *service;
|
|
|
|
|
|
|
|
json_array_foreach (root, index, service) {
|
|
|
|
const char *cur_name = get_string_val(service, "name");
|
|
|
|
|
|
|
|
if (strcmp(name, cur_name) == 0)
|
|
|
|
return service;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
static bool service_selected(obs_properties_t *props, obs_property_t *p,
|
|
|
|
obs_data_t *settings)
|
2014-04-19 20:54:18 -07:00
|
|
|
{
|
2014-08-05 11:09:29 -07:00
|
|
|
const char *name = obs_data_get_string(settings, "service");
|
2014-04-19 20:54:18 -07:00
|
|
|
json_t *root = obs_properties_get_param(props);
|
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
|
|
|
json_t *service;
|
|
|
|
|
|
|
|
if (!name || !*name)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
service = find_service(root, name);
|
|
|
|
if (!service)
|
|
|
|
return false;
|
2014-04-19 20:54:18 -07:00
|
|
|
|
|
|
|
fill_servers(obs_properties_get(props, "server"), service, name);
|
|
|
|
|
|
|
|
UNUSED_PARAMETER(p);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-09-29 08:36:13 -07:00
|
|
|
static obs_properties_t *rtmp_common_properties(void *unused)
|
2014-04-19 20:54:18 -07:00
|
|
|
{
|
2014-09-29 08:36:13 -07:00
|
|
|
UNUSED_PARAMETER(unused);
|
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
obs_properties_t *ppts = obs_properties_create();
|
|
|
|
obs_property_t *list;
|
2014-04-19 20:54:18 -07:00
|
|
|
char *file;
|
|
|
|
|
2014-07-09 22:12:57 -07:00
|
|
|
list = obs_properties_add_list(ppts, "service",
|
|
|
|
obs_module_text("Service"),
|
2014-04-19 20:54:18 -07:00
|
|
|
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
|
|
|
|
|
(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
|
|
|
file = obs_module_file("services.json");
|
2014-04-19 20:54:18 -07:00
|
|
|
if (file) {
|
|
|
|
json_t *root = build_service_list(list, file);
|
|
|
|
obs_properties_set_param(ppts, root, properties_data_destroy);
|
|
|
|
obs_property_set_modified_callback(list, service_selected);
|
|
|
|
bfree(file);
|
|
|
|
}
|
|
|
|
|
2014-07-09 22:12:57 -07:00
|
|
|
obs_properties_add_list(ppts, "server", obs_module_text("Server"),
|
2014-04-19 20:54:18 -07:00
|
|
|
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
|
|
|
|
|
2014-07-09 22:12:57 -07:00
|
|
|
obs_properties_add_text(ppts, "key", obs_module_text("StreamKey"),
|
|
|
|
OBS_TEXT_PASSWORD);
|
2014-04-19 20:54:18 -07:00
|
|
|
return ppts;
|
|
|
|
}
|
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
static void apply_video_encoder_settings(obs_encoder_t *encoder,
|
2014-06-16 21:31:36 -07:00
|
|
|
json_t *recommended)
|
|
|
|
{
|
2014-09-25 17:44:05 -07:00
|
|
|
obs_data_t *settings = obs_encoder_get_settings(encoder);
|
2014-06-16 21:31:36 -07:00
|
|
|
|
|
|
|
json_t *item = json_object_get(recommended, "keyint");
|
|
|
|
if (item && json_is_integer(item)) {
|
|
|
|
int keyint = (int)json_integer_value(item);
|
2014-08-05 11:09:29 -07:00
|
|
|
obs_data_set_int(settings, "keyint_sec", keyint);
|
2014-06-16 21:31:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
item = json_object_get(recommended, "cbr");
|
|
|
|
if (item && json_is_boolean(item)) {
|
2014-06-17 08:01:36 -07:00
|
|
|
bool cbr = json_is_true(item);
|
2014-08-05 11:09:29 -07:00
|
|
|
obs_data_set_bool(settings, "cbr", cbr);
|
2014-06-16 21:31:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
item = json_object_get(recommended, "profile");
|
|
|
|
if (item && json_is_string(item)) {
|
|
|
|
const char *profile = json_string_value(item);
|
2015-01-07 03:16:02 -08:00
|
|
|
obs_data_set_string(settings, "profile", profile);
|
2014-06-16 21:31:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
item = json_object_get(recommended, "max video bitrate");
|
|
|
|
if (item && json_is_integer(item)) {
|
|
|
|
int max_bitrate = (int)json_integer_value(item);
|
2014-08-05 11:09:29 -07:00
|
|
|
if (obs_data_get_int(settings, "bitrate") > max_bitrate) {
|
|
|
|
obs_data_set_int(settings, "bitrate", max_bitrate);
|
|
|
|
obs_data_set_int(settings, "buffer_size", max_bitrate);
|
2014-06-16 21:31:36 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
obs_encoder_update(encoder, settings);
|
|
|
|
obs_data_release(settings);
|
|
|
|
}
|
|
|
|
|
2014-09-25 17:44:05 -07:00
|
|
|
static void apply_audio_encoder_settings(obs_encoder_t *encoder,
|
2014-06-16 21:31:36 -07:00
|
|
|
json_t *recommended)
|
|
|
|
{
|
2014-09-25 17:44:05 -07:00
|
|
|
obs_data_t *settings = obs_encoder_get_settings(encoder);
|
2014-06-16 21:31:36 -07:00
|
|
|
|
|
|
|
json_t *item = json_object_get(recommended, "max audio bitrate");
|
|
|
|
if (item && json_is_integer(item)) {
|
|
|
|
int max_bitrate = (int)json_integer_value(item);
|
2014-08-05 11:09:29 -07:00
|
|
|
if (obs_data_get_int(settings, "bitrate") > max_bitrate)
|
|
|
|
obs_data_set_int(settings, "bitrate", max_bitrate);
|
2014-06-16 21:31:36 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
obs_encoder_update(encoder, settings);
|
|
|
|
obs_data_release(settings);
|
|
|
|
}
|
|
|
|
|
2015-02-10 19:27:37 -08:00
|
|
|
static void initialize_output(struct rtmp_common *service, json_t *root,
|
|
|
|
obs_encoder_t *video_encoder, obs_encoder_t *audio_encoder)
|
2014-06-16 21:31:36 -07:00
|
|
|
{
|
|
|
|
json_t *json_service = find_service(root, service->service);
|
|
|
|
json_t *recommended;
|
|
|
|
|
|
|
|
if (!json_service) {
|
|
|
|
blog(LOG_WARNING, "rtmp-common.c: [initialize_output] "
|
|
|
|
"Could not find service '%s'",
|
|
|
|
service->service);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
recommended = json_object_get(json_service, "recommended");
|
|
|
|
if (!recommended)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (video_encoder)
|
|
|
|
apply_video_encoder_settings(video_encoder, recommended);
|
|
|
|
if (audio_encoder)
|
|
|
|
apply_audio_encoder_settings(audio_encoder, recommended);
|
|
|
|
}
|
|
|
|
|
2015-02-10 19:27:37 -08:00
|
|
|
static void rtmp_common_apply_settings(void *data,
|
|
|
|
obs_encoder_t *video_encoder, obs_encoder_t *audio_encoder)
|
2014-06-16 21:31:36 -07:00
|
|
|
{
|
|
|
|
struct rtmp_common *service = data;
|
|
|
|
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
|
|
|
file = obs_module_file("services.json");
|
2014-06-16 21:31:36 -07:00
|
|
|
if (file) {
|
|
|
|
json_t *root = open_json_file(file);
|
|
|
|
if (root) {
|
2015-02-10 19:27:37 -08:00
|
|
|
initialize_output(service, root, video_encoder,
|
|
|
|
audio_encoder);
|
2014-06-16 21:31:36 -07:00
|
|
|
json_decref(root);
|
|
|
|
}
|
|
|
|
bfree(file);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-04-19 20:54:18 -07:00
|
|
|
static const char *rtmp_common_url(void *data)
|
|
|
|
{
|
|
|
|
struct rtmp_common *service = data;
|
|
|
|
return service->server;
|
|
|
|
}
|
|
|
|
|
|
|
|
static const char *rtmp_common_key(void *data)
|
|
|
|
{
|
|
|
|
struct rtmp_common *service = data;
|
|
|
|
return service->key;
|
|
|
|
}
|
|
|
|
|
|
|
|
struct obs_service_info rtmp_common_service = {
|
2014-08-04 21:27:52 -07:00
|
|
|
.id = "rtmp_common",
|
|
|
|
.get_name = rtmp_common_getname,
|
|
|
|
.create = rtmp_common_create,
|
|
|
|
.destroy = rtmp_common_destroy,
|
|
|
|
.update = rtmp_common_update,
|
|
|
|
.get_properties = rtmp_common_properties,
|
|
|
|
.get_url = rtmp_common_url,
|
2015-02-10 19:27:37 -08:00
|
|
|
.get_key = rtmp_common_key,
|
|
|
|
.apply_encoder_settings = rtmp_common_apply_settings,
|
2014-04-19 20:54:18 -07:00
|
|
|
};
|