Changes of Revision 52
obs-studio.changes
Changed
x
1
2
-------------------------------------------------------------------
3
+Fri Nov 17 22:46:45 UTC 2017 - jimmy@boombatower.com
4
+
5
+- Update to version 20.1.3:
6
+ * libobs: Update to version 20.1.3
7
+ * libobs: Fix FFmpeg constants
8
+ * libobs: Update to version 20.1.2
9
+ * libobs-d3d11: Allow rebuild even if output duplicator fails
10
+ * graphics-hook: blacklist OpenGL capture for "cm_client.exe"
11
+ * UI: Fix custom ffmpeg output file / URL entry
12
+ * linux-pulseaudio: Get correct default device
13
+ * libobs: Rename obs_video_thread to obs_graphics_thread
14
+ * libobs: Use new ffmpeg constants
15
+ * obs-ffmpeg: Use new ffmpeg constants
16
+ * deps/media-playback: Use new ffmpeg constants
17
+ * UI: Log when output timer events stop outputs
18
+
19
+-------------------------------------------------------------------
20
Thu Oct 26 05:22:23 UTC 2017 - jimmy@boombatower.com
21
22
- Update to version 20.1.1:
23
obs-studio.spec
Changed
8
1
2
Name: obs-studio
3
-Version: 20.1.1
4
+Version: 20.1.3
5
Release: 0
6
Summary: A recording/broadcasting program
7
Group: Productivity/Multimedia/Video/Editors and Convertors
8
_service
Changed
10
1
2
<services>
3
<service name="tar_scm" mode="disabled">
4
<param name="versionformat">@PARENT_TAG@</param>
5
- <param name="revision">refs/tags/20.1.1</param>
6
+ <param name="revision">refs/tags/20.1.3</param>
7
<param name="url">git://github.com/jp9000/obs-studio.git</param>
8
<param name="scm">git</param>
9
<param name="changesgenerate">enable</param>
10
_servicedata
Changed
9
1
2
<servicedata>
3
<service name="tar_scm">
4
<param name="url">git://github.com/jp9000/obs-studio.git</param>
5
- <param name="changesrevision">bf7561934ed098a4cf3c885f5e55febb23cac563</param>
6
+ <param name="changesrevision">350e7a76121937535d6e71ca61655c0fe810614c</param>
7
</service>
8
</servicedata>
9
obs-studio-20.1.1.tar.xz/UI/forms/OBSBasicSettings.ui -> obs-studio-20.1.3.tar.xz/UI/forms/OBSBasicSettings.ui
Changed
10
1
2
<item row="1" column="1">
3
<widget class="QStackedWidget" name="stackedWidget_2">
4
<property name="currentIndex">
5
- <number>1</number>
6
+ <number>0</number>
7
</property>
8
<widget class="QWidget" name="page_5">
9
<layout class="QHBoxLayout" name="horizontalLayout_12">
10
obs-studio-20.1.1.tar.xz/UI/frontend-plugins/frontend-tools/output-timer.cpp -> obs-studio-20.1.3.tar.xz/UI/frontend-plugins/frontend-tools/output-timer.cpp
Changed
15
1
2
3
void OutputTimer::EventStopStreaming()
4
{
5
+ blog(LOG_INFO, "Stopping stream due to OutputTimer timeout");
6
obs_frontend_streaming_stop();
7
}
8
9
void OutputTimer::EventStopRecording()
10
{
11
+ blog(LOG_INFO, "Stopping recording due to OutputTimer timeout");
12
obs_frontend_recording_stop();
13
}
14
15
obs-studio-20.1.1.tar.xz/deps/media-playback/media-playback/decode.c -> obs-studio-20.1.3.tar.xz/deps/media-playback/media-playback/decode.c
Changed
23
1
2
3
while (hwa) {
4
if (hwa->id == id) {
5
- if (hwa->pix_fmt == AV_PIX_FMT_VDA_VLD ||
6
- hwa->pix_fmt == AV_PIX_FMT_DXVA2_VLD ||
7
+ if (hwa->pix_fmt == AV_PIX_FMT_VIDEOTOOLBOX ||
8
+ hwa->pix_fmt == AV_PIX_FMT_DXVA2_VLD ||
9
hwa->pix_fmt == AV_PIX_FMT_VAAPI_VLD) {
10
c = avcodec_find_decoder_by_name(hwa->name);
11
if (c)
12
13
return false;
14
}
15
16
- if (d->codec->capabilities & CODEC_CAP_TRUNCATED)
17
- d->decoder->flags |= CODEC_FLAG_TRUNCATED;
18
+ if (d->codec->capabilities & CODEC_CAP_TRUNC)
19
+ d->decoder->flags |= CODEC_FLAG_TRUNC;
20
return true;
21
}
22
23
obs-studio-20.1.1.tar.xz/deps/media-playback/media-playback/decode.h -> obs-studio-20.1.3.tar.xz/deps/media-playback/media-playback/decode.h
Changed
16
1
2
#pragma warning(pop)
3
#endif
4
5
+#if LIBAVCODEC_VERSION_MAJOR >= 58
6
+#define CODEC_CAP_TRUNC AV_CODEC_CAP_TRUNCATED
7
+#define CODEC_FLAG_TRUNC AV_CODEC_FLAG_TRUNCATED
8
+#else
9
+#define CODEC_CAP_TRUNC CODEC_CAP_TRUNCATED
10
+#define CODEC_FLAG_TRUNC CODEC_FLAG_TRUNCATED
11
+#endif
12
+
13
struct mp_media;
14
15
struct mp_decode {
16
obs-studio-20.1.1.tar.xz/libobs-d3d11/d3d11-duplicator.cpp -> obs-studio-20.1.3.tar.xz/libobs-d3d11/d3d11-duplicator.cpp
Changed
12
1
2
ComPtr<IDXGIResource> res;
3
HRESULT hr;
4
5
+ if (!d->duplicator) {
6
+ return false;
7
+ }
8
+
9
hr = d->duplicator->AcquireNextFrame(0, &info, res.Assign());
10
if (hr == DXGI_ERROR_ACCESS_LOST) {
11
return false;
12
obs-studio-20.1.1.tar.xz/libobs-d3d11/d3d11-rebuild.cpp -> obs-studio-20.1.3.tar.xz/libobs-d3d11/d3d11-rebuild.cpp
Changed
14
1
2
((gs_pixel_shader*)obj)->Rebuild(dev);
3
break;
4
case gs_type::gs_duplicator:
5
- ((gs_duplicator*)obj)->Start();
6
+ try {
7
+ ((gs_duplicator*)obj)->Start();
8
+ } catch (...) {
9
+ ((gs_duplicator*)obj)->Release();
10
+ }
11
break;
12
case gs_type::gs_swap_chain:
13
((gs_swap_chain*)obj)->Rebuild(dev);
14
obs-studio-20.1.1.tar.xz/libobs/media-io/media-remux.c -> obs-studio-20.1.3.tar.xz/libobs/media-io/media-remux.c
Changed
23
1
2
#include <sys/types.h>
3
#include <sys/stat.h>
4
5
+#if LIBAVCODEC_VERSION_MAJOR >= 58
6
+#define CODEC_FLAG_GLOBAL_H AV_CODEC_FLAG_GLOBAL_HEADER
7
+#else
8
+#define CODEC_FLAG_GLOBAL_H CODEC_FLAG_GLOBAL_HEADER
9
+#endif
10
+
11
struct media_remux_job {
12
int64_t in_size;
13
AVFormatContext *ifmt_ctx, *ofmt_ctx;
14
15
16
out_stream->codec->codec_tag = 0;
17
if (job->ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER)
18
- out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
19
+ out_stream->codec->flags |= CODEC_FLAG_GLOBAL_H;
20
}
21
22
#ifndef _NDEBUG
23
obs-studio-20.1.1.tar.xz/libobs/obs-config.h -> obs-studio-20.1.3.tar.xz/libobs/obs-config.h
Changed
10
1
2
*
3
* Reset to zero each major or minor version
4
*/
5
-#define LIBOBS_API_PATCH_VER 1
6
+#define LIBOBS_API_PATCH_VER 3
7
8
#define MAKE_SEMANTIC_VERSION(major, minor, patch) \
9
((major << 24) | \
10
obs-studio-20.1.1.tar.xz/libobs/obs-ffmpeg-compat.h -> obs-studio-20.1.3.tar.xz/libobs/obs-ffmpeg-compat.h
Changed
14
1
2
# define av_frame_free avcodec_free_frame
3
#endif
4
5
+#if LIBAVCODEC_VERSION_MAJOR >= 58
6
+#define CODEC_CAP_TRUNC AV_CODEC_CAP_TRUNCATED
7
+#define CODEC_FLAG_TRUNC AV_CODEC_FLAG_TRUNCATED
8
+#define INPUT_BUFFER_PADDING_SIZE AV_INPUT_BUFFER_PADDING_SIZE
9
+#else
10
+#define CODEC_CAP_TRUNC CODEC_CAP_TRUNCATED
11
+#define CODEC_FLAG_TRUNC CODEC_FLAG_TRUNCATED
12
+#define INPUT_BUFFER_PADDING_SIZE FF_INPUT_BUFFER_PADDING_SIZE
13
+#endif
14
obs-studio-20.1.1.tar.xz/libobs/obs-internal.h -> obs-studio-20.1.3.tar.xz/libobs/obs-internal.h
Changed
10
1
2
3
extern struct obs_core *obs;
4
5
-extern void *obs_video_thread(void *param);
6
+extern void *obs_graphics_thread(void *param);
7
8
extern gs_effect_t *obs_load_effect(gs_effect_t **effect, const char *file);
9
10
obs-studio-20.1.1.tar.xz/libobs/obs-video.c -> obs-studio-20.1.3.tar.xz/libobs/obs-video.c
Changed
19
1
2
static const char *tick_sources_name = "tick_sources";
3
static const char *render_displays_name = "render_displays";
4
static const char *output_frame_name = "output_frame";
5
-void *obs_video_thread(void *param)
6
+void *obs_graphics_thread(void *param)
7
{
8
uint64_t last_time = 0;
9
uint64_t interval = video_output_get_frame_time(obs->video.video);
10
11
12
const char *video_thread_name =
13
profile_store_name(obs_get_profiler_name_store(),
14
- "obs_video_thread(%g"NBSP"ms)", interval / 1000000.);
15
+ "obs_graphics_thread(%g"NBSP"ms)", interval / 1000000.);
16
profile_register_root(video_thread_name, interval);
17
18
srand((unsigned int)time(NULL));
19
obs-studio-20.1.1.tar.xz/libobs/obs.c -> obs-studio-20.1.3.tar.xz/libobs/obs.c
Changed
10
1
2
gs_leave_context();
3
4
errorcode = pthread_create(&video->video_thread, NULL,
5
- obs_video_thread, obs);
6
+ obs_graphics_thread, obs);
7
if (errorcode != 0)
8
return OBS_VIDEO_FAIL;
9
10
obs-studio-20.1.1.tar.xz/plugins/linux-pulseaudio/pulse-input.c -> obs-studio-20.1.3.tar.xz/plugins/linux-pulseaudio/pulse-input.c
Changed
171
1
2
3
/* user settings */
4
char *device;
5
+ bool input;
6
7
/* server info */
8
enum speaker_layout speakers;
9
10
void *userdata)
11
{
12
UNUSED_PARAMETER(c);
13
- UNUSED_PARAMETER(userdata);
14
+ PULSE_DATA(userdata);
15
16
blog(LOG_INFO, "Server name: '%s %s'",
17
i->server_name, i->server_version);
18
19
+ if (data->device && strcmp("default", data->device) == 0) {
20
+ if (data->input) {
21
+ bfree(data->device);
22
+ data->device = bstrdup(i->default_source_name);
23
+
24
+ blog(LOG_DEBUG, "Default input device: '%s'", data->device);
25
+ } else {
26
+ char *monitor = bzalloc(strlen(i->default_sink_name) + 9);
27
+ strcat(monitor, i->default_sink_name);
28
+ strcat(monitor, ".monitor");
29
+
30
+ bfree(data->device);
31
+ data->device = bstrdup(monitor);
32
+
33
+ blog(LOG_DEBUG, "Default output device: '%s'", data->device);
34
+ bfree(monitor);
35
+ }
36
+ }
37
+
38
pulse_signal(0);
39
}
40
41
42
pulse_get_sink_info_list(pulse_output_info, (void *) devices);
43
pulse_unref();
44
45
+ size_t count = obs_property_list_item_count(devices);
46
+
47
+ if (count > 0)
48
+ obs_property_list_insert_string(devices, 0,
49
+ obs_module_text("Default"), "default");
50
+
51
return props;
52
}
53
54
55
}
56
57
/**
58
- * Server info callback
59
- */
60
-static void pulse_input_device(pa_context *c, const pa_server_info *i,
61
- void *userdata)
62
-{
63
- UNUSED_PARAMETER(c);
64
- obs_data_t *settings = (obs_data_t*) userdata;
65
-
66
- obs_data_set_default_string(settings, "device_id",
67
- i->default_source_name);
68
- blog(LOG_DEBUG, "Default input device: '%s'", i->default_source_name);
69
-
70
- pulse_signal(0);
71
-}
72
-
73
-static void pulse_output_device(pa_context *c, const pa_server_info *i,
74
- void *userdata)
75
-{
76
- UNUSED_PARAMETER(c);
77
- obs_data_t *settings = (obs_data_t*) userdata;
78
-
79
- char *monitor = bzalloc(strlen(i->default_sink_name) + 9);
80
- strcat(monitor, i->default_sink_name);
81
- strcat(monitor, ".monitor");
82
-
83
- obs_data_set_default_string(settings, "device_id", monitor);
84
- blog(LOG_DEBUG, "Default output device: '%s'", monitor);
85
- bfree(monitor);
86
-
87
- pulse_signal(0);
88
-}
89
-
90
-/**
91
* Get plugin defaults
92
*/
93
-static void pulse_defaults(obs_data_t *settings, bool input)
94
+static void pulse_defaults(obs_data_t *settings)
95
{
96
- pulse_init();
97
-
98
- pa_server_info_cb_t cb = (input)
99
- ? pulse_input_device : pulse_output_device;
100
- pulse_get_server_info(cb, (void *) settings);
101
-
102
- pulse_unref();
103
-}
104
-
105
-static void pulse_input_defaults(obs_data_t *settings)
106
-{
107
- return pulse_defaults(settings, true);
108
-}
109
-
110
-static void pulse_output_defaults(obs_data_t *settings)
111
-{
112
- return pulse_defaults(settings, false);
113
+ obs_data_set_default_string(settings, "device_id", "default");
114
}
115
116
/**
117
118
/**
119
* Create the plugin object
120
*/
121
-static void *pulse_create(obs_data_t *settings, obs_source_t *source)
122
+static void *pulse_create(obs_data_t *settings, obs_source_t *source, bool input)
123
{
124
struct pulse_data *data = bzalloc(sizeof(struct pulse_data));
125
126
+ data->input = input;
127
data->source = source;
128
129
pulse_init();
130
131
return data;
132
}
133
134
+static void *pulse_input_create(obs_data_t *settings, obs_source_t *source)
135
+{
136
+ return pulse_create(settings, source, true);
137
+}
138
+
139
+static void *pulse_output_create(obs_data_t *settings, obs_source_t *source)
140
+{
141
+ return pulse_create(settings, source, false);
142
+}
143
+
144
struct obs_source_info pulse_input_capture = {
145
.id = "pulse_input_capture",
146
.type = OBS_SOURCE_TYPE_INPUT,
147
.output_flags = OBS_SOURCE_AUDIO |
148
OBS_SOURCE_DO_NOT_DUPLICATE,
149
.get_name = pulse_input_getname,
150
- .create = pulse_create,
151
+ .create = pulse_input_create,
152
.destroy = pulse_destroy,
153
.update = pulse_update,
154
- .get_defaults = pulse_input_defaults,
155
+ .get_defaults = pulse_defaults,
156
.get_properties = pulse_input_properties
157
};
158
159
160
OBS_SOURCE_DO_NOT_DUPLICATE |
161
OBS_SOURCE_DO_NOT_SELF_MONITOR,
162
.get_name = pulse_output_getname,
163
- .create = pulse_create,
164
+ .create = pulse_output_create,
165
.destroy = pulse_destroy,
166
.update = pulse_update,
167
- .get_defaults = pulse_output_defaults,
168
+ .get_defaults = pulse_defaults,
169
.get_properties = pulse_output_properties
170
};
171
obs-studio-20.1.1.tar.xz/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c -> obs-studio-20.1.3.tar.xz/plugins/obs-ffmpeg/ffmpeg-mux/ffmpeg-mux.c
Changed
32
1
2
3
#include <libavformat/avformat.h>
4
5
+#if LIBAVCODEC_VERSION_MAJOR >= 58
6
+#define CODEC_FLAG_GLOBAL_H AV_CODEC_FLAG_GLOBAL_HEADER
7
+#else
8
+#define CODEC_FLAG_GLOBAL_H CODEC_FLAG_GLOBAL_HEADER
9
+#endif
10
+
11
/* ------------------------------------------------------------------------- */
12
13
struct resize_buf {
14
15
ffm->video_stream->time_base = context->time_base;
16
17
if (ffm->output->oformat->flags & AVFMT_GLOBALHEADER)
18
- context->flags |= CODEC_FLAG_GLOBAL_HEADER;
19
+ context->flags |= CODEC_FLAG_GLOBAL_H;
20
}
21
22
static void create_audio_stream(struct ffmpeg_mux *ffm, int idx)
23
24
av_get_default_channel_layout(context->channels);
25
26
if (ffm->output->oformat->flags & AVFMT_GLOBALHEADER)
27
- context->flags |= CODEC_FLAG_GLOBAL_HEADER;
28
+ context->flags |= CODEC_FLAG_GLOBAL_H;
29
30
ffm->num_audio_streams++;
31
}
32
obs-studio-20.1.1.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-audio-encoders.c -> obs-studio-20.1.3.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-audio-encoders.c
Changed
10
1
2
/* enable experimental FFmpeg encoder if the only one available */
3
enc->context->strict_std_compliance = -2;
4
5
- enc->context->flags = CODEC_FLAG_GLOBAL_HEADER;
6
+ enc->context->flags = CODEC_FLAG_GLOBAL_H;
7
8
if (initialize_codec(enc))
9
return enc;
10
obs-studio-20.1.1.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-compat.h -> obs-studio-20.1.3.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-compat.h
Changed
15
1
2
#if LIBAVCODEC_VERSION_MAJOR >= 57
3
#define av_free_packet av_packet_unref
4
#endif
5
+
6
+#if LIBAVCODEC_VERSION_MAJOR >= 58
7
+#define CODEC_CAP_TRUNC AV_CODEC_CAP_TRUNCATED
8
+#define CODEC_FLAG_TRUNC AV_CODEC_FLAG_TRUNCATED
9
+#define CODEC_FLAG_GLOBAL_H AV_CODEC_FLAG_GLOBAL_HEADER
10
+#else
11
+#define CODEC_CAP_TRUNC CODEC_CAP_TRUNCATED
12
+#define CODEC_FLAG_TRUNC CODEC_FLAG_TRUNCATED
13
+#define CODEC_FLAG_GLOBAL_H CODEC_FLAG_GLOBAL_HEADER
14
+#endif
15
obs-studio-20.1.1.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-output.c -> obs-studio-20.1.3.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-output.c
Changed
28
1
2
data->video->time_base = context->time_base;
3
4
if (data->output->oformat->flags & AVFMT_GLOBALHEADER)
5
- context->flags |= CODEC_FLAG_GLOBAL_HEADER;
6
+ context->flags |= CODEC_FLAG_GLOBAL_H;
7
8
if (!open_video_codec(data))
9
return false;
10
11
data->audio_size = get_audio_size(data->audio_format, aoi.speakers, 1);
12
13
if (data->output->oformat->flags & AVFMT_GLOBALHEADER)
14
- context->flags |= CODEC_FLAG_GLOBAL_HEADER;
15
+ context->flags |= CODEC_FLAG_GLOBAL_H;
16
17
return open_audio_codec(data);
18
}
19
20
else
21
copy_data(&data->dst_picture, frame, context->height, context->pix_fmt);
22
23
- if (data->output->flags & AVFMT_RAWPICTURE) {
24
+ if (data->output->flags) {
25
packet.flags |= AV_PKT_FLAG_KEY;
26
packet.stream_index = data->video->index;
27
packet.data = data->dst_picture.data[0];
28
obs-studio-20.1.1.tar.xz/plugins/win-capture/graphics-hook/gl-capture.c -> obs-studio-20.1.3.tar.xz/plugins/win-capture/graphics-hook/gl-capture.c
Changed
11
1
2
/* "life is feudal: your own" somehow uses both opengl and directx at
3
* the same time, so blacklist it from capturing opengl */
4
const char *process_name = get_process_name();
5
- if (_strcmpi(process_name, "yo_cm_client.exe") == 0) {
6
+ if (_strcmpi(process_name, "yo_cm_client.exe") == 0 ||
7
+ _strcmpi(process_name, "cm_client.exe") == 0) {
8
hlog("Ignoring opengl for game: %s", process_name);
9
return true;
10
}
11
obs-studio-20.1.1.tar.xz/plugins/win-dshow/ffmpeg-decode.c -> obs-studio-20.1.3.tar.xz/plugins/win-dshow/ffmpeg-decode.c
Changed
38
1
2
******************************************************************************/
3
4
#include "ffmpeg-decode.h"
5
+#include "obs-ffmpeg-compat.h"
6
#include <obs-avc.h>
7
8
int ffmpeg_decode_init(struct ffmpeg_decode *decode, enum AVCodecID id)
9
10
return ret;
11
}
12
13
- if (decode->codec->capabilities & CODEC_CAP_TRUNCATED)
14
- decode->decoder->flags |= CODEC_FLAG_TRUNCATED;
15
+ if (decode->codec->capabilities & CODEC_CAP_TRUNC)
16
+ decode->decoder->flags |= CODEC_FLAG_TRUNC;
17
18
return 0;
19
}
20
21
static inline void copy_data(struct ffmpeg_decode *decode, uint8_t *data,
22
size_t size)
23
{
24
- size_t new_size = size + FF_INPUT_BUFFER_PADDING_SIZE;
25
+ size_t new_size = size + INPUT_BUFFER_PADDING_SIZE;
26
27
if (decode->packet_size < new_size) {
28
decode->packet_buffer = brealloc(decode->packet_buffer,
29
30
decode->packet_size = new_size;
31
}
32
33
- memset(decode->packet_buffer + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
34
+ memset(decode->packet_buffer + size, 0, INPUT_BUFFER_PADDING_SIZE);
35
memcpy(decode->packet_buffer, data, size);
36
}
37
38