Changes of Revision 7
obs-studio.changes
Changed
x
1
2
-------------------------------------------------------------------
3
+Thu Feb 12 07:15:19 UTC 2015 - jimmy@boombatower.com
4
+
5
+- Update to 0.8.2 release.
6
+ https://github.com/jp9000/obs-studio/releases/tag/0.8.2
7
+ https://github.com/jp9000/obs-studio/releases/tag/0.8.1
8
+ https://github.com/jp9000/obs-studio/releases/tag/0.8.0
9
+
10
+-------------------------------------------------------------------
11
Thu Jan 15 11:05:44 UTC 2015 - jimmy@boombatower.com
12
13
- Update to 0.7.3 release.
14
obs-studio.spec
Changed
34
1
2
Name: obs-studio
3
-Version: 0.7.3+git20150114.d54b3cc
4
+Version: 0.8.2+git20150211.6099c65
5
Release: 0
6
Summary: A recording/broadcasting program
7
8
9
License: GPL-2.0
10
URL: https://obsproject.com/
11
Source: %{name}-%{version}.tar.xz
12
-# PATCH-FIX-OPENSUSE obs-studio-allow-OBS_VERSION-to-be-set.patch jimmy@boombatower.com -- Allow OBS_VERSION to be set to assist in packaging.
13
-Patch0: obs-studio-allow-OBS_VERSION-to-be-set.patch
14
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-build
15
16
BuildRequires: cmake
17
18
19
%prep
20
%setup -q
21
-%patch0 -p1
22
23
%build
24
mkdir -p build && cd build
25
26
cmake \
27
-DUNIX_STRUCTURE=1 \
28
-DCMAKE_INSTALL_PREFIX=/usr \
29
- -DOBS_VERSION="%{version}" \
30
+ -DOBS_VERSION_OVERRIDE="%{version}" \
31
..
32
33
%install
34
obs-studio-allow-OBS_VERSION-to-be-set.patch
Deleted
47
1
2
-From 0245e3b43ed3c48871522cd7720b78673415ddb8 Mon Sep 17 00:00:00 2001
3
-From: Jimmy Berry <jimmy@boombatower.com>
4
-Date: Fri, 30 Jan 2015 14:04:54 -0600
5
-Subject: [PATCH] Allow OBS_VERSION to be set to assist in packaging.
6
-
7
----
8
- cmake/Modules/ObsCpack.cmake | 20 +++++++++++++-------
9
- 1 file changed, 13 insertions(+), 7 deletions(-)
10
-
11
-diff --git a/cmake/Modules/ObsCpack.cmake b/cmake/Modules/ObsCpack.cmake
12
-index cb5e85a..6de6019 100644
13
---- a/cmake/Modules/ObsCpack.cmake
14
-+++ b/cmake/Modules/ObsCpack.cmake
15
-@@ -14,15 +14,21 @@ set(CPACK_PACKAGE_VERSION_MINOR "0")
16
- set(CPACK_PACKAGE_VERSION_PATCH "1")
17
- set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
18
-
19
--if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
20
-- execute_process(COMMAND git describe --always --tags --dirty=-modified
21
-- OUTPUT_VARIABLE OBS_VERSION
22
-- WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
23
-- OUTPUT_STRIP_TRAILING_WHITESPACE)
24
--else()
25
-- set(OBS_VERSION "${CPACK_PACKAGE_VERSION}")
26
-+if(NOT DEFINED OBS_VERSION)
27
-+ if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
28
-+ execute_process(COMMAND git describe --always --tags --dirty=-modified
29
-+ OUTPUT_VARIABLE OBS_VERSION
30
-+ WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
31
-+ OUTPUT_STRIP_TRAILING_WHITESPACE)
32
-+ endif()
33
-+
34
-+ # Fallback to static version when git is either not available or fails.
35
-+ if("${OBS_VERSION}" STREQUAL "")
36
-+ set(OBS_VERSION "${CPACK_PACKAGE_VERSION}")
37
-+ endif()
38
- endif()
39
-
40
-+MESSAGE(STATUS "OBS_VERSION: ${OBS_VERSION}")
41
-
42
- if(INSTALLER_RUN)
43
- set(CPACK_PACKAGE_EXECUTABLES
44
---
45
-2.1.4
46
-
47
_service
Changed
10
1
2
<services>
3
<service name="tar_scm" mode="disabled">
4
<param name="versionformat">@PARENT_TAG@+git%cd.%h</param>
5
- <param name="revision">refs/tags/0.7.3</param>
6
+ <param name="revision">refs/tags/0.8.2</param>
7
<param name="url">git://github.com/jp9000/obs-studio.git</param>
8
<param name="scm">git</param>
9
</service>
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs-d3d11/mingw
Deleted
2
1
-(directory)
2
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs-d3d11/mingw/dxgi.h
Deleted
2715
1
2
-/*** Autogenerated by WIDL 1.5.25 from direct-x/include/dxgi.idl - Do not edit ***/
3
-
4
-#ifndef __REQUIRED_RPCNDR_H_VERSION__
5
-#define __REQUIRED_RPCNDR_H_VERSION__ 475
6
-#endif
7
-
8
-#include <rpc.h>
9
-#include <rpcndr.h>
10
-
11
-#ifndef COM_NO_WINDOWS_H
12
-#include <windows.h>
13
-#include <ole2.h>
14
-#endif
15
-
16
-#ifndef __dxgi_h__
17
-#define __dxgi_h__
18
-
19
-/* Forward declarations */
20
-
21
-#ifndef __IDXGIObject_FWD_DEFINED__
22
-#define __IDXGIObject_FWD_DEFINED__
23
-typedef interface IDXGIObject IDXGIObject;
24
-#endif
25
-
26
-#ifndef __IDXGIDeviceSubObject_FWD_DEFINED__
27
-#define __IDXGIDeviceSubObject_FWD_DEFINED__
28
-typedef interface IDXGIDeviceSubObject IDXGIDeviceSubObject;
29
-#endif
30
-
31
-#ifndef __IDXGIResource_FWD_DEFINED__
32
-#define __IDXGIResource_FWD_DEFINED__
33
-typedef interface IDXGIResource IDXGIResource;
34
-#endif
35
-
36
-#ifndef __IDXGIKeyedMutex_FWD_DEFINED__
37
-#define __IDXGIKeyedMutex_FWD_DEFINED__
38
-typedef interface IDXGIKeyedMutex IDXGIKeyedMutex;
39
-#endif
40
-
41
-#ifndef __IDXGISurface_FWD_DEFINED__
42
-#define __IDXGISurface_FWD_DEFINED__
43
-typedef interface IDXGISurface IDXGISurface;
44
-#endif
45
-
46
-#ifndef __IDXGISurface1_FWD_DEFINED__
47
-#define __IDXGISurface1_FWD_DEFINED__
48
-typedef interface IDXGISurface1 IDXGISurface1;
49
-#endif
50
-
51
-#ifndef __IDXGIOutput_FWD_DEFINED__
52
-#define __IDXGIOutput_FWD_DEFINED__
53
-typedef interface IDXGIOutput IDXGIOutput;
54
-#endif
55
-
56
-#ifndef __IDXGIAdapter_FWD_DEFINED__
57
-#define __IDXGIAdapter_FWD_DEFINED__
58
-typedef interface IDXGIAdapter IDXGIAdapter;
59
-#endif
60
-
61
-#ifndef __IDXGISwapChain_FWD_DEFINED__
62
-#define __IDXGISwapChain_FWD_DEFINED__
63
-typedef interface IDXGISwapChain IDXGISwapChain;
64
-#endif
65
-
66
-#ifndef __IDXGIFactory_FWD_DEFINED__
67
-#define __IDXGIFactory_FWD_DEFINED__
68
-typedef interface IDXGIFactory IDXGIFactory;
69
-#endif
70
-
71
-#ifndef __IDXGIDevice_FWD_DEFINED__
72
-#define __IDXGIDevice_FWD_DEFINED__
73
-typedef interface IDXGIDevice IDXGIDevice;
74
-#endif
75
-
76
-#ifndef __IDXGIAdapter1_FWD_DEFINED__
77
-#define __IDXGIAdapter1_FWD_DEFINED__
78
-typedef interface IDXGIAdapter1 IDXGIAdapter1;
79
-#endif
80
-
81
-#ifndef __IDXGIFactory1_FWD_DEFINED__
82
-#define __IDXGIFactory1_FWD_DEFINED__
83
-typedef interface IDXGIFactory1 IDXGIFactory1;
84
-#endif
85
-
86
-/* Headers for imported files */
87
-
88
-#include <oaidl.h>
89
-#include <ocidl.h>
90
-#include <dxgitype.h>
91
-
92
-#ifdef __cplusplus
93
-extern "C" {
94
-#endif
95
-
96
-#define _FACDXGI (0x87a)
97
-
98
-#define MAKE_DXGI_STATUS(x) MAKE_HRESULT(0, _FACDXGI, x)
99
-#define DXGI_STATUS_OCCLUDED MAKE_DXGI_STATUS(1)
100
-#define DXGI_STATUS_CLIPPED MAKE_DXGI_STATUS(2)
101
-#define DXGI_STATUS_NO_REDIRECTION MAKE_DXGI_STATUS(4)
102
-#define DXGI_STATUS_NO_DESKTOP_ACCESS MAKE_DXGI_STATUS(5)
103
-#define DXGI_STATUS_GRAPHICS_VIDPN_SOURCE_IN_USE MAKE_DXGI_STATUS(6)
104
-#define DXGI_STATUS_MODE_CHANGED MAKE_DXGI_STATUS(7)
105
-#define DXGI_STATUS_MODE_CHANGE_IN_PROGRESS MAKE_DXGI_STATUS(8)
106
-#define MAKE_DXGI_HRESULT(x) MAKE_HRESULT(1, _FACDXGI, x)
107
-#define DXGI_ERROR_INVALID_CALL MAKE_DXGI_HRESULT(1)
108
-#define DXGI_ERROR_NOT_FOUND MAKE_DXGI_HRESULT(2)
109
-#define DXGI_ERROR_MORE_DATA MAKE_DXGI_HRESULT(3)
110
-#define DXGI_ERROR_UNSUPPORTED MAKE_DXGI_HRESULT(4)
111
-#define DXGI_ERROR_DEVICE_REMOVED MAKE_DXGI_HRESULT(5)
112
-#define DXGI_ERROR_DEVICE_HUNG MAKE_DXGI_HRESULT(6)
113
-#define DXGI_ERROR_DEVICE_RESET MAKE_DXGI_HRESULT(7)
114
-#define DXGI_ERROR_WAS_STILL_DRAWING MAKE_DXGI_HRESULT(10)
115
-#define DXGI_ERROR_FRAME_STATISTICS_DISJOINT MAKE_DXGI_HRESULT(11)
116
-#define DXGI_ERROR_GRAPHICS_VIDPN_SOURCE_IN_USE MAKE_DXGI_HRESULT(12)
117
-#define DXGI_ERROR_DRIVER_INTERNAL_ERROR MAKE_DXGI_HRESULT(32)
118
-#define DXGI_ERROR_NONEXCLUSIVE MAKE_DXGI_HRESULT(33)
119
-#define DXGI_ERROR_NOT_CURRENTLY_AVAILABLE MAKE_DXGI_HRESULT(34)
120
-#if 0
121
-typedef HANDLE HMONITOR;
122
-typedef struct _LUID {
123
- DWORD LowPart;
124
- LONG HighPart;
125
-} LUID;
126
-typedef struct _LUID *PLUID;
127
-#endif
128
-typedef UINT DXGI_USAGE;
129
-#define DXGI_USAGE_SHADER_INPUT (0x10)
130
-
131
-#define DXGI_USAGE_RENDER_TARGET_OUTPUT (0x20)
132
-
133
-#define DXGI_USAGE_BACK_BUFFER (0x40)
134
-
135
-#define DXGI_USAGE_SHARED (0x80)
136
-
137
-#define DXGI_USAGE_READ_ONLY (0x100)
138
-
139
-#define DXGI_ENUM_MODES_INTERLACED (1)
140
-
141
-#define DXGI_ENUM_MODES_SCALING (2)
142
-
143
-typedef enum DXGI_SWAP_EFFECT {
144
- DXGI_SWAP_EFFECT_DISCARD = 0,
145
- DXGI_SWAP_EFFECT_SEQUENTIAL = 1
146
-} DXGI_SWAP_EFFECT;
147
-typedef enum DXGI_RESIDENCY {
148
- DXGI_RESIDENCY_FULLY_RESIDENT = 1,
149
- DXGI_RESIDENCY_RESIDENT_IN_SHARED_MEMORY = 2,
150
- DXGI_RESIDENCY_EVICTED_TO_DISK = 3
151
-} DXGI_RESIDENCY;
152
-typedef struct DXGI_SURFACE_DESC {
153
- UINT Width;
154
- UINT Height;
155
- DXGI_FORMAT Format;
156
- DXGI_SAMPLE_DESC SampleDesc;
157
-} DXGI_SURFACE_DESC;
158
-typedef struct DXGI_MAPPED_RECT {
159
- INT Pitch;
160
- BYTE *pBits;
161
-} DXGI_MAPPED_RECT;
162
-typedef struct DXGI_OUTPUT_DESC {
163
- WCHAR DeviceName[32];
164
- RECT DesktopCoordinates;
165
- WINBOOL AttachedToDesktop;
166
- DXGI_MODE_ROTATION Rotation;
167
- HMONITOR Monitor;
168
-} DXGI_OUTPUT_DESC;
169
-typedef struct DXGI_FRAME_STATISTICS {
170
- UINT PresentCount;
171
- UINT PresentRefreshCount;
172
- UINT SyncRefreshCount;
173
- LARGE_INTEGER SyncQPCTime;
174
- LARGE_INTEGER SyncGPUTime;
175
-} DXGI_FRAME_STATISTICS;
176
-typedef struct DXGI_ADAPTER_DESC {
177
- WCHAR Description[128];
178
- UINT VendorId;
179
- UINT DeviceId;
180
- UINT SubSysId;
181
- UINT Revision;
182
- SIZE_T DedicatedVideoMemory;
183
- SIZE_T DedicatedSystemMemory;
184
- SIZE_T SharedSystemMemory;
185
- LUID AdapterLuid;
186
-} DXGI_ADAPTER_DESC;
187
-typedef enum DXGI_SWAP_CHAIN_FLAG {
188
- DXGI_SWAP_CHAIN_FLAG_NONPREROTATED = 1,
189
- DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH = 2,
190
- DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE = 4
191
-} DXGI_SWAP_CHAIN_FLAG;
192
-typedef struct DXGI_SWAP_CHAIN_DESC {
193
- DXGI_MODE_DESC BufferDesc;
194
- DXGI_SAMPLE_DESC SampleDesc;
195
- DXGI_USAGE BufferUsage;
196
- UINT BufferCount;
197
- HWND OutputWindow;
198
- WINBOOL Windowed;
199
- DXGI_SWAP_EFFECT SwapEffect;
200
- UINT Flags;
201
-} DXGI_SWAP_CHAIN_DESC;
202
-typedef struct DXGI_SHARED_RESOURCE {
203
- HANDLE Handle;
204
-} DXGI_SHARED_RESOURCE;
205
-/*****************************************************************************
206
- * IDXGIObject interface
207
- */
208
-#ifndef __IDXGIObject_INTERFACE_DEFINED__
209
-#define __IDXGIObject_INTERFACE_DEFINED__
210
-
211
-DEFINE_GUID(IID_IDXGIObject, 0xaec22fb8, 0x76f3, 0x4639, 0x9b,0xe0, 0x28,0xeb,0x43,0xa6,0x7a,0x2e);
212
-#if defined(__cplusplus) && !defined(CINTERFACE)
213
-MIDL_INTERFACE("aec22fb8-76f3-4639-9be0-28eb43a67a2e")
214
-IDXGIObject : public IUnknown
215
-{
216
- virtual HRESULT STDMETHODCALLTYPE SetPrivateData(
217
- REFGUID guid,
218
- UINT data_size,
219
- const void *data) = 0;
220
-
221
- virtual HRESULT STDMETHODCALLTYPE SetPrivateDataInterface(
222
- REFGUID guid,
223
- const IUnknown *object) = 0;
224
-
225
- virtual HRESULT STDMETHODCALLTYPE GetPrivateData(
226
- REFGUID guid,
227
- UINT *data_size,
228
- void *data) = 0;
229
-
230
- virtual HRESULT STDMETHODCALLTYPE GetParent(
231
- REFIID riid,
232
- void **parent) = 0;
233
-
234
-};
235
-#ifdef __CRT_UUID_DECL
236
-__CRT_UUID_DECL(IDXGIObject, 0xaec22fb8, 0x76f3, 0x4639, 0x9b,0xe0, 0x28,0xeb,0x43,0xa6,0x7a,0x2e)
237
-#endif
238
-#else
239
-typedef struct IDXGIObjectVtbl {
240
- BEGIN_INTERFACE
241
-
242
- /*** IUnknown methods ***/
243
- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
244
- IDXGIObject* This,
245
- REFIID riid,
246
- void **ppvObject);
247
-
248
- ULONG (STDMETHODCALLTYPE *AddRef)(
249
- IDXGIObject* This);
250
-
251
- ULONG (STDMETHODCALLTYPE *Release)(
252
- IDXGIObject* This);
253
-
254
- /*** IDXGIObject methods ***/
255
- HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
256
- IDXGIObject* This,
257
- REFGUID guid,
258
- UINT data_size,
259
- const void *data);
260
-
261
- HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
262
- IDXGIObject* This,
263
- REFGUID guid,
264
- const IUnknown *object);
265
-
266
- HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
267
- IDXGIObject* This,
268
- REFGUID guid,
269
- UINT *data_size,
270
- void *data);
271
-
272
- HRESULT (STDMETHODCALLTYPE *GetParent)(
273
- IDXGIObject* This,
274
- REFIID riid,
275
- void **parent);
276
-
277
- END_INTERFACE
278
-} IDXGIObjectVtbl;
279
-interface IDXGIObject {
280
- CONST_VTBL IDXGIObjectVtbl* lpVtbl;
281
-};
282
-
283
-#ifdef COBJMACROS
284
-#ifndef WIDL_C_INLINE_WRAPPERS
285
-/*** IUnknown methods ***/
286
-#define IDXGIObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
287
-#define IDXGIObject_AddRef(This) (This)->lpVtbl->AddRef(This)
288
-#define IDXGIObject_Release(This) (This)->lpVtbl->Release(This)
289
-/*** IDXGIObject methods ***/
290
-#define IDXGIObject_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
291
-#define IDXGIObject_SetPrivateDataInterface(This,guid,object) (This)->lpVtbl->SetPrivateDataInterface(This,guid,object)
292
-#define IDXGIObject_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
293
-#define IDXGIObject_GetParent(This,riid,parent) (This)->lpVtbl->GetParent(This,riid,parent)
294
-#else
295
-/*** IUnknown methods ***/
296
-static FORCEINLINE HRESULT IDXGIObject_QueryInterface(IDXGIObject* This,REFIID riid,void **ppvObject) {
297
- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
298
-}
299
-static FORCEINLINE ULONG IDXGIObject_AddRef(IDXGIObject* This) {
300
- return This->lpVtbl->AddRef(This);
301
-}
302
-static FORCEINLINE ULONG IDXGIObject_Release(IDXGIObject* This) {
303
- return This->lpVtbl->Release(This);
304
-}
305
-/*** IDXGIObject methods ***/
306
-static FORCEINLINE HRESULT IDXGIObject_SetPrivateData(IDXGIObject* This,REFGUID guid,UINT data_size,const void *data) {
307
- return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
308
-}
309
-static FORCEINLINE HRESULT IDXGIObject_SetPrivateDataInterface(IDXGIObject* This,REFGUID guid,const IUnknown *object) {
310
- return This->lpVtbl->SetPrivateDataInterface(This,guid,object);
311
-}
312
-static FORCEINLINE HRESULT IDXGIObject_GetPrivateData(IDXGIObject* This,REFGUID guid,UINT *data_size,void *data) {
313
- return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
314
-}
315
-static FORCEINLINE HRESULT IDXGIObject_GetParent(IDXGIObject* This,REFIID riid,void **parent) {
316
- return This->lpVtbl->GetParent(This,riid,parent);
317
-}
318
-#endif
319
-#endif
320
-
321
-#endif
322
-
323
-HRESULT STDMETHODCALLTYPE IDXGIObject_SetPrivateData_Proxy(
324
- IDXGIObject* This,
325
- REFGUID guid,
326
- UINT data_size,
327
- const void *data);
328
-void __RPC_STUB IDXGIObject_SetPrivateData_Stub(
329
- IRpcStubBuffer* This,
330
- IRpcChannelBuffer* pRpcChannelBuffer,
331
- PRPC_MESSAGE pRpcMessage,
332
- DWORD* pdwStubPhase);
333
-HRESULT STDMETHODCALLTYPE IDXGIObject_SetPrivateDataInterface_Proxy(
334
- IDXGIObject* This,
335
- REFGUID guid,
336
- const IUnknown *object);
337
-void __RPC_STUB IDXGIObject_SetPrivateDataInterface_Stub(
338
- IRpcStubBuffer* This,
339
- IRpcChannelBuffer* pRpcChannelBuffer,
340
- PRPC_MESSAGE pRpcMessage,
341
- DWORD* pdwStubPhase);
342
-HRESULT STDMETHODCALLTYPE IDXGIObject_GetPrivateData_Proxy(
343
- IDXGIObject* This,
344
- REFGUID guid,
345
- UINT *data_size,
346
- void *data);
347
-void __RPC_STUB IDXGIObject_GetPrivateData_Stub(
348
- IRpcStubBuffer* This,
349
- IRpcChannelBuffer* pRpcChannelBuffer,
350
- PRPC_MESSAGE pRpcMessage,
351
- DWORD* pdwStubPhase);
352
-HRESULT STDMETHODCALLTYPE IDXGIObject_GetParent_Proxy(
353
- IDXGIObject* This,
354
- REFIID riid,
355
- void **parent);
356
-void __RPC_STUB IDXGIObject_GetParent_Stub(
357
- IRpcStubBuffer* This,
358
- IRpcChannelBuffer* pRpcChannelBuffer,
359
- PRPC_MESSAGE pRpcMessage,
360
- DWORD* pdwStubPhase);
361
-
362
-#endif /* __IDXGIObject_INTERFACE_DEFINED__ */
363
-
364
-/*****************************************************************************
365
- * IDXGIDeviceSubObject interface
366
- */
367
-#ifndef __IDXGIDeviceSubObject_INTERFACE_DEFINED__
368
-#define __IDXGIDeviceSubObject_INTERFACE_DEFINED__
369
-
370
-DEFINE_GUID(IID_IDXGIDeviceSubObject, 0x3d3e0379, 0xf9de, 0x4d58, 0xbb,0x6c, 0x18,0xd6,0x29,0x92,0xf1,0xa6);
371
-#if defined(__cplusplus) && !defined(CINTERFACE)
372
-MIDL_INTERFACE("3d3e0379-f9de-4d58-bb6c-18d62992f1a6")
373
-IDXGIDeviceSubObject : public IDXGIObject
374
-{
375
- virtual HRESULT STDMETHODCALLTYPE GetDevice(
376
- REFIID riid,
377
- void **device) = 0;
378
-
379
-};
380
-#ifdef __CRT_UUID_DECL
381
-__CRT_UUID_DECL(IDXGIDeviceSubObject, 0x3d3e0379, 0xf9de, 0x4d58, 0xbb,0x6c, 0x18,0xd6,0x29,0x92,0xf1,0xa6)
382
-#endif
383
-#else
384
-typedef struct IDXGIDeviceSubObjectVtbl {
385
- BEGIN_INTERFACE
386
-
387
- /*** IUnknown methods ***/
388
- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
389
- IDXGIDeviceSubObject* This,
390
- REFIID riid,
391
- void **ppvObject);
392
-
393
- ULONG (STDMETHODCALLTYPE *AddRef)(
394
- IDXGIDeviceSubObject* This);
395
-
396
- ULONG (STDMETHODCALLTYPE *Release)(
397
- IDXGIDeviceSubObject* This);
398
-
399
- /*** IDXGIObject methods ***/
400
- HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
401
- IDXGIDeviceSubObject* This,
402
- REFGUID guid,
403
- UINT data_size,
404
- const void *data);
405
-
406
- HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
407
- IDXGIDeviceSubObject* This,
408
- REFGUID guid,
409
- const IUnknown *object);
410
-
411
- HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
412
- IDXGIDeviceSubObject* This,
413
- REFGUID guid,
414
- UINT *data_size,
415
- void *data);
416
-
417
- HRESULT (STDMETHODCALLTYPE *GetParent)(
418
- IDXGIDeviceSubObject* This,
419
- REFIID riid,
420
- void **parent);
421
-
422
- /*** IDXGIDeviceSubObject methods ***/
423
- HRESULT (STDMETHODCALLTYPE *GetDevice)(
424
- IDXGIDeviceSubObject* This,
425
- REFIID riid,
426
- void **device);
427
-
428
- END_INTERFACE
429
-} IDXGIDeviceSubObjectVtbl;
430
-interface IDXGIDeviceSubObject {
431
- CONST_VTBL IDXGIDeviceSubObjectVtbl* lpVtbl;
432
-};
433
-
434
-#ifdef COBJMACROS
435
-#ifndef WIDL_C_INLINE_WRAPPERS
436
-/*** IUnknown methods ***/
437
-#define IDXGIDeviceSubObject_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
438
-#define IDXGIDeviceSubObject_AddRef(This) (This)->lpVtbl->AddRef(This)
439
-#define IDXGIDeviceSubObject_Release(This) (This)->lpVtbl->Release(This)
440
-/*** IDXGIObject methods ***/
441
-#define IDXGIDeviceSubObject_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
442
-#define IDXGIDeviceSubObject_SetPrivateDataInterface(This,guid,object) (This)->lpVtbl->SetPrivateDataInterface(This,guid,object)
443
-#define IDXGIDeviceSubObject_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
444
-#define IDXGIDeviceSubObject_GetParent(This,riid,parent) (This)->lpVtbl->GetParent(This,riid,parent)
445
-/*** IDXGIDeviceSubObject methods ***/
446
-#define IDXGIDeviceSubObject_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
447
-#else
448
-/*** IUnknown methods ***/
449
-static FORCEINLINE HRESULT IDXGIDeviceSubObject_QueryInterface(IDXGIDeviceSubObject* This,REFIID riid,void **ppvObject) {
450
- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
451
-}
452
-static FORCEINLINE ULONG IDXGIDeviceSubObject_AddRef(IDXGIDeviceSubObject* This) {
453
- return This->lpVtbl->AddRef(This);
454
-}
455
-static FORCEINLINE ULONG IDXGIDeviceSubObject_Release(IDXGIDeviceSubObject* This) {
456
- return This->lpVtbl->Release(This);
457
-}
458
-/*** IDXGIObject methods ***/
459
-static FORCEINLINE HRESULT IDXGIDeviceSubObject_SetPrivateData(IDXGIDeviceSubObject* This,REFGUID guid,UINT data_size,const void *data) {
460
- return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
461
-}
462
-static FORCEINLINE HRESULT IDXGIDeviceSubObject_SetPrivateDataInterface(IDXGIDeviceSubObject* This,REFGUID guid,const IUnknown *object) {
463
- return This->lpVtbl->SetPrivateDataInterface(This,guid,object);
464
-}
465
-static FORCEINLINE HRESULT IDXGIDeviceSubObject_GetPrivateData(IDXGIDeviceSubObject* This,REFGUID guid,UINT *data_size,void *data) {
466
- return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
467
-}
468
-static FORCEINLINE HRESULT IDXGIDeviceSubObject_GetParent(IDXGIDeviceSubObject* This,REFIID riid,void **parent) {
469
- return This->lpVtbl->GetParent(This,riid,parent);
470
-}
471
-/*** IDXGIDeviceSubObject methods ***/
472
-static FORCEINLINE HRESULT IDXGIDeviceSubObject_GetDevice(IDXGIDeviceSubObject* This,REFIID riid,void **device) {
473
- return This->lpVtbl->GetDevice(This,riid,device);
474
-}
475
-#endif
476
-#endif
477
-
478
-#endif
479
-
480
-HRESULT STDMETHODCALLTYPE IDXGIDeviceSubObject_GetDevice_Proxy(
481
- IDXGIDeviceSubObject* This,
482
- REFIID riid,
483
- void **device);
484
-void __RPC_STUB IDXGIDeviceSubObject_GetDevice_Stub(
485
- IRpcStubBuffer* This,
486
- IRpcChannelBuffer* pRpcChannelBuffer,
487
- PRPC_MESSAGE pRpcMessage,
488
- DWORD* pdwStubPhase);
489
-
490
-#endif /* __IDXGIDeviceSubObject_INTERFACE_DEFINED__ */
491
-
492
-/*****************************************************************************
493
- * IDXGIResource interface
494
- */
495
-#ifndef __IDXGIResource_INTERFACE_DEFINED__
496
-#define __IDXGIResource_INTERFACE_DEFINED__
497
-
498
-DEFINE_GUID(IID_IDXGIResource, 0x035f3ab4, 0x482e, 0x4e50, 0xb4,0x1f, 0x8a,0x7f,0x8b,0xd8,0x96,0x0b);
499
-#if defined(__cplusplus) && !defined(CINTERFACE)
500
-MIDL_INTERFACE("035f3ab4-482e-4e50-b41f-8a7f8bd8960b")
501
-IDXGIResource : public IDXGIDeviceSubObject
502
-{
503
- virtual HRESULT STDMETHODCALLTYPE GetSharedHandle(
504
- HANDLE *pSharedHandle) = 0;
505
-
506
- virtual HRESULT STDMETHODCALLTYPE GetUsage(
507
- DXGI_USAGE *pUsage) = 0;
508
-
509
- virtual HRESULT STDMETHODCALLTYPE SetEvictionPriority(
510
- UINT EvictionPriority) = 0;
511
-
512
- virtual HRESULT STDMETHODCALLTYPE GetEvictionPriority(
513
- UINT *pEvictionPriority) = 0;
514
-
515
-};
516
-#ifdef __CRT_UUID_DECL
517
-__CRT_UUID_DECL(IDXGIResource, 0x035f3ab4, 0x482e, 0x4e50, 0xb4,0x1f, 0x8a,0x7f,0x8b,0xd8,0x96,0x0b)
518
-#endif
519
-#else
520
-typedef struct IDXGIResourceVtbl {
521
- BEGIN_INTERFACE
522
-
523
- /*** IUnknown methods ***/
524
- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
525
- IDXGIResource* This,
526
- REFIID riid,
527
- void **ppvObject);
528
-
529
- ULONG (STDMETHODCALLTYPE *AddRef)(
530
- IDXGIResource* This);
531
-
532
- ULONG (STDMETHODCALLTYPE *Release)(
533
- IDXGIResource* This);
534
-
535
- /*** IDXGIObject methods ***/
536
- HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
537
- IDXGIResource* This,
538
- REFGUID guid,
539
- UINT data_size,
540
- const void *data);
541
-
542
- HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
543
- IDXGIResource* This,
544
- REFGUID guid,
545
- const IUnknown *object);
546
-
547
- HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
548
- IDXGIResource* This,
549
- REFGUID guid,
550
- UINT *data_size,
551
- void *data);
552
-
553
- HRESULT (STDMETHODCALLTYPE *GetParent)(
554
- IDXGIResource* This,
555
- REFIID riid,
556
- void **parent);
557
-
558
- /*** IDXGIDeviceSubObject methods ***/
559
- HRESULT (STDMETHODCALLTYPE *GetDevice)(
560
- IDXGIResource* This,
561
- REFIID riid,
562
- void **device);
563
-
564
- /*** IDXGIResource methods ***/
565
- HRESULT (STDMETHODCALLTYPE *GetSharedHandle)(
566
- IDXGIResource* This,
567
- HANDLE *pSharedHandle);
568
-
569
- HRESULT (STDMETHODCALLTYPE *GetUsage)(
570
- IDXGIResource* This,
571
- DXGI_USAGE *pUsage);
572
-
573
- HRESULT (STDMETHODCALLTYPE *SetEvictionPriority)(
574
- IDXGIResource* This,
575
- UINT EvictionPriority);
576
-
577
- HRESULT (STDMETHODCALLTYPE *GetEvictionPriority)(
578
- IDXGIResource* This,
579
- UINT *pEvictionPriority);
580
-
581
- END_INTERFACE
582
-} IDXGIResourceVtbl;
583
-interface IDXGIResource {
584
- CONST_VTBL IDXGIResourceVtbl* lpVtbl;
585
-};
586
-
587
-#ifdef COBJMACROS
588
-#ifndef WIDL_C_INLINE_WRAPPERS
589
-/*** IUnknown methods ***/
590
-#define IDXGIResource_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
591
-#define IDXGIResource_AddRef(This) (This)->lpVtbl->AddRef(This)
592
-#define IDXGIResource_Release(This) (This)->lpVtbl->Release(This)
593
-/*** IDXGIObject methods ***/
594
-#define IDXGIResource_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
595
-#define IDXGIResource_SetPrivateDataInterface(This,guid,object) (This)->lpVtbl->SetPrivateDataInterface(This,guid,object)
596
-#define IDXGIResource_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
597
-#define IDXGIResource_GetParent(This,riid,parent) (This)->lpVtbl->GetParent(This,riid,parent)
598
-/*** IDXGIDeviceSubObject methods ***/
599
-#define IDXGIResource_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
600
-/*** IDXGIResource methods ***/
601
-#define IDXGIResource_GetSharedHandle(This,pSharedHandle) (This)->lpVtbl->GetSharedHandle(This,pSharedHandle)
602
-#define IDXGIResource_GetUsage(This,pUsage) (This)->lpVtbl->GetUsage(This,pUsage)
603
-#define IDXGIResource_SetEvictionPriority(This,EvictionPriority) (This)->lpVtbl->SetEvictionPriority(This,EvictionPriority)
604
-#define IDXGIResource_GetEvictionPriority(This,pEvictionPriority) (This)->lpVtbl->GetEvictionPriority(This,pEvictionPriority)
605
-#else
606
-/*** IUnknown methods ***/
607
-static FORCEINLINE HRESULT IDXGIResource_QueryInterface(IDXGIResource* This,REFIID riid,void **ppvObject) {
608
- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
609
-}
610
-static FORCEINLINE ULONG IDXGIResource_AddRef(IDXGIResource* This) {
611
- return This->lpVtbl->AddRef(This);
612
-}
613
-static FORCEINLINE ULONG IDXGIResource_Release(IDXGIResource* This) {
614
- return This->lpVtbl->Release(This);
615
-}
616
-/*** IDXGIObject methods ***/
617
-static FORCEINLINE HRESULT IDXGIResource_SetPrivateData(IDXGIResource* This,REFGUID guid,UINT data_size,const void *data) {
618
- return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
619
-}
620
-static FORCEINLINE HRESULT IDXGIResource_SetPrivateDataInterface(IDXGIResource* This,REFGUID guid,const IUnknown *object) {
621
- return This->lpVtbl->SetPrivateDataInterface(This,guid,object);
622
-}
623
-static FORCEINLINE HRESULT IDXGIResource_GetPrivateData(IDXGIResource* This,REFGUID guid,UINT *data_size,void *data) {
624
- return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
625
-}
626
-static FORCEINLINE HRESULT IDXGIResource_GetParent(IDXGIResource* This,REFIID riid,void **parent) {
627
- return This->lpVtbl->GetParent(This,riid,parent);
628
-}
629
-/*** IDXGIDeviceSubObject methods ***/
630
-static FORCEINLINE HRESULT IDXGIResource_GetDevice(IDXGIResource* This,REFIID riid,void **device) {
631
- return This->lpVtbl->GetDevice(This,riid,device);
632
-}
633
-/*** IDXGIResource methods ***/
634
-static FORCEINLINE HRESULT IDXGIResource_GetSharedHandle(IDXGIResource* This,HANDLE *pSharedHandle) {
635
- return This->lpVtbl->GetSharedHandle(This,pSharedHandle);
636
-}
637
-static FORCEINLINE HRESULT IDXGIResource_GetUsage(IDXGIResource* This,DXGI_USAGE *pUsage) {
638
- return This->lpVtbl->GetUsage(This,pUsage);
639
-}
640
-static FORCEINLINE HRESULT IDXGIResource_SetEvictionPriority(IDXGIResource* This,UINT EvictionPriority) {
641
- return This->lpVtbl->SetEvictionPriority(This,EvictionPriority);
642
-}
643
-static FORCEINLINE HRESULT IDXGIResource_GetEvictionPriority(IDXGIResource* This,UINT *pEvictionPriority) {
644
- return This->lpVtbl->GetEvictionPriority(This,pEvictionPriority);
645
-}
646
-#endif
647
-#endif
648
-
649
-#endif
650
-
651
-HRESULT STDMETHODCALLTYPE IDXGIResource_GetSharedHandle_Proxy(
652
- IDXGIResource* This,
653
- HANDLE *pSharedHandle);
654
-void __RPC_STUB IDXGIResource_GetSharedHandle_Stub(
655
- IRpcStubBuffer* This,
656
- IRpcChannelBuffer* pRpcChannelBuffer,
657
- PRPC_MESSAGE pRpcMessage,
658
- DWORD* pdwStubPhase);
659
-HRESULT STDMETHODCALLTYPE IDXGIResource_GetUsage_Proxy(
660
- IDXGIResource* This,
661
- DXGI_USAGE *pUsage);
662
-void __RPC_STUB IDXGIResource_GetUsage_Stub(
663
- IRpcStubBuffer* This,
664
- IRpcChannelBuffer* pRpcChannelBuffer,
665
- PRPC_MESSAGE pRpcMessage,
666
- DWORD* pdwStubPhase);
667
-HRESULT STDMETHODCALLTYPE IDXGIResource_SetEvictionPriority_Proxy(
668
- IDXGIResource* This,
669
- UINT EvictionPriority);
670
-void __RPC_STUB IDXGIResource_SetEvictionPriority_Stub(
671
- IRpcStubBuffer* This,
672
- IRpcChannelBuffer* pRpcChannelBuffer,
673
- PRPC_MESSAGE pRpcMessage,
674
- DWORD* pdwStubPhase);
675
-HRESULT STDMETHODCALLTYPE IDXGIResource_GetEvictionPriority_Proxy(
676
- IDXGIResource* This,
677
- UINT *pEvictionPriority);
678
-void __RPC_STUB IDXGIResource_GetEvictionPriority_Stub(
679
- IRpcStubBuffer* This,
680
- IRpcChannelBuffer* pRpcChannelBuffer,
681
- PRPC_MESSAGE pRpcMessage,
682
- DWORD* pdwStubPhase);
683
-
684
-#endif /* __IDXGIResource_INTERFACE_DEFINED__ */
685
-
686
-/*****************************************************************************
687
- * IDXGIKeyedMutex interface
688
- */
689
-#ifndef __IDXGIKeyedMutex_INTERFACE_DEFINED__
690
-#define __IDXGIKeyedMutex_INTERFACE_DEFINED__
691
-
692
-DEFINE_GUID(IID_IDXGIKeyedMutex, 0x9d8e1289, 0xd7b3, 0x465f, 0x81,0x26, 0x25,0x0e,0x34,0x9a,0xf8,0x5d);
693
-#if defined(__cplusplus) && !defined(CINTERFACE)
694
-MIDL_INTERFACE("9d8e1289-d7b3-465f-8126-250e349af85d")
695
-IDXGIKeyedMutex : public IDXGIDeviceSubObject
696
-{
697
- virtual HRESULT STDMETHODCALLTYPE AcquireSync(
698
- UINT64 Key,
699
- DWORD dwMilliseconds) = 0;
700
-
701
- virtual HRESULT STDMETHODCALLTYPE ReleaseSync(
702
- UINT64 Key) = 0;
703
-
704
-};
705
-#ifdef __CRT_UUID_DECL
706
-__CRT_UUID_DECL(IDXGIKeyedMutex, 0x9d8e1289, 0xd7b3, 0x465f, 0x81,0x26, 0x25,0x0e,0x34,0x9a,0xf8,0x5d)
707
-#endif
708
-#else
709
-typedef struct IDXGIKeyedMutexVtbl {
710
- BEGIN_INTERFACE
711
-
712
- /*** IUnknown methods ***/
713
- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
714
- IDXGIKeyedMutex* This,
715
- REFIID riid,
716
- void **ppvObject);
717
-
718
- ULONG (STDMETHODCALLTYPE *AddRef)(
719
- IDXGIKeyedMutex* This);
720
-
721
- ULONG (STDMETHODCALLTYPE *Release)(
722
- IDXGIKeyedMutex* This);
723
-
724
- /*** IDXGIObject methods ***/
725
- HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
726
- IDXGIKeyedMutex* This,
727
- REFGUID guid,
728
- UINT data_size,
729
- const void *data);
730
-
731
- HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
732
- IDXGIKeyedMutex* This,
733
- REFGUID guid,
734
- const IUnknown *object);
735
-
736
- HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
737
- IDXGIKeyedMutex* This,
738
- REFGUID guid,
739
- UINT *data_size,
740
- void *data);
741
-
742
- HRESULT (STDMETHODCALLTYPE *GetParent)(
743
- IDXGIKeyedMutex* This,
744
- REFIID riid,
745
- void **parent);
746
-
747
- /*** IDXGIDeviceSubObject methods ***/
748
- HRESULT (STDMETHODCALLTYPE *GetDevice)(
749
- IDXGIKeyedMutex* This,
750
- REFIID riid,
751
- void **device);
752
-
753
- /*** IDXGIKeyedMutex methods ***/
754
- HRESULT (STDMETHODCALLTYPE *AcquireSync)(
755
- IDXGIKeyedMutex* This,
756
- UINT64 Key,
757
- DWORD dwMilliseconds);
758
-
759
- HRESULT (STDMETHODCALLTYPE *ReleaseSync)(
760
- IDXGIKeyedMutex* This,
761
- UINT64 Key);
762
-
763
- END_INTERFACE
764
-} IDXGIKeyedMutexVtbl;
765
-interface IDXGIKeyedMutex {
766
- CONST_VTBL IDXGIKeyedMutexVtbl* lpVtbl;
767
-};
768
-
769
-#ifdef COBJMACROS
770
-#ifndef WIDL_C_INLINE_WRAPPERS
771
-/*** IUnknown methods ***/
772
-#define IDXGIKeyedMutex_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
773
-#define IDXGIKeyedMutex_AddRef(This) (This)->lpVtbl->AddRef(This)
774
-#define IDXGIKeyedMutex_Release(This) (This)->lpVtbl->Release(This)
775
-/*** IDXGIObject methods ***/
776
-#define IDXGIKeyedMutex_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
777
-#define IDXGIKeyedMutex_SetPrivateDataInterface(This,guid,object) (This)->lpVtbl->SetPrivateDataInterface(This,guid,object)
778
-#define IDXGIKeyedMutex_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
779
-#define IDXGIKeyedMutex_GetParent(This,riid,parent) (This)->lpVtbl->GetParent(This,riid,parent)
780
-/*** IDXGIDeviceSubObject methods ***/
781
-#define IDXGIKeyedMutex_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
782
-/*** IDXGIKeyedMutex methods ***/
783
-#define IDXGIKeyedMutex_AcquireSync(This,Key,dwMilliseconds) (This)->lpVtbl->AcquireSync(This,Key,dwMilliseconds)
784
-#define IDXGIKeyedMutex_ReleaseSync(This,Key) (This)->lpVtbl->ReleaseSync(This,Key)
785
-#else
786
-/*** IUnknown methods ***/
787
-static FORCEINLINE HRESULT IDXGIKeyedMutex_QueryInterface(IDXGIKeyedMutex* This,REFIID riid,void **ppvObject) {
788
- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
789
-}
790
-static FORCEINLINE ULONG IDXGIKeyedMutex_AddRef(IDXGIKeyedMutex* This) {
791
- return This->lpVtbl->AddRef(This);
792
-}
793
-static FORCEINLINE ULONG IDXGIKeyedMutex_Release(IDXGIKeyedMutex* This) {
794
- return This->lpVtbl->Release(This);
795
-}
796
-/*** IDXGIObject methods ***/
797
-static FORCEINLINE HRESULT IDXGIKeyedMutex_SetPrivateData(IDXGIKeyedMutex* This,REFGUID guid,UINT data_size,const void *data) {
798
- return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
799
-}
800
-static FORCEINLINE HRESULT IDXGIKeyedMutex_SetPrivateDataInterface(IDXGIKeyedMutex* This,REFGUID guid,const IUnknown *object) {
801
- return This->lpVtbl->SetPrivateDataInterface(This,guid,object);
802
-}
803
-static FORCEINLINE HRESULT IDXGIKeyedMutex_GetPrivateData(IDXGIKeyedMutex* This,REFGUID guid,UINT *data_size,void *data) {
804
- return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
805
-}
806
-static FORCEINLINE HRESULT IDXGIKeyedMutex_GetParent(IDXGIKeyedMutex* This,REFIID riid,void **parent) {
807
- return This->lpVtbl->GetParent(This,riid,parent);
808
-}
809
-/*** IDXGIDeviceSubObject methods ***/
810
-static FORCEINLINE HRESULT IDXGIKeyedMutex_GetDevice(IDXGIKeyedMutex* This,REFIID riid,void **device) {
811
- return This->lpVtbl->GetDevice(This,riid,device);
812
-}
813
-/*** IDXGIKeyedMutex methods ***/
814
-static FORCEINLINE HRESULT IDXGIKeyedMutex_AcquireSync(IDXGIKeyedMutex* This,UINT64 Key,DWORD dwMilliseconds) {
815
- return This->lpVtbl->AcquireSync(This,Key,dwMilliseconds);
816
-}
817
-static FORCEINLINE HRESULT IDXGIKeyedMutex_ReleaseSync(IDXGIKeyedMutex* This,UINT64 Key) {
818
- return This->lpVtbl->ReleaseSync(This,Key);
819
-}
820
-#endif
821
-#endif
822
-
823
-#endif
824
-
825
-HRESULT STDMETHODCALLTYPE IDXGIKeyedMutex_AcquireSync_Proxy(
826
- IDXGIKeyedMutex* This,
827
- UINT64 Key,
828
- DWORD dwMilliseconds);
829
-void __RPC_STUB IDXGIKeyedMutex_AcquireSync_Stub(
830
- IRpcStubBuffer* This,
831
- IRpcChannelBuffer* pRpcChannelBuffer,
832
- PRPC_MESSAGE pRpcMessage,
833
- DWORD* pdwStubPhase);
834
-HRESULT STDMETHODCALLTYPE IDXGIKeyedMutex_ReleaseSync_Proxy(
835
- IDXGIKeyedMutex* This,
836
- UINT64 Key);
837
-void __RPC_STUB IDXGIKeyedMutex_ReleaseSync_Stub(
838
- IRpcStubBuffer* This,
839
- IRpcChannelBuffer* pRpcChannelBuffer,
840
- PRPC_MESSAGE pRpcMessage,
841
- DWORD* pdwStubPhase);
842
-
843
-#endif /* __IDXGIKeyedMutex_INTERFACE_DEFINED__ */
844
-
845
-/*****************************************************************************
846
- * IDXGISurface interface
847
- */
848
-#ifndef __IDXGISurface_INTERFACE_DEFINED__
849
-#define __IDXGISurface_INTERFACE_DEFINED__
850
-
851
-DEFINE_GUID(IID_IDXGISurface, 0xcafcb56c, 0x6ac3, 0x4889, 0xbf,0x47, 0x9e,0x23,0xbb,0xd2,0x60,0xec);
852
-#if defined(__cplusplus) && !defined(CINTERFACE)
853
-MIDL_INTERFACE("cafcb56c-6ac3-4889-bf47-9e23bbd260ec")
854
-IDXGISurface : public IDXGIDeviceSubObject
855
-{
856
- virtual HRESULT STDMETHODCALLTYPE GetDesc(
857
- DXGI_SURFACE_DESC *desc) = 0;
858
-
859
- virtual HRESULT STDMETHODCALLTYPE Map(
860
- DXGI_MAPPED_RECT *mapped_rect,
861
- UINT flags) = 0;
862
-
863
- virtual HRESULT STDMETHODCALLTYPE Unmap(
864
- ) = 0;
865
-
866
-};
867
-#ifdef __CRT_UUID_DECL
868
-__CRT_UUID_DECL(IDXGISurface, 0xcafcb56c, 0x6ac3, 0x4889, 0xbf,0x47, 0x9e,0x23,0xbb,0xd2,0x60,0xec)
869
-#endif
870
-#else
871
-typedef struct IDXGISurfaceVtbl {
872
- BEGIN_INTERFACE
873
-
874
- /*** IUnknown methods ***/
875
- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
876
- IDXGISurface* This,
877
- REFIID riid,
878
- void **ppvObject);
879
-
880
- ULONG (STDMETHODCALLTYPE *AddRef)(
881
- IDXGISurface* This);
882
-
883
- ULONG (STDMETHODCALLTYPE *Release)(
884
- IDXGISurface* This);
885
-
886
- /*** IDXGIObject methods ***/
887
- HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
888
- IDXGISurface* This,
889
- REFGUID guid,
890
- UINT data_size,
891
- const void *data);
892
-
893
- HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
894
- IDXGISurface* This,
895
- REFGUID guid,
896
- const IUnknown *object);
897
-
898
- HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
899
- IDXGISurface* This,
900
- REFGUID guid,
901
- UINT *data_size,
902
- void *data);
903
-
904
- HRESULT (STDMETHODCALLTYPE *GetParent)(
905
- IDXGISurface* This,
906
- REFIID riid,
907
- void **parent);
908
-
909
- /*** IDXGIDeviceSubObject methods ***/
910
- HRESULT (STDMETHODCALLTYPE *GetDevice)(
911
- IDXGISurface* This,
912
- REFIID riid,
913
- void **device);
914
-
915
- /*** IDXGISurface methods ***/
916
- HRESULT (STDMETHODCALLTYPE *GetDesc)(
917
- IDXGISurface* This,
918
- DXGI_SURFACE_DESC *desc);
919
-
920
- HRESULT (STDMETHODCALLTYPE *Map)(
921
- IDXGISurface* This,
922
- DXGI_MAPPED_RECT *mapped_rect,
923
- UINT flags);
924
-
925
- HRESULT (STDMETHODCALLTYPE *Unmap)(
926
- IDXGISurface* This);
927
-
928
- END_INTERFACE
929
-} IDXGISurfaceVtbl;
930
-interface IDXGISurface {
931
- CONST_VTBL IDXGISurfaceVtbl* lpVtbl;
932
-};
933
-
934
-#ifdef COBJMACROS
935
-#ifndef WIDL_C_INLINE_WRAPPERS
936
-/*** IUnknown methods ***/
937
-#define IDXGISurface_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
938
-#define IDXGISurface_AddRef(This) (This)->lpVtbl->AddRef(This)
939
-#define IDXGISurface_Release(This) (This)->lpVtbl->Release(This)
940
-/*** IDXGIObject methods ***/
941
-#define IDXGISurface_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
942
-#define IDXGISurface_SetPrivateDataInterface(This,guid,object) (This)->lpVtbl->SetPrivateDataInterface(This,guid,object)
943
-#define IDXGISurface_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
944
-#define IDXGISurface_GetParent(This,riid,parent) (This)->lpVtbl->GetParent(This,riid,parent)
945
-/*** IDXGIDeviceSubObject methods ***/
946
-#define IDXGISurface_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
947
-/*** IDXGISurface methods ***/
948
-#define IDXGISurface_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
949
-#define IDXGISurface_Map(This,mapped_rect,flags) (This)->lpVtbl->Map(This,mapped_rect,flags)
950
-#define IDXGISurface_Unmap(This) (This)->lpVtbl->Unmap(This)
951
-#else
952
-/*** IUnknown methods ***/
953
-static FORCEINLINE HRESULT IDXGISurface_QueryInterface(IDXGISurface* This,REFIID riid,void **ppvObject) {
954
- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
955
-}
956
-static FORCEINLINE ULONG IDXGISurface_AddRef(IDXGISurface* This) {
957
- return This->lpVtbl->AddRef(This);
958
-}
959
-static FORCEINLINE ULONG IDXGISurface_Release(IDXGISurface* This) {
960
- return This->lpVtbl->Release(This);
961
-}
962
-/*** IDXGIObject methods ***/
963
-static FORCEINLINE HRESULT IDXGISurface_SetPrivateData(IDXGISurface* This,REFGUID guid,UINT data_size,const void *data) {
964
- return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
965
-}
966
-static FORCEINLINE HRESULT IDXGISurface_SetPrivateDataInterface(IDXGISurface* This,REFGUID guid,const IUnknown *object) {
967
- return This->lpVtbl->SetPrivateDataInterface(This,guid,object);
968
-}
969
-static FORCEINLINE HRESULT IDXGISurface_GetPrivateData(IDXGISurface* This,REFGUID guid,UINT *data_size,void *data) {
970
- return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
971
-}
972
-static FORCEINLINE HRESULT IDXGISurface_GetParent(IDXGISurface* This,REFIID riid,void **parent) {
973
- return This->lpVtbl->GetParent(This,riid,parent);
974
-}
975
-/*** IDXGIDeviceSubObject methods ***/
976
-static FORCEINLINE HRESULT IDXGISurface_GetDevice(IDXGISurface* This,REFIID riid,void **device) {
977
- return This->lpVtbl->GetDevice(This,riid,device);
978
-}
979
-/*** IDXGISurface methods ***/
980
-static FORCEINLINE HRESULT IDXGISurface_GetDesc(IDXGISurface* This,DXGI_SURFACE_DESC *desc) {
981
- return This->lpVtbl->GetDesc(This,desc);
982
-}
983
-static FORCEINLINE HRESULT IDXGISurface_Map(IDXGISurface* This,DXGI_MAPPED_RECT *mapped_rect,UINT flags) {
984
- return This->lpVtbl->Map(This,mapped_rect,flags);
985
-}
986
-static FORCEINLINE HRESULT IDXGISurface_Unmap(IDXGISurface* This) {
987
- return This->lpVtbl->Unmap(This);
988
-}
989
-#endif
990
-#endif
991
-
992
-#endif
993
-
994
-HRESULT STDMETHODCALLTYPE IDXGISurface_GetDesc_Proxy(
995
- IDXGISurface* This,
996
- DXGI_SURFACE_DESC *desc);
997
-void __RPC_STUB IDXGISurface_GetDesc_Stub(
998
- IRpcStubBuffer* This,
999
- IRpcChannelBuffer* pRpcChannelBuffer,
1000
- PRPC_MESSAGE pRpcMessage,
1001
- DWORD* pdwStubPhase);
1002
-HRESULT STDMETHODCALLTYPE IDXGISurface_Map_Proxy(
1003
- IDXGISurface* This,
1004
- DXGI_MAPPED_RECT *mapped_rect,
1005
- UINT flags);
1006
-void __RPC_STUB IDXGISurface_Map_Stub(
1007
- IRpcStubBuffer* This,
1008
- IRpcChannelBuffer* pRpcChannelBuffer,
1009
- PRPC_MESSAGE pRpcMessage,
1010
- DWORD* pdwStubPhase);
1011
-HRESULT STDMETHODCALLTYPE IDXGISurface_Unmap_Proxy(
1012
- IDXGISurface* This);
1013
-void __RPC_STUB IDXGISurface_Unmap_Stub(
1014
- IRpcStubBuffer* This,
1015
- IRpcChannelBuffer* pRpcChannelBuffer,
1016
- PRPC_MESSAGE pRpcMessage,
1017
- DWORD* pdwStubPhase);
1018
-
1019
-#endif /* __IDXGISurface_INTERFACE_DEFINED__ */
1020
-
1021
-/*****************************************************************************
1022
- * IDXGISurface1 interface
1023
- */
1024
-#ifndef __IDXGISurface_INTERFACE_DEFINED__
1025
-#define __IDXGISurface_INTERFACE_DEFINED__
1026
-
1027
-DEFINE_GUID(IID_IDXGISurface, 0x4AE63092, 0x6327, 0x4c1b, 0x80,0xae, 0xbf,0xe1,0x2e,0xa3,0x2b,0xa6);
1028
-#if defined(__cplusplus) && !defined(CINTERFACE)
1029
-MIDL_INTERFACE("4AE63092-6327-4c1b-80AE-BFE12EA32B86")
1030
-IDXGISurface : public IDXGISurface
1031
-{
1032
- virtual HRESULT STDMETHODCALLTYPE GetDC(
1033
- BOOL discard,
1034
- HDC *phdc) = 0;
1035
-
1036
- virtual HRESULT STDMETHODCALLTYPE ReleaseDC(
1037
- RECT *pdirty_rect) = 0;
1038
-
1039
-};
1040
-#ifdef __CRT_UUID_DECL
1041
-__CRT_UUID_DECL(IDXGISurface1, 0x4AE63092, 0x6327, 0x4c1b, 0x80,0xae, 0xbf,0xe1,0x2e,0xa3,0x2b,0xa6)
1042
-#endif
1043
-#endif /* c++ */
1044
-
1045
-#endif /* __IDXGISurface_INTERFACE_DEFINED__ */
1046
-
1047
-/*****************************************************************************
1048
- * IDXGIOutput interface
1049
- */
1050
-#ifndef __IDXGIOutput_INTERFACE_DEFINED__
1051
-#define __IDXGIOutput_INTERFACE_DEFINED__
1052
-
1053
-DEFINE_GUID(IID_IDXGIOutput, 0xae02eedb, 0xc735, 0x4690, 0x8d,0x52, 0x5a,0x8d,0xc2,0x02,0x13,0xaa);
1054
-#if defined(__cplusplus) && !defined(CINTERFACE)
1055
-MIDL_INTERFACE("ae02eedb-c735-4690-8d52-5a8dc20213aa")
1056
-IDXGIOutput : public IDXGIObject
1057
-{
1058
- virtual HRESULT STDMETHODCALLTYPE GetDesc(
1059
- DXGI_OUTPUT_DESC *desc) = 0;
1060
-
1061
- virtual HRESULT STDMETHODCALLTYPE GetDisplayModeList(
1062
- DXGI_FORMAT format,
1063
- UINT flags,
1064
- UINT *mode_count,
1065
- DXGI_MODE_DESC *desc) = 0;
1066
-
1067
- virtual HRESULT STDMETHODCALLTYPE FindClosestMatchingMode(
1068
- const DXGI_MODE_DESC *mode,
1069
- DXGI_MODE_DESC *closest_match,
1070
- IUnknown *device) = 0;
1071
-
1072
- virtual HRESULT STDMETHODCALLTYPE WaitForVBlank(
1073
- ) = 0;
1074
-
1075
- virtual HRESULT STDMETHODCALLTYPE TakeOwnership(
1076
- IUnknown *device,
1077
- WINBOOL exclusive) = 0;
1078
-
1079
- virtual void STDMETHODCALLTYPE ReleaseOwnership(
1080
- ) = 0;
1081
-
1082
- virtual HRESULT STDMETHODCALLTYPE GetGammaControlCapabilities(
1083
- DXGI_GAMMA_CONTROL_CAPABILITIES *gamma_caps) = 0;
1084
-
1085
- virtual HRESULT STDMETHODCALLTYPE SetGammaControl(
1086
- const DXGI_GAMMA_CONTROL *gamma_control) = 0;
1087
-
1088
- virtual HRESULT STDMETHODCALLTYPE GetGammaControl(
1089
- DXGI_GAMMA_CONTROL *gamma_control) = 0;
1090
-
1091
- virtual HRESULT STDMETHODCALLTYPE SetDisplaySurface(
1092
- IDXGISurface *surface) = 0;
1093
-
1094
- virtual HRESULT STDMETHODCALLTYPE GetDisplaySurfaceData(
1095
- IDXGISurface *surface) = 0;
1096
-
1097
- virtual HRESULT STDMETHODCALLTYPE GetFrameStatistics(
1098
- DXGI_FRAME_STATISTICS *stats) = 0;
1099
-
1100
-};
1101
-#ifdef __CRT_UUID_DECL
1102
-__CRT_UUID_DECL(IDXGIOutput, 0xae02eedb, 0xc735, 0x4690, 0x8d,0x52, 0x5a,0x8d,0xc2,0x02,0x13,0xaa)
1103
-#endif
1104
-#else
1105
-typedef struct IDXGIOutputVtbl {
1106
- BEGIN_INTERFACE
1107
-
1108
- /*** IUnknown methods ***/
1109
- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
1110
- IDXGIOutput* This,
1111
- REFIID riid,
1112
- void **ppvObject);
1113
-
1114
- ULONG (STDMETHODCALLTYPE *AddRef)(
1115
- IDXGIOutput* This);
1116
-
1117
- ULONG (STDMETHODCALLTYPE *Release)(
1118
- IDXGIOutput* This);
1119
-
1120
- /*** IDXGIObject methods ***/
1121
- HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
1122
- IDXGIOutput* This,
1123
- REFGUID guid,
1124
- UINT data_size,
1125
- const void *data);
1126
-
1127
- HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
1128
- IDXGIOutput* This,
1129
- REFGUID guid,
1130
- const IUnknown *object);
1131
-
1132
- HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
1133
- IDXGIOutput* This,
1134
- REFGUID guid,
1135
- UINT *data_size,
1136
- void *data);
1137
-
1138
- HRESULT (STDMETHODCALLTYPE *GetParent)(
1139
- IDXGIOutput* This,
1140
- REFIID riid,
1141
- void **parent);
1142
-
1143
- /*** IDXGIOutput methods ***/
1144
- HRESULT (STDMETHODCALLTYPE *GetDesc)(
1145
- IDXGIOutput* This,
1146
- DXGI_OUTPUT_DESC *desc);
1147
-
1148
- HRESULT (STDMETHODCALLTYPE *GetDisplayModeList)(
1149
- IDXGIOutput* This,
1150
- DXGI_FORMAT format,
1151
- UINT flags,
1152
- UINT *mode_count,
1153
- DXGI_MODE_DESC *desc);
1154
-
1155
- HRESULT (STDMETHODCALLTYPE *FindClosestMatchingMode)(
1156
- IDXGIOutput* This,
1157
- const DXGI_MODE_DESC *mode,
1158
- DXGI_MODE_DESC *closest_match,
1159
- IUnknown *device);
1160
-
1161
- HRESULT (STDMETHODCALLTYPE *WaitForVBlank)(
1162
- IDXGIOutput* This);
1163
-
1164
- HRESULT (STDMETHODCALLTYPE *TakeOwnership)(
1165
- IDXGIOutput* This,
1166
- IUnknown *device,
1167
- WINBOOL exclusive);
1168
-
1169
- void (STDMETHODCALLTYPE *ReleaseOwnership)(
1170
- IDXGIOutput* This);
1171
-
1172
- HRESULT (STDMETHODCALLTYPE *GetGammaControlCapabilities)(
1173
- IDXGIOutput* This,
1174
- DXGI_GAMMA_CONTROL_CAPABILITIES *gamma_caps);
1175
-
1176
- HRESULT (STDMETHODCALLTYPE *SetGammaControl)(
1177
- IDXGIOutput* This,
1178
- const DXGI_GAMMA_CONTROL *gamma_control);
1179
-
1180
- HRESULT (STDMETHODCALLTYPE *GetGammaControl)(
1181
- IDXGIOutput* This,
1182
- DXGI_GAMMA_CONTROL *gamma_control);
1183
-
1184
- HRESULT (STDMETHODCALLTYPE *SetDisplaySurface)(
1185
- IDXGIOutput* This,
1186
- IDXGISurface *surface);
1187
-
1188
- HRESULT (STDMETHODCALLTYPE *GetDisplaySurfaceData)(
1189
- IDXGIOutput* This,
1190
- IDXGISurface *surface);
1191
-
1192
- HRESULT (STDMETHODCALLTYPE *GetFrameStatistics)(
1193
- IDXGIOutput* This,
1194
- DXGI_FRAME_STATISTICS *stats);
1195
-
1196
- END_INTERFACE
1197
-} IDXGIOutputVtbl;
1198
-interface IDXGIOutput {
1199
- CONST_VTBL IDXGIOutputVtbl* lpVtbl;
1200
-};
1201
-
1202
-#ifdef COBJMACROS
1203
-#ifndef WIDL_C_INLINE_WRAPPERS
1204
-/*** IUnknown methods ***/
1205
-#define IDXGIOutput_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
1206
-#define IDXGIOutput_AddRef(This) (This)->lpVtbl->AddRef(This)
1207
-#define IDXGIOutput_Release(This) (This)->lpVtbl->Release(This)
1208
-/*** IDXGIObject methods ***/
1209
-#define IDXGIOutput_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
1210
-#define IDXGIOutput_SetPrivateDataInterface(This,guid,object) (This)->lpVtbl->SetPrivateDataInterface(This,guid,object)
1211
-#define IDXGIOutput_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
1212
-#define IDXGIOutput_GetParent(This,riid,parent) (This)->lpVtbl->GetParent(This,riid,parent)
1213
-/*** IDXGIOutput methods ***/
1214
-#define IDXGIOutput_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
1215
-#define IDXGIOutput_GetDisplayModeList(This,format,flags,mode_count,desc) (This)->lpVtbl->GetDisplayModeList(This,format,flags,mode_count,desc)
1216
-#define IDXGIOutput_FindClosestMatchingMode(This,mode,closest_match,device) (This)->lpVtbl->FindClosestMatchingMode(This,mode,closest_match,device)
1217
-#define IDXGIOutput_WaitForVBlank(This) (This)->lpVtbl->WaitForVBlank(This)
1218
-#define IDXGIOutput_TakeOwnership(This,device,exclusive) (This)->lpVtbl->TakeOwnership(This,device,exclusive)
1219
-#define IDXGIOutput_ReleaseOwnership(This) (This)->lpVtbl->ReleaseOwnership(This)
1220
-#define IDXGIOutput_GetGammaControlCapabilities(This,gamma_caps) (This)->lpVtbl->GetGammaControlCapabilities(This,gamma_caps)
1221
-#define IDXGIOutput_SetGammaControl(This,gamma_control) (This)->lpVtbl->SetGammaControl(This,gamma_control)
1222
-#define IDXGIOutput_GetGammaControl(This,gamma_control) (This)->lpVtbl->GetGammaControl(This,gamma_control)
1223
-#define IDXGIOutput_SetDisplaySurface(This,surface) (This)->lpVtbl->SetDisplaySurface(This,surface)
1224
-#define IDXGIOutput_GetDisplaySurfaceData(This,surface) (This)->lpVtbl->GetDisplaySurfaceData(This,surface)
1225
-#define IDXGIOutput_GetFrameStatistics(This,stats) (This)->lpVtbl->GetFrameStatistics(This,stats)
1226
-#else
1227
-/*** IUnknown methods ***/
1228
-static FORCEINLINE HRESULT IDXGIOutput_QueryInterface(IDXGIOutput* This,REFIID riid,void **ppvObject) {
1229
- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
1230
-}
1231
-static FORCEINLINE ULONG IDXGIOutput_AddRef(IDXGIOutput* This) {
1232
- return This->lpVtbl->AddRef(This);
1233
-}
1234
-static FORCEINLINE ULONG IDXGIOutput_Release(IDXGIOutput* This) {
1235
- return This->lpVtbl->Release(This);
1236
-}
1237
-/*** IDXGIObject methods ***/
1238
-static FORCEINLINE HRESULT IDXGIOutput_SetPrivateData(IDXGIOutput* This,REFGUID guid,UINT data_size,const void *data) {
1239
- return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
1240
-}
1241
-static FORCEINLINE HRESULT IDXGIOutput_SetPrivateDataInterface(IDXGIOutput* This,REFGUID guid,const IUnknown *object) {
1242
- return This->lpVtbl->SetPrivateDataInterface(This,guid,object);
1243
-}
1244
-static FORCEINLINE HRESULT IDXGIOutput_GetPrivateData(IDXGIOutput* This,REFGUID guid,UINT *data_size,void *data) {
1245
- return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
1246
-}
1247
-static FORCEINLINE HRESULT IDXGIOutput_GetParent(IDXGIOutput* This,REFIID riid,void **parent) {
1248
- return This->lpVtbl->GetParent(This,riid,parent);
1249
-}
1250
-/*** IDXGIOutput methods ***/
1251
-static FORCEINLINE HRESULT IDXGIOutput_GetDesc(IDXGIOutput* This,DXGI_OUTPUT_DESC *desc) {
1252
- return This->lpVtbl->GetDesc(This,desc);
1253
-}
1254
-static FORCEINLINE HRESULT IDXGIOutput_GetDisplayModeList(IDXGIOutput* This,DXGI_FORMAT format,UINT flags,UINT *mode_count,DXGI_MODE_DESC *desc) {
1255
- return This->lpVtbl->GetDisplayModeList(This,format,flags,mode_count,desc);
1256
-}
1257
-static FORCEINLINE HRESULT IDXGIOutput_FindClosestMatchingMode(IDXGIOutput* This,const DXGI_MODE_DESC *mode,DXGI_MODE_DESC *closest_match,IUnknown *device) {
1258
- return This->lpVtbl->FindClosestMatchingMode(This,mode,closest_match,device);
1259
-}
1260
-static FORCEINLINE HRESULT IDXGIOutput_WaitForVBlank(IDXGIOutput* This) {
1261
- return This->lpVtbl->WaitForVBlank(This);
1262
-}
1263
-static FORCEINLINE HRESULT IDXGIOutput_TakeOwnership(IDXGIOutput* This,IUnknown *device,WINBOOL exclusive) {
1264
- return This->lpVtbl->TakeOwnership(This,device,exclusive);
1265
-}
1266
-static FORCEINLINE void IDXGIOutput_ReleaseOwnership(IDXGIOutput* This) {
1267
- This->lpVtbl->ReleaseOwnership(This);
1268
-}
1269
-static FORCEINLINE HRESULT IDXGIOutput_GetGammaControlCapabilities(IDXGIOutput* This,DXGI_GAMMA_CONTROL_CAPABILITIES *gamma_caps) {
1270
- return This->lpVtbl->GetGammaControlCapabilities(This,gamma_caps);
1271
-}
1272
-static FORCEINLINE HRESULT IDXGIOutput_SetGammaControl(IDXGIOutput* This,const DXGI_GAMMA_CONTROL *gamma_control) {
1273
- return This->lpVtbl->SetGammaControl(This,gamma_control);
1274
-}
1275
-static FORCEINLINE HRESULT IDXGIOutput_GetGammaControl(IDXGIOutput* This,DXGI_GAMMA_CONTROL *gamma_control) {
1276
- return This->lpVtbl->GetGammaControl(This,gamma_control);
1277
-}
1278
-static FORCEINLINE HRESULT IDXGIOutput_SetDisplaySurface(IDXGIOutput* This,IDXGISurface *surface) {
1279
- return This->lpVtbl->SetDisplaySurface(This,surface);
1280
-}
1281
-static FORCEINLINE HRESULT IDXGIOutput_GetDisplaySurfaceData(IDXGIOutput* This,IDXGISurface *surface) {
1282
- return This->lpVtbl->GetDisplaySurfaceData(This,surface);
1283
-}
1284
-static FORCEINLINE HRESULT IDXGIOutput_GetFrameStatistics(IDXGIOutput* This,DXGI_FRAME_STATISTICS *stats) {
1285
- return This->lpVtbl->GetFrameStatistics(This,stats);
1286
-}
1287
-#endif
1288
-#endif
1289
-
1290
-#endif
1291
-
1292
-HRESULT STDMETHODCALLTYPE IDXGIOutput_GetDesc_Proxy(
1293
- IDXGIOutput* This,
1294
- DXGI_OUTPUT_DESC *desc);
1295
-void __RPC_STUB IDXGIOutput_GetDesc_Stub(
1296
- IRpcStubBuffer* This,
1297
- IRpcChannelBuffer* pRpcChannelBuffer,
1298
- PRPC_MESSAGE pRpcMessage,
1299
- DWORD* pdwStubPhase);
1300
-HRESULT STDMETHODCALLTYPE IDXGIOutput_GetDisplayModeList_Proxy(
1301
- IDXGIOutput* This,
1302
- DXGI_FORMAT format,
1303
- UINT flags,
1304
- UINT *mode_count,
1305
- DXGI_MODE_DESC *desc);
1306
-void __RPC_STUB IDXGIOutput_GetDisplayModeList_Stub(
1307
- IRpcStubBuffer* This,
1308
- IRpcChannelBuffer* pRpcChannelBuffer,
1309
- PRPC_MESSAGE pRpcMessage,
1310
- DWORD* pdwStubPhase);
1311
-HRESULT STDMETHODCALLTYPE IDXGIOutput_FindClosestMatchingMode_Proxy(
1312
- IDXGIOutput* This,
1313
- const DXGI_MODE_DESC *mode,
1314
- DXGI_MODE_DESC *closest_match,
1315
- IUnknown *device);
1316
-void __RPC_STUB IDXGIOutput_FindClosestMatchingMode_Stub(
1317
- IRpcStubBuffer* This,
1318
- IRpcChannelBuffer* pRpcChannelBuffer,
1319
- PRPC_MESSAGE pRpcMessage,
1320
- DWORD* pdwStubPhase);
1321
-HRESULT STDMETHODCALLTYPE IDXGIOutput_WaitForVBlank_Proxy(
1322
- IDXGIOutput* This);
1323
-void __RPC_STUB IDXGIOutput_WaitForVBlank_Stub(
1324
- IRpcStubBuffer* This,
1325
- IRpcChannelBuffer* pRpcChannelBuffer,
1326
- PRPC_MESSAGE pRpcMessage,
1327
- DWORD* pdwStubPhase);
1328
-HRESULT STDMETHODCALLTYPE IDXGIOutput_TakeOwnership_Proxy(
1329
- IDXGIOutput* This,
1330
- IUnknown *device,
1331
- WINBOOL exclusive);
1332
-void __RPC_STUB IDXGIOutput_TakeOwnership_Stub(
1333
- IRpcStubBuffer* This,
1334
- IRpcChannelBuffer* pRpcChannelBuffer,
1335
- PRPC_MESSAGE pRpcMessage,
1336
- DWORD* pdwStubPhase);
1337
-void STDMETHODCALLTYPE IDXGIOutput_ReleaseOwnership_Proxy(
1338
- IDXGIOutput* This);
1339
-void __RPC_STUB IDXGIOutput_ReleaseOwnership_Stub(
1340
- IRpcStubBuffer* This,
1341
- IRpcChannelBuffer* pRpcChannelBuffer,
1342
- PRPC_MESSAGE pRpcMessage,
1343
- DWORD* pdwStubPhase);
1344
-HRESULT STDMETHODCALLTYPE IDXGIOutput_GetGammaControlCapabilities_Proxy(
1345
- IDXGIOutput* This,
1346
- DXGI_GAMMA_CONTROL_CAPABILITIES *gamma_caps);
1347
-void __RPC_STUB IDXGIOutput_GetGammaControlCapabilities_Stub(
1348
- IRpcStubBuffer* This,
1349
- IRpcChannelBuffer* pRpcChannelBuffer,
1350
- PRPC_MESSAGE pRpcMessage,
1351
- DWORD* pdwStubPhase);
1352
-HRESULT STDMETHODCALLTYPE IDXGIOutput_SetGammaControl_Proxy(
1353
- IDXGIOutput* This,
1354
- const DXGI_GAMMA_CONTROL *gamma_control);
1355
-void __RPC_STUB IDXGIOutput_SetGammaControl_Stub(
1356
- IRpcStubBuffer* This,
1357
- IRpcChannelBuffer* pRpcChannelBuffer,
1358
- PRPC_MESSAGE pRpcMessage,
1359
- DWORD* pdwStubPhase);
1360
-HRESULT STDMETHODCALLTYPE IDXGIOutput_GetGammaControl_Proxy(
1361
- IDXGIOutput* This,
1362
- DXGI_GAMMA_CONTROL *gamma_control);
1363
-void __RPC_STUB IDXGIOutput_GetGammaControl_Stub(
1364
- IRpcStubBuffer* This,
1365
- IRpcChannelBuffer* pRpcChannelBuffer,
1366
- PRPC_MESSAGE pRpcMessage,
1367
- DWORD* pdwStubPhase);
1368
-HRESULT STDMETHODCALLTYPE IDXGIOutput_SetDisplaySurface_Proxy(
1369
- IDXGIOutput* This,
1370
- IDXGISurface *surface);
1371
-void __RPC_STUB IDXGIOutput_SetDisplaySurface_Stub(
1372
- IRpcStubBuffer* This,
1373
- IRpcChannelBuffer* pRpcChannelBuffer,
1374
- PRPC_MESSAGE pRpcMessage,
1375
- DWORD* pdwStubPhase);
1376
-HRESULT STDMETHODCALLTYPE IDXGIOutput_GetDisplaySurfaceData_Proxy(
1377
- IDXGIOutput* This,
1378
- IDXGISurface *surface);
1379
-void __RPC_STUB IDXGIOutput_GetDisplaySurfaceData_Stub(
1380
- IRpcStubBuffer* This,
1381
- IRpcChannelBuffer* pRpcChannelBuffer,
1382
- PRPC_MESSAGE pRpcMessage,
1383
- DWORD* pdwStubPhase);
1384
-HRESULT STDMETHODCALLTYPE IDXGIOutput_GetFrameStatistics_Proxy(
1385
- IDXGIOutput* This,
1386
- DXGI_FRAME_STATISTICS *stats);
1387
-void __RPC_STUB IDXGIOutput_GetFrameStatistics_Stub(
1388
- IRpcStubBuffer* This,
1389
- IRpcChannelBuffer* pRpcChannelBuffer,
1390
- PRPC_MESSAGE pRpcMessage,
1391
- DWORD* pdwStubPhase);
1392
-
1393
-#endif /* __IDXGIOutput_INTERFACE_DEFINED__ */
1394
-
1395
-/*****************************************************************************
1396
- * IDXGIAdapter interface
1397
- */
1398
-#ifndef __IDXGIAdapter_INTERFACE_DEFINED__
1399
-#define __IDXGIAdapter_INTERFACE_DEFINED__
1400
-
1401
-DEFINE_GUID(IID_IDXGIAdapter, 0x2411e7e1, 0x12ac, 0x4ccf, 0xbd,0x14, 0x97,0x98,0xe8,0x53,0x4d,0xc0);
1402
-#if defined(__cplusplus) && !defined(CINTERFACE)
1403
-MIDL_INTERFACE("2411e7e1-12ac-4ccf-bd14-9798e8534dc0")
1404
-IDXGIAdapter : public IDXGIObject
1405
-{
1406
- virtual HRESULT STDMETHODCALLTYPE EnumOutputs(
1407
- UINT output_idx,
1408
- IDXGIOutput **output) = 0;
1409
-
1410
- virtual HRESULT STDMETHODCALLTYPE GetDesc(
1411
- DXGI_ADAPTER_DESC *desc) = 0;
1412
-
1413
- virtual HRESULT STDMETHODCALLTYPE CheckInterfaceSupport(
1414
- REFGUID guid,
1415
- LARGE_INTEGER *umd_version) = 0;
1416
-
1417
-};
1418
-#ifdef __CRT_UUID_DECL
1419
-__CRT_UUID_DECL(IDXGIAdapter, 0x2411e7e1, 0x12ac, 0x4ccf, 0xbd,0x14, 0x97,0x98,0xe8,0x53,0x4d,0xc0)
1420
-#endif
1421
-#else
1422
-typedef struct IDXGIAdapterVtbl {
1423
- BEGIN_INTERFACE
1424
-
1425
- /*** IUnknown methods ***/
1426
- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
1427
- IDXGIAdapter* This,
1428
- REFIID riid,
1429
- void **ppvObject);
1430
-
1431
- ULONG (STDMETHODCALLTYPE *AddRef)(
1432
- IDXGIAdapter* This);
1433
-
1434
- ULONG (STDMETHODCALLTYPE *Release)(
1435
- IDXGIAdapter* This);
1436
-
1437
- /*** IDXGIObject methods ***/
1438
- HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
1439
- IDXGIAdapter* This,
1440
- REFGUID guid,
1441
- UINT data_size,
1442
- const void *data);
1443
-
1444
- HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
1445
- IDXGIAdapter* This,
1446
- REFGUID guid,
1447
- const IUnknown *object);
1448
-
1449
- HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
1450
- IDXGIAdapter* This,
1451
- REFGUID guid,
1452
- UINT *data_size,
1453
- void *data);
1454
-
1455
- HRESULT (STDMETHODCALLTYPE *GetParent)(
1456
- IDXGIAdapter* This,
1457
- REFIID riid,
1458
- void **parent);
1459
-
1460
- /*** IDXGIAdapter methods ***/
1461
- HRESULT (STDMETHODCALLTYPE *EnumOutputs)(
1462
- IDXGIAdapter* This,
1463
- UINT output_idx,
1464
- IDXGIOutput **output);
1465
-
1466
- HRESULT (STDMETHODCALLTYPE *GetDesc)(
1467
- IDXGIAdapter* This,
1468
- DXGI_ADAPTER_DESC *desc);
1469
-
1470
- HRESULT (STDMETHODCALLTYPE *CheckInterfaceSupport)(
1471
- IDXGIAdapter* This,
1472
- REFGUID guid,
1473
- LARGE_INTEGER *umd_version);
1474
-
1475
- END_INTERFACE
1476
-} IDXGIAdapterVtbl;
1477
-interface IDXGIAdapter {
1478
- CONST_VTBL IDXGIAdapterVtbl* lpVtbl;
1479
-};
1480
-
1481
-#ifdef COBJMACROS
1482
-#ifndef WIDL_C_INLINE_WRAPPERS
1483
-/*** IUnknown methods ***/
1484
-#define IDXGIAdapter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
1485
-#define IDXGIAdapter_AddRef(This) (This)->lpVtbl->AddRef(This)
1486
-#define IDXGIAdapter_Release(This) (This)->lpVtbl->Release(This)
1487
-/*** IDXGIObject methods ***/
1488
-#define IDXGIAdapter_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
1489
-#define IDXGIAdapter_SetPrivateDataInterface(This,guid,object) (This)->lpVtbl->SetPrivateDataInterface(This,guid,object)
1490
-#define IDXGIAdapter_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
1491
-#define IDXGIAdapter_GetParent(This,riid,parent) (This)->lpVtbl->GetParent(This,riid,parent)
1492
-/*** IDXGIAdapter methods ***/
1493
-#define IDXGIAdapter_EnumOutputs(This,output_idx,output) (This)->lpVtbl->EnumOutputs(This,output_idx,output)
1494
-#define IDXGIAdapter_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
1495
-#define IDXGIAdapter_CheckInterfaceSupport(This,guid,umd_version) (This)->lpVtbl->CheckInterfaceSupport(This,guid,umd_version)
1496
-#else
1497
-/*** IUnknown methods ***/
1498
-static FORCEINLINE HRESULT IDXGIAdapter_QueryInterface(IDXGIAdapter* This,REFIID riid,void **ppvObject) {
1499
- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
1500
-}
1501
-static FORCEINLINE ULONG IDXGIAdapter_AddRef(IDXGIAdapter* This) {
1502
- return This->lpVtbl->AddRef(This);
1503
-}
1504
-static FORCEINLINE ULONG IDXGIAdapter_Release(IDXGIAdapter* This) {
1505
- return This->lpVtbl->Release(This);
1506
-}
1507
-/*** IDXGIObject methods ***/
1508
-static FORCEINLINE HRESULT IDXGIAdapter_SetPrivateData(IDXGIAdapter* This,REFGUID guid,UINT data_size,const void *data) {
1509
- return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
1510
-}
1511
-static FORCEINLINE HRESULT IDXGIAdapter_SetPrivateDataInterface(IDXGIAdapter* This,REFGUID guid,const IUnknown *object) {
1512
- return This->lpVtbl->SetPrivateDataInterface(This,guid,object);
1513
-}
1514
-static FORCEINLINE HRESULT IDXGIAdapter_GetPrivateData(IDXGIAdapter* This,REFGUID guid,UINT *data_size,void *data) {
1515
- return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
1516
-}
1517
-static FORCEINLINE HRESULT IDXGIAdapter_GetParent(IDXGIAdapter* This,REFIID riid,void **parent) {
1518
- return This->lpVtbl->GetParent(This,riid,parent);
1519
-}
1520
-/*** IDXGIAdapter methods ***/
1521
-static FORCEINLINE HRESULT IDXGIAdapter_EnumOutputs(IDXGIAdapter* This,UINT output_idx,IDXGIOutput **output) {
1522
- return This->lpVtbl->EnumOutputs(This,output_idx,output);
1523
-}
1524
-static FORCEINLINE HRESULT IDXGIAdapter_GetDesc(IDXGIAdapter* This,DXGI_ADAPTER_DESC *desc) {
1525
- return This->lpVtbl->GetDesc(This,desc);
1526
-}
1527
-static FORCEINLINE HRESULT IDXGIAdapter_CheckInterfaceSupport(IDXGIAdapter* This,REFGUID guid,LARGE_INTEGER *umd_version) {
1528
- return This->lpVtbl->CheckInterfaceSupport(This,guid,umd_version);
1529
-}
1530
-#endif
1531
-#endif
1532
-
1533
-#endif
1534
-
1535
-HRESULT STDMETHODCALLTYPE IDXGIAdapter_EnumOutputs_Proxy(
1536
- IDXGIAdapter* This,
1537
- UINT output_idx,
1538
- IDXGIOutput **output);
1539
-void __RPC_STUB IDXGIAdapter_EnumOutputs_Stub(
1540
- IRpcStubBuffer* This,
1541
- IRpcChannelBuffer* pRpcChannelBuffer,
1542
- PRPC_MESSAGE pRpcMessage,
1543
- DWORD* pdwStubPhase);
1544
-HRESULT STDMETHODCALLTYPE IDXGIAdapter_GetDesc_Proxy(
1545
- IDXGIAdapter* This,
1546
- DXGI_ADAPTER_DESC *desc);
1547
-void __RPC_STUB IDXGIAdapter_GetDesc_Stub(
1548
- IRpcStubBuffer* This,
1549
- IRpcChannelBuffer* pRpcChannelBuffer,
1550
- PRPC_MESSAGE pRpcMessage,
1551
- DWORD* pdwStubPhase);
1552
-HRESULT STDMETHODCALLTYPE IDXGIAdapter_CheckInterfaceSupport_Proxy(
1553
- IDXGIAdapter* This,
1554
- REFGUID guid,
1555
- LARGE_INTEGER *umd_version);
1556
-void __RPC_STUB IDXGIAdapter_CheckInterfaceSupport_Stub(
1557
- IRpcStubBuffer* This,
1558
- IRpcChannelBuffer* pRpcChannelBuffer,
1559
- PRPC_MESSAGE pRpcMessage,
1560
- DWORD* pdwStubPhase);
1561
-
1562
-#endif /* __IDXGIAdapter_INTERFACE_DEFINED__ */
1563
-
1564
-/*****************************************************************************
1565
- * IDXGISwapChain interface
1566
- */
1567
-#ifndef __IDXGISwapChain_INTERFACE_DEFINED__
1568
-#define __IDXGISwapChain_INTERFACE_DEFINED__
1569
-
1570
-DEFINE_GUID(IID_IDXGISwapChain, 0x310d36a0, 0xd2e7, 0x4c0a, 0xaa,0x04, 0x6a,0x9d,0x23,0xb8,0x88,0x6a);
1571
-#if defined(__cplusplus) && !defined(CINTERFACE)
1572
-MIDL_INTERFACE("310d36a0-d2e7-4c0a-aa04-6a9d23b8886a")
1573
-IDXGISwapChain : public IDXGIDeviceSubObject
1574
-{
1575
- virtual HRESULT STDMETHODCALLTYPE Present(
1576
- UINT sync_interval,
1577
- UINT flags) = 0;
1578
-
1579
- virtual HRESULT STDMETHODCALLTYPE GetBuffer(
1580
- UINT buffer_idx,
1581
- REFIID riid,
1582
- void **surface) = 0;
1583
-
1584
- virtual HRESULT STDMETHODCALLTYPE SetFullscreenState(
1585
- WINBOOL fullscreen,
1586
- IDXGIOutput *target) = 0;
1587
-
1588
- virtual HRESULT STDMETHODCALLTYPE GetFullscreenState(
1589
- WINBOOL *fullscreen,
1590
- IDXGIOutput **target) = 0;
1591
-
1592
- virtual HRESULT STDMETHODCALLTYPE GetDesc(
1593
- DXGI_SWAP_CHAIN_DESC *desc) = 0;
1594
-
1595
- virtual HRESULT STDMETHODCALLTYPE ResizeBuffers(
1596
- UINT buffer_count,
1597
- UINT width,
1598
- UINT height,
1599
- DXGI_FORMAT format,
1600
- UINT flags) = 0;
1601
-
1602
- virtual HRESULT STDMETHODCALLTYPE ResizeTarget(
1603
- const DXGI_MODE_DESC *target_mode_desc) = 0;
1604
-
1605
- virtual HRESULT STDMETHODCALLTYPE GetContainingOutput(
1606
- IDXGIOutput **output) = 0;
1607
-
1608
- virtual HRESULT STDMETHODCALLTYPE GetFrameStatistics(
1609
- DXGI_FRAME_STATISTICS *stats) = 0;
1610
-
1611
- virtual HRESULT STDMETHODCALLTYPE GetLastPresentCount(
1612
- UINT *last_present_count) = 0;
1613
-
1614
-};
1615
-#ifdef __CRT_UUID_DECL
1616
-__CRT_UUID_DECL(IDXGISwapChain, 0x310d36a0, 0xd2e7, 0x4c0a, 0xaa,0x04, 0x6a,0x9d,0x23,0xb8,0x88,0x6a)
1617
-#endif
1618
-#else
1619
-typedef struct IDXGISwapChainVtbl {
1620
- BEGIN_INTERFACE
1621
-
1622
- /*** IUnknown methods ***/
1623
- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
1624
- IDXGISwapChain* This,
1625
- REFIID riid,
1626
- void **ppvObject);
1627
-
1628
- ULONG (STDMETHODCALLTYPE *AddRef)(
1629
- IDXGISwapChain* This);
1630
-
1631
- ULONG (STDMETHODCALLTYPE *Release)(
1632
- IDXGISwapChain* This);
1633
-
1634
- /*** IDXGIObject methods ***/
1635
- HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
1636
- IDXGISwapChain* This,
1637
- REFGUID guid,
1638
- UINT data_size,
1639
- const void *data);
1640
-
1641
- HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
1642
- IDXGISwapChain* This,
1643
- REFGUID guid,
1644
- const IUnknown *object);
1645
-
1646
- HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
1647
- IDXGISwapChain* This,
1648
- REFGUID guid,
1649
- UINT *data_size,
1650
- void *data);
1651
-
1652
- HRESULT (STDMETHODCALLTYPE *GetParent)(
1653
- IDXGISwapChain* This,
1654
- REFIID riid,
1655
- void **parent);
1656
-
1657
- /*** IDXGIDeviceSubObject methods ***/
1658
- HRESULT (STDMETHODCALLTYPE *GetDevice)(
1659
- IDXGISwapChain* This,
1660
- REFIID riid,
1661
- void **device);
1662
-
1663
- /*** IDXGISwapChain methods ***/
1664
- HRESULT (STDMETHODCALLTYPE *Present)(
1665
- IDXGISwapChain* This,
1666
- UINT sync_interval,
1667
- UINT flags);
1668
-
1669
- HRESULT (STDMETHODCALLTYPE *GetBuffer)(
1670
- IDXGISwapChain* This,
1671
- UINT buffer_idx,
1672
- REFIID riid,
1673
- void **surface);
1674
-
1675
- HRESULT (STDMETHODCALLTYPE *SetFullscreenState)(
1676
- IDXGISwapChain* This,
1677
- WINBOOL fullscreen,
1678
- IDXGIOutput *target);
1679
-
1680
- HRESULT (STDMETHODCALLTYPE *GetFullscreenState)(
1681
- IDXGISwapChain* This,
1682
- WINBOOL *fullscreen,
1683
- IDXGIOutput **target);
1684
-
1685
- HRESULT (STDMETHODCALLTYPE *GetDesc)(
1686
- IDXGISwapChain* This,
1687
- DXGI_SWAP_CHAIN_DESC *desc);
1688
-
1689
- HRESULT (STDMETHODCALLTYPE *ResizeBuffers)(
1690
- IDXGISwapChain* This,
1691
- UINT buffer_count,
1692
- UINT width,
1693
- UINT height,
1694
- DXGI_FORMAT format,
1695
- UINT flags);
1696
-
1697
- HRESULT (STDMETHODCALLTYPE *ResizeTarget)(
1698
- IDXGISwapChain* This,
1699
- const DXGI_MODE_DESC *target_mode_desc);
1700
-
1701
- HRESULT (STDMETHODCALLTYPE *GetContainingOutput)(
1702
- IDXGISwapChain* This,
1703
- IDXGIOutput **output);
1704
-
1705
- HRESULT (STDMETHODCALLTYPE *GetFrameStatistics)(
1706
- IDXGISwapChain* This,
1707
- DXGI_FRAME_STATISTICS *stats);
1708
-
1709
- HRESULT (STDMETHODCALLTYPE *GetLastPresentCount)(
1710
- IDXGISwapChain* This,
1711
- UINT *last_present_count);
1712
-
1713
- END_INTERFACE
1714
-} IDXGISwapChainVtbl;
1715
-interface IDXGISwapChain {
1716
- CONST_VTBL IDXGISwapChainVtbl* lpVtbl;
1717
-};
1718
-
1719
-#ifdef COBJMACROS
1720
-#ifndef WIDL_C_INLINE_WRAPPERS
1721
-/*** IUnknown methods ***/
1722
-#define IDXGISwapChain_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
1723
-#define IDXGISwapChain_AddRef(This) (This)->lpVtbl->AddRef(This)
1724
-#define IDXGISwapChain_Release(This) (This)->lpVtbl->Release(This)
1725
-/*** IDXGIObject methods ***/
1726
-#define IDXGISwapChain_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
1727
-#define IDXGISwapChain_SetPrivateDataInterface(This,guid,object) (This)->lpVtbl->SetPrivateDataInterface(This,guid,object)
1728
-#define IDXGISwapChain_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
1729
-#define IDXGISwapChain_GetParent(This,riid,parent) (This)->lpVtbl->GetParent(This,riid,parent)
1730
-/*** IDXGIDeviceSubObject methods ***/
1731
-#define IDXGISwapChain_GetDevice(This,riid,device) (This)->lpVtbl->GetDevice(This,riid,device)
1732
-/*** IDXGISwapChain methods ***/
1733
-#define IDXGISwapChain_Present(This,sync_interval,flags) (This)->lpVtbl->Present(This,sync_interval,flags)
1734
-#define IDXGISwapChain_GetBuffer(This,buffer_idx,riid,surface) (This)->lpVtbl->GetBuffer(This,buffer_idx,riid,surface)
1735
-#define IDXGISwapChain_SetFullscreenState(This,fullscreen,target) (This)->lpVtbl->SetFullscreenState(This,fullscreen,target)
1736
-#define IDXGISwapChain_GetFullscreenState(This,fullscreen,target) (This)->lpVtbl->GetFullscreenState(This,fullscreen,target)
1737
-#define IDXGISwapChain_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
1738
-#define IDXGISwapChain_ResizeBuffers(This,buffer_count,width,height,format,flags) (This)->lpVtbl->ResizeBuffers(This,buffer_count,width,height,format,flags)
1739
-#define IDXGISwapChain_ResizeTarget(This,target_mode_desc) (This)->lpVtbl->ResizeTarget(This,target_mode_desc)
1740
-#define IDXGISwapChain_GetContainingOutput(This,output) (This)->lpVtbl->GetContainingOutput(This,output)
1741
-#define IDXGISwapChain_GetFrameStatistics(This,stats) (This)->lpVtbl->GetFrameStatistics(This,stats)
1742
-#define IDXGISwapChain_GetLastPresentCount(This,last_present_count) (This)->lpVtbl->GetLastPresentCount(This,last_present_count)
1743
-#else
1744
-/*** IUnknown methods ***/
1745
-static FORCEINLINE HRESULT IDXGISwapChain_QueryInterface(IDXGISwapChain* This,REFIID riid,void **ppvObject) {
1746
- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
1747
-}
1748
-static FORCEINLINE ULONG IDXGISwapChain_AddRef(IDXGISwapChain* This) {
1749
- return This->lpVtbl->AddRef(This);
1750
-}
1751
-static FORCEINLINE ULONG IDXGISwapChain_Release(IDXGISwapChain* This) {
1752
- return This->lpVtbl->Release(This);
1753
-}
1754
-/*** IDXGIObject methods ***/
1755
-static FORCEINLINE HRESULT IDXGISwapChain_SetPrivateData(IDXGISwapChain* This,REFGUID guid,UINT data_size,const void *data) {
1756
- return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
1757
-}
1758
-static FORCEINLINE HRESULT IDXGISwapChain_SetPrivateDataInterface(IDXGISwapChain* This,REFGUID guid,const IUnknown *object) {
1759
- return This->lpVtbl->SetPrivateDataInterface(This,guid,object);
1760
-}
1761
-static FORCEINLINE HRESULT IDXGISwapChain_GetPrivateData(IDXGISwapChain* This,REFGUID guid,UINT *data_size,void *data) {
1762
- return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
1763
-}
1764
-static FORCEINLINE HRESULT IDXGISwapChain_GetParent(IDXGISwapChain* This,REFIID riid,void **parent) {
1765
- return This->lpVtbl->GetParent(This,riid,parent);
1766
-}
1767
-/*** IDXGIDeviceSubObject methods ***/
1768
-static FORCEINLINE HRESULT IDXGISwapChain_GetDevice(IDXGISwapChain* This,REFIID riid,void **device) {
1769
- return This->lpVtbl->GetDevice(This,riid,device);
1770
-}
1771
-/*** IDXGISwapChain methods ***/
1772
-static FORCEINLINE HRESULT IDXGISwapChain_Present(IDXGISwapChain* This,UINT sync_interval,UINT flags) {
1773
- return This->lpVtbl->Present(This,sync_interval,flags);
1774
-}
1775
-static FORCEINLINE HRESULT IDXGISwapChain_GetBuffer(IDXGISwapChain* This,UINT buffer_idx,REFIID riid,void **surface) {
1776
- return This->lpVtbl->GetBuffer(This,buffer_idx,riid,surface);
1777
-}
1778
-static FORCEINLINE HRESULT IDXGISwapChain_SetFullscreenState(IDXGISwapChain* This,WINBOOL fullscreen,IDXGIOutput *target) {
1779
- return This->lpVtbl->SetFullscreenState(This,fullscreen,target);
1780
-}
1781
-static FORCEINLINE HRESULT IDXGISwapChain_GetFullscreenState(IDXGISwapChain* This,WINBOOL *fullscreen,IDXGIOutput **target) {
1782
- return This->lpVtbl->GetFullscreenState(This,fullscreen,target);
1783
-}
1784
-static FORCEINLINE HRESULT IDXGISwapChain_GetDesc(IDXGISwapChain* This,DXGI_SWAP_CHAIN_DESC *desc) {
1785
- return This->lpVtbl->GetDesc(This,desc);
1786
-}
1787
-static FORCEINLINE HRESULT IDXGISwapChain_ResizeBuffers(IDXGISwapChain* This,UINT buffer_count,UINT width,UINT height,DXGI_FORMAT format,UINT flags) {
1788
- return This->lpVtbl->ResizeBuffers(This,buffer_count,width,height,format,flags);
1789
-}
1790
-static FORCEINLINE HRESULT IDXGISwapChain_ResizeTarget(IDXGISwapChain* This,const DXGI_MODE_DESC *target_mode_desc) {
1791
- return This->lpVtbl->ResizeTarget(This,target_mode_desc);
1792
-}
1793
-static FORCEINLINE HRESULT IDXGISwapChain_GetContainingOutput(IDXGISwapChain* This,IDXGIOutput **output) {
1794
- return This->lpVtbl->GetContainingOutput(This,output);
1795
-}
1796
-static FORCEINLINE HRESULT IDXGISwapChain_GetFrameStatistics(IDXGISwapChain* This,DXGI_FRAME_STATISTICS *stats) {
1797
- return This->lpVtbl->GetFrameStatistics(This,stats);
1798
-}
1799
-static FORCEINLINE HRESULT IDXGISwapChain_GetLastPresentCount(IDXGISwapChain* This,UINT *last_present_count) {
1800
- return This->lpVtbl->GetLastPresentCount(This,last_present_count);
1801
-}
1802
-#endif
1803
-#endif
1804
-
1805
-#endif
1806
-
1807
-HRESULT STDMETHODCALLTYPE IDXGISwapChain_Present_Proxy(
1808
- IDXGISwapChain* This,
1809
- UINT sync_interval,
1810
- UINT flags);
1811
-void __RPC_STUB IDXGISwapChain_Present_Stub(
1812
- IRpcStubBuffer* This,
1813
- IRpcChannelBuffer* pRpcChannelBuffer,
1814
- PRPC_MESSAGE pRpcMessage,
1815
- DWORD* pdwStubPhase);
1816
-HRESULT STDMETHODCALLTYPE IDXGISwapChain_GetBuffer_Proxy(
1817
- IDXGISwapChain* This,
1818
- UINT buffer_idx,
1819
- REFIID riid,
1820
- void **surface);
1821
-void __RPC_STUB IDXGISwapChain_GetBuffer_Stub(
1822
- IRpcStubBuffer* This,
1823
- IRpcChannelBuffer* pRpcChannelBuffer,
1824
- PRPC_MESSAGE pRpcMessage,
1825
- DWORD* pdwStubPhase);
1826
-HRESULT STDMETHODCALLTYPE IDXGISwapChain_SetFullscreenState_Proxy(
1827
- IDXGISwapChain* This,
1828
- WINBOOL fullscreen,
1829
- IDXGIOutput *target);
1830
-void __RPC_STUB IDXGISwapChain_SetFullscreenState_Stub(
1831
- IRpcStubBuffer* This,
1832
- IRpcChannelBuffer* pRpcChannelBuffer,
1833
- PRPC_MESSAGE pRpcMessage,
1834
- DWORD* pdwStubPhase);
1835
-HRESULT STDMETHODCALLTYPE IDXGISwapChain_GetFullscreenState_Proxy(
1836
- IDXGISwapChain* This,
1837
- WINBOOL *fullscreen,
1838
- IDXGIOutput **target);
1839
-void __RPC_STUB IDXGISwapChain_GetFullscreenState_Stub(
1840
- IRpcStubBuffer* This,
1841
- IRpcChannelBuffer* pRpcChannelBuffer,
1842
- PRPC_MESSAGE pRpcMessage,
1843
- DWORD* pdwStubPhase);
1844
-HRESULT STDMETHODCALLTYPE IDXGISwapChain_GetDesc_Proxy(
1845
- IDXGISwapChain* This,
1846
- DXGI_SWAP_CHAIN_DESC *desc);
1847
-void __RPC_STUB IDXGISwapChain_GetDesc_Stub(
1848
- IRpcStubBuffer* This,
1849
- IRpcChannelBuffer* pRpcChannelBuffer,
1850
- PRPC_MESSAGE pRpcMessage,
1851
- DWORD* pdwStubPhase);
1852
-HRESULT STDMETHODCALLTYPE IDXGISwapChain_ResizeBuffers_Proxy(
1853
- IDXGISwapChain* This,
1854
- UINT buffer_count,
1855
- UINT width,
1856
- UINT height,
1857
- DXGI_FORMAT format,
1858
- UINT flags);
1859
-void __RPC_STUB IDXGISwapChain_ResizeBuffers_Stub(
1860
- IRpcStubBuffer* This,
1861
- IRpcChannelBuffer* pRpcChannelBuffer,
1862
- PRPC_MESSAGE pRpcMessage,
1863
- DWORD* pdwStubPhase);
1864
-HRESULT STDMETHODCALLTYPE IDXGISwapChain_ResizeTarget_Proxy(
1865
- IDXGISwapChain* This,
1866
- const DXGI_MODE_DESC *target_mode_desc);
1867
-void __RPC_STUB IDXGISwapChain_ResizeTarget_Stub(
1868
- IRpcStubBuffer* This,
1869
- IRpcChannelBuffer* pRpcChannelBuffer,
1870
- PRPC_MESSAGE pRpcMessage,
1871
- DWORD* pdwStubPhase);
1872
-HRESULT STDMETHODCALLTYPE IDXGISwapChain_GetContainingOutput_Proxy(
1873
- IDXGISwapChain* This,
1874
- IDXGIOutput **output);
1875
-void __RPC_STUB IDXGISwapChain_GetContainingOutput_Stub(
1876
- IRpcStubBuffer* This,
1877
- IRpcChannelBuffer* pRpcChannelBuffer,
1878
- PRPC_MESSAGE pRpcMessage,
1879
- DWORD* pdwStubPhase);
1880
-HRESULT STDMETHODCALLTYPE IDXGISwapChain_GetFrameStatistics_Proxy(
1881
- IDXGISwapChain* This,
1882
- DXGI_FRAME_STATISTICS *stats);
1883
-void __RPC_STUB IDXGISwapChain_GetFrameStatistics_Stub(
1884
- IRpcStubBuffer* This,
1885
- IRpcChannelBuffer* pRpcChannelBuffer,
1886
- PRPC_MESSAGE pRpcMessage,
1887
- DWORD* pdwStubPhase);
1888
-HRESULT STDMETHODCALLTYPE IDXGISwapChain_GetLastPresentCount_Proxy(
1889
- IDXGISwapChain* This,
1890
- UINT *last_present_count);
1891
-void __RPC_STUB IDXGISwapChain_GetLastPresentCount_Stub(
1892
- IRpcStubBuffer* This,
1893
- IRpcChannelBuffer* pRpcChannelBuffer,
1894
- PRPC_MESSAGE pRpcMessage,
1895
- DWORD* pdwStubPhase);
1896
-
1897
-#endif /* __IDXGISwapChain_INTERFACE_DEFINED__ */
1898
-
1899
-#define DXGI_MWA_NO_WINDOW_CHANGES 0x1
1900
-#define DXGI_MWA_NO_ALT_ENTER 0x2
1901
-#define DXGI_MWA_NO_PRINT_SCREEN 0x4
1902
-#define DXGI_MWA_VALID 0x7
1903
-/*****************************************************************************
1904
- * IDXGIFactory interface
1905
- */
1906
-#ifndef __IDXGIFactory_INTERFACE_DEFINED__
1907
-#define __IDXGIFactory_INTERFACE_DEFINED__
1908
-
1909
-DEFINE_GUID(IID_IDXGIFactory, 0x7b7166ec, 0x21c7, 0x44ae, 0xb2,0x1a, 0xc9,0xae,0x32,0x1a,0xe3,0x69);
1910
-#if defined(__cplusplus) && !defined(CINTERFACE)
1911
-MIDL_INTERFACE("7b7166ec-21c7-44ae-b21a-c9ae321ae369")
1912
-IDXGIFactory : public IDXGIObject
1913
-{
1914
- virtual HRESULT STDMETHODCALLTYPE EnumAdapters(
1915
- UINT adapter_idx,
1916
- IDXGIAdapter **adapter) = 0;
1917
-
1918
- virtual HRESULT STDMETHODCALLTYPE MakeWindowAssociation(
1919
- HWND window,
1920
- UINT flags) = 0;
1921
-
1922
- virtual HRESULT STDMETHODCALLTYPE GetWindowAssociation(
1923
- HWND *window) = 0;
1924
-
1925
- virtual HRESULT STDMETHODCALLTYPE CreateSwapChain(
1926
- IUnknown *device,
1927
- DXGI_SWAP_CHAIN_DESC *desc,
1928
- IDXGISwapChain **swapchain) = 0;
1929
-
1930
- virtual HRESULT STDMETHODCALLTYPE CreateSoftwareAdapter(
1931
- HMODULE swrast,
1932
- IDXGIAdapter **adapter) = 0;
1933
-
1934
-};
1935
-#ifdef __CRT_UUID_DECL
1936
-__CRT_UUID_DECL(IDXGIFactory, 0x7b7166ec, 0x21c7, 0x44ae, 0xb2,0x1a, 0xc9,0xae,0x32,0x1a,0xe3,0x69)
1937
-#endif
1938
-#else
1939
-typedef struct IDXGIFactoryVtbl {
1940
- BEGIN_INTERFACE
1941
-
1942
- /*** IUnknown methods ***/
1943
- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
1944
- IDXGIFactory* This,
1945
- REFIID riid,
1946
- void **ppvObject);
1947
-
1948
- ULONG (STDMETHODCALLTYPE *AddRef)(
1949
- IDXGIFactory* This);
1950
-
1951
- ULONG (STDMETHODCALLTYPE *Release)(
1952
- IDXGIFactory* This);
1953
-
1954
- /*** IDXGIObject methods ***/
1955
- HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
1956
- IDXGIFactory* This,
1957
- REFGUID guid,
1958
- UINT data_size,
1959
- const void *data);
1960
-
1961
- HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
1962
- IDXGIFactory* This,
1963
- REFGUID guid,
1964
- const IUnknown *object);
1965
-
1966
- HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
1967
- IDXGIFactory* This,
1968
- REFGUID guid,
1969
- UINT *data_size,
1970
- void *data);
1971
-
1972
- HRESULT (STDMETHODCALLTYPE *GetParent)(
1973
- IDXGIFactory* This,
1974
- REFIID riid,
1975
- void **parent);
1976
-
1977
- /*** IDXGIFactory methods ***/
1978
- HRESULT (STDMETHODCALLTYPE *EnumAdapters)(
1979
- IDXGIFactory* This,
1980
- UINT adapter_idx,
1981
- IDXGIAdapter **adapter);
1982
-
1983
- HRESULT (STDMETHODCALLTYPE *MakeWindowAssociation)(
1984
- IDXGIFactory* This,
1985
- HWND window,
1986
- UINT flags);
1987
-
1988
- HRESULT (STDMETHODCALLTYPE *GetWindowAssociation)(
1989
- IDXGIFactory* This,
1990
- HWND *window);
1991
-
1992
- HRESULT (STDMETHODCALLTYPE *CreateSwapChain)(
1993
- IDXGIFactory* This,
1994
- IUnknown *device,
1995
- DXGI_SWAP_CHAIN_DESC *desc,
1996
- IDXGISwapChain **swapchain);
1997
-
1998
- HRESULT (STDMETHODCALLTYPE *CreateSoftwareAdapter)(
1999
- IDXGIFactory* This,
2000
- HMODULE swrast,
2001
- IDXGIAdapter **adapter);
2002
-
2003
- END_INTERFACE
2004
-} IDXGIFactoryVtbl;
2005
-interface IDXGIFactory {
2006
- CONST_VTBL IDXGIFactoryVtbl* lpVtbl;
2007
-};
2008
-
2009
-#ifdef COBJMACROS
2010
-#ifndef WIDL_C_INLINE_WRAPPERS
2011
-/*** IUnknown methods ***/
2012
-#define IDXGIFactory_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
2013
-#define IDXGIFactory_AddRef(This) (This)->lpVtbl->AddRef(This)
2014
-#define IDXGIFactory_Release(This) (This)->lpVtbl->Release(This)
2015
-/*** IDXGIObject methods ***/
2016
-#define IDXGIFactory_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
2017
-#define IDXGIFactory_SetPrivateDataInterface(This,guid,object) (This)->lpVtbl->SetPrivateDataInterface(This,guid,object)
2018
-#define IDXGIFactory_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
2019
-#define IDXGIFactory_GetParent(This,riid,parent) (This)->lpVtbl->GetParent(This,riid,parent)
2020
-/*** IDXGIFactory methods ***/
2021
-#define IDXGIFactory_EnumAdapters(This,adapter_idx,adapter) (This)->lpVtbl->EnumAdapters(This,adapter_idx,adapter)
2022
-#define IDXGIFactory_MakeWindowAssociation(This,window,flags) (This)->lpVtbl->MakeWindowAssociation(This,window,flags)
2023
-#define IDXGIFactory_GetWindowAssociation(This,window) (This)->lpVtbl->GetWindowAssociation(This,window)
2024
-#define IDXGIFactory_CreateSwapChain(This,device,desc,swapchain) (This)->lpVtbl->CreateSwapChain(This,device,desc,swapchain)
2025
-#define IDXGIFactory_CreateSoftwareAdapter(This,swrast,adapter) (This)->lpVtbl->CreateSoftwareAdapter(This,swrast,adapter)
2026
-#else
2027
-/*** IUnknown methods ***/
2028
-static FORCEINLINE HRESULT IDXGIFactory_QueryInterface(IDXGIFactory* This,REFIID riid,void **ppvObject) {
2029
- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
2030
-}
2031
-static FORCEINLINE ULONG IDXGIFactory_AddRef(IDXGIFactory* This) {
2032
- return This->lpVtbl->AddRef(This);
2033
-}
2034
-static FORCEINLINE ULONG IDXGIFactory_Release(IDXGIFactory* This) {
2035
- return This->lpVtbl->Release(This);
2036
-}
2037
-/*** IDXGIObject methods ***/
2038
-static FORCEINLINE HRESULT IDXGIFactory_SetPrivateData(IDXGIFactory* This,REFGUID guid,UINT data_size,const void *data) {
2039
- return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
2040
-}
2041
-static FORCEINLINE HRESULT IDXGIFactory_SetPrivateDataInterface(IDXGIFactory* This,REFGUID guid,const IUnknown *object) {
2042
- return This->lpVtbl->SetPrivateDataInterface(This,guid,object);
2043
-}
2044
-static FORCEINLINE HRESULT IDXGIFactory_GetPrivateData(IDXGIFactory* This,REFGUID guid,UINT *data_size,void *data) {
2045
- return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
2046
-}
2047
-static FORCEINLINE HRESULT IDXGIFactory_GetParent(IDXGIFactory* This,REFIID riid,void **parent) {
2048
- return This->lpVtbl->GetParent(This,riid,parent);
2049
-}
2050
-/*** IDXGIFactory methods ***/
2051
-static FORCEINLINE HRESULT IDXGIFactory_EnumAdapters(IDXGIFactory* This,UINT adapter_idx,IDXGIAdapter **adapter) {
2052
- return This->lpVtbl->EnumAdapters(This,adapter_idx,adapter);
2053
-}
2054
-static FORCEINLINE HRESULT IDXGIFactory_MakeWindowAssociation(IDXGIFactory* This,HWND window,UINT flags) {
2055
- return This->lpVtbl->MakeWindowAssociation(This,window,flags);
2056
-}
2057
-static FORCEINLINE HRESULT IDXGIFactory_GetWindowAssociation(IDXGIFactory* This,HWND *window) {
2058
- return This->lpVtbl->GetWindowAssociation(This,window);
2059
-}
2060
-static FORCEINLINE HRESULT IDXGIFactory_CreateSwapChain(IDXGIFactory* This,IUnknown *device,DXGI_SWAP_CHAIN_DESC *desc,IDXGISwapChain **swapchain) {
2061
- return This->lpVtbl->CreateSwapChain(This,device,desc,swapchain);
2062
-}
2063
-static FORCEINLINE HRESULT IDXGIFactory_CreateSoftwareAdapter(IDXGIFactory* This,HMODULE swrast,IDXGIAdapter **adapter) {
2064
- return This->lpVtbl->CreateSoftwareAdapter(This,swrast,adapter);
2065
-}
2066
-#endif
2067
-#endif
2068
-
2069
-#endif
2070
-
2071
-HRESULT STDMETHODCALLTYPE IDXGIFactory_EnumAdapters_Proxy(
2072
- IDXGIFactory* This,
2073
- UINT adapter_idx,
2074
- IDXGIAdapter **adapter);
2075
-void __RPC_STUB IDXGIFactory_EnumAdapters_Stub(
2076
- IRpcStubBuffer* This,
2077
- IRpcChannelBuffer* pRpcChannelBuffer,
2078
- PRPC_MESSAGE pRpcMessage,
2079
- DWORD* pdwStubPhase);
2080
-HRESULT STDMETHODCALLTYPE IDXGIFactory_MakeWindowAssociation_Proxy(
2081
- IDXGIFactory* This,
2082
- HWND window,
2083
- UINT flags);
2084
-void __RPC_STUB IDXGIFactory_MakeWindowAssociation_Stub(
2085
- IRpcStubBuffer* This,
2086
- IRpcChannelBuffer* pRpcChannelBuffer,
2087
- PRPC_MESSAGE pRpcMessage,
2088
- DWORD* pdwStubPhase);
2089
-HRESULT STDMETHODCALLTYPE IDXGIFactory_GetWindowAssociation_Proxy(
2090
- IDXGIFactory* This,
2091
- HWND *window);
2092
-void __RPC_STUB IDXGIFactory_GetWindowAssociation_Stub(
2093
- IRpcStubBuffer* This,
2094
- IRpcChannelBuffer* pRpcChannelBuffer,
2095
- PRPC_MESSAGE pRpcMessage,
2096
- DWORD* pdwStubPhase);
2097
-HRESULT STDMETHODCALLTYPE IDXGIFactory_CreateSwapChain_Proxy(
2098
- IDXGIFactory* This,
2099
- IUnknown *device,
2100
- DXGI_SWAP_CHAIN_DESC *desc,
2101
- IDXGISwapChain **swapchain);
2102
-void __RPC_STUB IDXGIFactory_CreateSwapChain_Stub(
2103
- IRpcStubBuffer* This,
2104
- IRpcChannelBuffer* pRpcChannelBuffer,
2105
- PRPC_MESSAGE pRpcMessage,
2106
- DWORD* pdwStubPhase);
2107
-HRESULT STDMETHODCALLTYPE IDXGIFactory_CreateSoftwareAdapter_Proxy(
2108
- IDXGIFactory* This,
2109
- HMODULE swrast,
2110
- IDXGIAdapter **adapter);
2111
-void __RPC_STUB IDXGIFactory_CreateSoftwareAdapter_Stub(
2112
- IRpcStubBuffer* This,
2113
- IRpcChannelBuffer* pRpcChannelBuffer,
2114
- PRPC_MESSAGE pRpcMessage,
2115
- DWORD* pdwStubPhase);
2116
-
2117
-#endif /* __IDXGIFactory_INTERFACE_DEFINED__ */
2118
-
2119
-HRESULT __stdcall CreateDXGIFactory(REFIID riid,void **factory);
2120
-HRESULT __stdcall CreateDXGIFactory1(REFIID riid,void **factory);
2121
-
2122
-/*****************************************************************************
2123
- * IDXGIDevice interface
2124
- */
2125
-#ifndef __IDXGIDevice_INTERFACE_DEFINED__
2126
-#define __IDXGIDevice_INTERFACE_DEFINED__
2127
-
2128
-DEFINE_GUID(IID_IDXGIDevice, 0x54ec77fa, 0x1377, 0x44e6, 0x8c,0x32, 0x88,0xfd,0x5f,0x44,0xc8,0x4c);
2129
-#if defined(__cplusplus) && !defined(CINTERFACE)
2130
-MIDL_INTERFACE("54ec77fa-1377-44e6-8c32-88fd5f44c84c")
2131
-IDXGIDevice : public IDXGIObject
2132
-{
2133
- virtual HRESULT STDMETHODCALLTYPE GetAdapter(
2134
- IDXGIAdapter **adapter) = 0;
2135
-
2136
- virtual HRESULT STDMETHODCALLTYPE CreateSurface(
2137
- const DXGI_SURFACE_DESC *desc,
2138
- UINT surface_count,
2139
- DXGI_USAGE usage,
2140
- const DXGI_SHARED_RESOURCE *shared_resource,
2141
- IDXGISurface **surface) = 0;
2142
-
2143
- virtual HRESULT STDMETHODCALLTYPE QueryResourceResidency(
2144
- IUnknown *const *resources,
2145
- DXGI_RESIDENCY *residency,
2146
- UINT resource_count) = 0;
2147
-
2148
- virtual HRESULT STDMETHODCALLTYPE SetGPUThreadPriority(
2149
- INT priority) = 0;
2150
-
2151
- virtual HRESULT STDMETHODCALLTYPE GetGPUThreadPriority(
2152
- INT *priority) = 0;
2153
-
2154
-};
2155
-#ifdef __CRT_UUID_DECL
2156
-__CRT_UUID_DECL(IDXGIDevice, 0x54ec77fa, 0x1377, 0x44e6, 0x8c,0x32, 0x88,0xfd,0x5f,0x44,0xc8,0x4c)
2157
-#endif
2158
-#else
2159
-typedef struct IDXGIDeviceVtbl {
2160
- BEGIN_INTERFACE
2161
-
2162
- /*** IUnknown methods ***/
2163
- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
2164
- IDXGIDevice* This,
2165
- REFIID riid,
2166
- void **ppvObject);
2167
-
2168
- ULONG (STDMETHODCALLTYPE *AddRef)(
2169
- IDXGIDevice* This);
2170
-
2171
- ULONG (STDMETHODCALLTYPE *Release)(
2172
- IDXGIDevice* This);
2173
-
2174
- /*** IDXGIObject methods ***/
2175
- HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
2176
- IDXGIDevice* This,
2177
- REFGUID guid,
2178
- UINT data_size,
2179
- const void *data);
2180
-
2181
- HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
2182
- IDXGIDevice* This,
2183
- REFGUID guid,
2184
- const IUnknown *object);
2185
-
2186
- HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
2187
- IDXGIDevice* This,
2188
- REFGUID guid,
2189
- UINT *data_size,
2190
- void *data);
2191
-
2192
- HRESULT (STDMETHODCALLTYPE *GetParent)(
2193
- IDXGIDevice* This,
2194
- REFIID riid,
2195
- void **parent);
2196
-
2197
- /*** IDXGIDevice methods ***/
2198
- HRESULT (STDMETHODCALLTYPE *GetAdapter)(
2199
- IDXGIDevice* This,
2200
- IDXGIAdapter **adapter);
2201
-
2202
- HRESULT (STDMETHODCALLTYPE *CreateSurface)(
2203
- IDXGIDevice* This,
2204
- const DXGI_SURFACE_DESC *desc,
2205
- UINT surface_count,
2206
- DXGI_USAGE usage,
2207
- const DXGI_SHARED_RESOURCE *shared_resource,
2208
- IDXGISurface **surface);
2209
-
2210
- HRESULT (STDMETHODCALLTYPE *QueryResourceResidency)(
2211
- IDXGIDevice* This,
2212
- IUnknown *const *resources,
2213
- DXGI_RESIDENCY *residency,
2214
- UINT resource_count);
2215
-
2216
- HRESULT (STDMETHODCALLTYPE *SetGPUThreadPriority)(
2217
- IDXGIDevice* This,
2218
- INT priority);
2219
-
2220
- HRESULT (STDMETHODCALLTYPE *GetGPUThreadPriority)(
2221
- IDXGIDevice* This,
2222
- INT *priority);
2223
-
2224
- END_INTERFACE
2225
-} IDXGIDeviceVtbl;
2226
-interface IDXGIDevice {
2227
- CONST_VTBL IDXGIDeviceVtbl* lpVtbl;
2228
-};
2229
-
2230
-#ifdef COBJMACROS
2231
-#ifndef WIDL_C_INLINE_WRAPPERS
2232
-/*** IUnknown methods ***/
2233
-#define IDXGIDevice_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
2234
-#define IDXGIDevice_AddRef(This) (This)->lpVtbl->AddRef(This)
2235
-#define IDXGIDevice_Release(This) (This)->lpVtbl->Release(This)
2236
-/*** IDXGIObject methods ***/
2237
-#define IDXGIDevice_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
2238
-#define IDXGIDevice_SetPrivateDataInterface(This,guid,object) (This)->lpVtbl->SetPrivateDataInterface(This,guid,object)
2239
-#define IDXGIDevice_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
2240
-#define IDXGIDevice_GetParent(This,riid,parent) (This)->lpVtbl->GetParent(This,riid,parent)
2241
-/*** IDXGIDevice methods ***/
2242
-#define IDXGIDevice_GetAdapter(This,adapter) (This)->lpVtbl->GetAdapter(This,adapter)
2243
-#define IDXGIDevice_CreateSurface(This,desc,surface_count,usage,shared_resource,surface) (This)->lpVtbl->CreateSurface(This,desc,surface_count,usage,shared_resource,surface)
2244
-#define IDXGIDevice_QueryResourceResidency(This,resources,residency,resource_count) (This)->lpVtbl->QueryResourceResidency(This,resources,residency,resource_count)
2245
-#define IDXGIDevice_SetGPUThreadPriority(This,priority) (This)->lpVtbl->SetGPUThreadPriority(This,priority)
2246
-#define IDXGIDevice_GetGPUThreadPriority(This,priority) (This)->lpVtbl->GetGPUThreadPriority(This,priority)
2247
-#else
2248
-/*** IUnknown methods ***/
2249
-static FORCEINLINE HRESULT IDXGIDevice_QueryInterface(IDXGIDevice* This,REFIID riid,void **ppvObject) {
2250
- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
2251
-}
2252
-static FORCEINLINE ULONG IDXGIDevice_AddRef(IDXGIDevice* This) {
2253
- return This->lpVtbl->AddRef(This);
2254
-}
2255
-static FORCEINLINE ULONG IDXGIDevice_Release(IDXGIDevice* This) {
2256
- return This->lpVtbl->Release(This);
2257
-}
2258
-/*** IDXGIObject methods ***/
2259
-static FORCEINLINE HRESULT IDXGIDevice_SetPrivateData(IDXGIDevice* This,REFGUID guid,UINT data_size,const void *data) {
2260
- return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
2261
-}
2262
-static FORCEINLINE HRESULT IDXGIDevice_SetPrivateDataInterface(IDXGIDevice* This,REFGUID guid,const IUnknown *object) {
2263
- return This->lpVtbl->SetPrivateDataInterface(This,guid,object);
2264
-}
2265
-static FORCEINLINE HRESULT IDXGIDevice_GetPrivateData(IDXGIDevice* This,REFGUID guid,UINT *data_size,void *data) {
2266
- return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
2267
-}
2268
-static FORCEINLINE HRESULT IDXGIDevice_GetParent(IDXGIDevice* This,REFIID riid,void **parent) {
2269
- return This->lpVtbl->GetParent(This,riid,parent);
2270
-}
2271
-/*** IDXGIDevice methods ***/
2272
-static FORCEINLINE HRESULT IDXGIDevice_GetAdapter(IDXGIDevice* This,IDXGIAdapter **adapter) {
2273
- return This->lpVtbl->GetAdapter(This,adapter);
2274
-}
2275
-static FORCEINLINE HRESULT IDXGIDevice_CreateSurface(IDXGIDevice* This,const DXGI_SURFACE_DESC *desc,UINT surface_count,DXGI_USAGE usage,const DXGI_SHARED_RESOURCE *shared_resource,IDXGISurface **surface) {
2276
- return This->lpVtbl->CreateSurface(This,desc,surface_count,usage,shared_resource,surface);
2277
-}
2278
-static FORCEINLINE HRESULT IDXGIDevice_QueryResourceResidency(IDXGIDevice* This,IUnknown *const *resources,DXGI_RESIDENCY *residency,UINT resource_count) {
2279
- return This->lpVtbl->QueryResourceResidency(This,resources,residency,resource_count);
2280
-}
2281
-static FORCEINLINE HRESULT IDXGIDevice_SetGPUThreadPriority(IDXGIDevice* This,INT priority) {
2282
- return This->lpVtbl->SetGPUThreadPriority(This,priority);
2283
-}
2284
-static FORCEINLINE HRESULT IDXGIDevice_GetGPUThreadPriority(IDXGIDevice* This,INT *priority) {
2285
- return This->lpVtbl->GetGPUThreadPriority(This,priority);
2286
-}
2287
-#endif
2288
-#endif
2289
-
2290
-#endif
2291
-
2292
-HRESULT STDMETHODCALLTYPE IDXGIDevice_GetAdapter_Proxy(
2293
- IDXGIDevice* This,
2294
- IDXGIAdapter **adapter);
2295
-void __RPC_STUB IDXGIDevice_GetAdapter_Stub(
2296
- IRpcStubBuffer* This,
2297
- IRpcChannelBuffer* pRpcChannelBuffer,
2298
- PRPC_MESSAGE pRpcMessage,
2299
- DWORD* pdwStubPhase);
2300
-HRESULT STDMETHODCALLTYPE IDXGIDevice_CreateSurface_Proxy(
2301
- IDXGIDevice* This,
2302
- const DXGI_SURFACE_DESC *desc,
2303
- UINT surface_count,
2304
- DXGI_USAGE usage,
2305
- const DXGI_SHARED_RESOURCE *shared_resource,
2306
- IDXGISurface **surface);
2307
-void __RPC_STUB IDXGIDevice_CreateSurface_Stub(
2308
- IRpcStubBuffer* This,
2309
- IRpcChannelBuffer* pRpcChannelBuffer,
2310
- PRPC_MESSAGE pRpcMessage,
2311
- DWORD* pdwStubPhase);
2312
-HRESULT STDMETHODCALLTYPE IDXGIDevice_QueryResourceResidency_Proxy(
2313
- IDXGIDevice* This,
2314
- IUnknown *const *resources,
2315
- DXGI_RESIDENCY *residency,
2316
- UINT resource_count);
2317
-void __RPC_STUB IDXGIDevice_QueryResourceResidency_Stub(
2318
- IRpcStubBuffer* This,
2319
- IRpcChannelBuffer* pRpcChannelBuffer,
2320
- PRPC_MESSAGE pRpcMessage,
2321
- DWORD* pdwStubPhase);
2322
-HRESULT STDMETHODCALLTYPE IDXGIDevice_SetGPUThreadPriority_Proxy(
2323
- IDXGIDevice* This,
2324
- INT priority);
2325
-void __RPC_STUB IDXGIDevice_SetGPUThreadPriority_Stub(
2326
- IRpcStubBuffer* This,
2327
- IRpcChannelBuffer* pRpcChannelBuffer,
2328
- PRPC_MESSAGE pRpcMessage,
2329
- DWORD* pdwStubPhase);
2330
-HRESULT STDMETHODCALLTYPE IDXGIDevice_GetGPUThreadPriority_Proxy(
2331
- IDXGIDevice* This,
2332
- INT *priority);
2333
-void __RPC_STUB IDXGIDevice_GetGPUThreadPriority_Stub(
2334
- IRpcStubBuffer* This,
2335
- IRpcChannelBuffer* pRpcChannelBuffer,
2336
- PRPC_MESSAGE pRpcMessage,
2337
- DWORD* pdwStubPhase);
2338
-
2339
-#endif /* __IDXGIDevice_INTERFACE_DEFINED__ */
2340
-
2341
-typedef enum DXGI_ADAPTER_FLAG {
2342
- DXGI_ADAPTER_FLAG_NONE = 0,
2343
- DXGI_ADAPTER_FLAG_REMOTE = 1,
2344
- DXGI_ADAPTER_FLAG_FORCE_DWORD = 0xffffffff
2345
-} DXGI_ADAPTER_FLAG;
2346
-typedef struct DXGI_ADAPTER_DESC1 {
2347
- WCHAR Description[128];
2348
- UINT VendorId;
2349
- UINT DeviceId;
2350
- UINT SubSysId;
2351
- UINT Revision;
2352
- SIZE_T DedicatedVideoMemory;
2353
- SIZE_T DedicatedSystemMemory;
2354
- SIZE_T SharedSystemMemory;
2355
- LUID AdapterLuid;
2356
- UINT Flags;
2357
-} DXGI_ADAPTER_DESC1;
2358
-/*****************************************************************************
2359
- * IDXGIAdapter1 interface
2360
- */
2361
-#ifndef __IDXGIAdapter1_INTERFACE_DEFINED__
2362
-#define __IDXGIAdapter1_INTERFACE_DEFINED__
2363
-
2364
-DEFINE_GUID(IID_IDXGIAdapter1, 0x29038f61, 0x3839, 0x4626, 0x91,0xfd, 0x08,0x68,0x79,0x01,0x1a,0x05);
2365
-#if defined(__cplusplus) && !defined(CINTERFACE)
2366
-MIDL_INTERFACE("29038f61-3839-4626-91fd-086879011a05")
2367
-IDXGIAdapter1 : public IDXGIAdapter
2368
-{
2369
- virtual HRESULT STDMETHODCALLTYPE GetDesc1(
2370
- DXGI_ADAPTER_DESC1 *pDesc) = 0;
2371
-
2372
-};
2373
-#ifdef __CRT_UUID_DECL
2374
-__CRT_UUID_DECL(IDXGIAdapter1, 0x29038f61, 0x3839, 0x4626, 0x91,0xfd, 0x08,0x68,0x79,0x01,0x1a,0x05)
2375
-#endif
2376
-#else
2377
-typedef struct IDXGIAdapter1Vtbl {
2378
- BEGIN_INTERFACE
2379
-
2380
- /*** IUnknown methods ***/
2381
- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
2382
- IDXGIAdapter1* This,
2383
- REFIID riid,
2384
- void **ppvObject);
2385
-
2386
- ULONG (STDMETHODCALLTYPE *AddRef)(
2387
- IDXGIAdapter1* This);
2388
-
2389
- ULONG (STDMETHODCALLTYPE *Release)(
2390
- IDXGIAdapter1* This);
2391
-
2392
- /*** IDXGIObject methods ***/
2393
- HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
2394
- IDXGIAdapter1* This,
2395
- REFGUID guid,
2396
- UINT data_size,
2397
- const void *data);
2398
-
2399
- HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
2400
- IDXGIAdapter1* This,
2401
- REFGUID guid,
2402
- const IUnknown *object);
2403
-
2404
- HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
2405
- IDXGIAdapter1* This,
2406
- REFGUID guid,
2407
- UINT *data_size,
2408
- void *data);
2409
-
2410
- HRESULT (STDMETHODCALLTYPE *GetParent)(
2411
- IDXGIAdapter1* This,
2412
- REFIID riid,
2413
- void **parent);
2414
-
2415
- /*** IDXGIAdapter methods ***/
2416
- HRESULT (STDMETHODCALLTYPE *EnumOutputs)(
2417
- IDXGIAdapter1* This,
2418
- UINT output_idx,
2419
- IDXGIOutput **output);
2420
-
2421
- HRESULT (STDMETHODCALLTYPE *GetDesc)(
2422
- IDXGIAdapter1* This,
2423
- DXGI_ADAPTER_DESC *desc);
2424
-
2425
- HRESULT (STDMETHODCALLTYPE *CheckInterfaceSupport)(
2426
- IDXGIAdapter1* This,
2427
- REFGUID guid,
2428
- LARGE_INTEGER *umd_version);
2429
-
2430
- /*** IDXGIAdapter1 methods ***/
2431
- HRESULT (STDMETHODCALLTYPE *GetDesc1)(
2432
- IDXGIAdapter1* This,
2433
- DXGI_ADAPTER_DESC1 *pDesc);
2434
-
2435
- END_INTERFACE
2436
-} IDXGIAdapter1Vtbl;
2437
-interface IDXGIAdapter1 {
2438
- CONST_VTBL IDXGIAdapter1Vtbl* lpVtbl;
2439
-};
2440
-
2441
-#ifdef COBJMACROS
2442
-#ifndef WIDL_C_INLINE_WRAPPERS
2443
-/*** IUnknown methods ***/
2444
-#define IDXGIAdapter1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
2445
-#define IDXGIAdapter1_AddRef(This) (This)->lpVtbl->AddRef(This)
2446
-#define IDXGIAdapter1_Release(This) (This)->lpVtbl->Release(This)
2447
-/*** IDXGIObject methods ***/
2448
-#define IDXGIAdapter1_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
2449
-#define IDXGIAdapter1_SetPrivateDataInterface(This,guid,object) (This)->lpVtbl->SetPrivateDataInterface(This,guid,object)
2450
-#define IDXGIAdapter1_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
2451
-#define IDXGIAdapter1_GetParent(This,riid,parent) (This)->lpVtbl->GetParent(This,riid,parent)
2452
-/*** IDXGIAdapter methods ***/
2453
-#define IDXGIAdapter1_EnumOutputs(This,output_idx,output) (This)->lpVtbl->EnumOutputs(This,output_idx,output)
2454
-#define IDXGIAdapter1_GetDesc(This,desc) (This)->lpVtbl->GetDesc(This,desc)
2455
-#define IDXGIAdapter1_CheckInterfaceSupport(This,guid,umd_version) (This)->lpVtbl->CheckInterfaceSupport(This,guid,umd_version)
2456
-/*** IDXGIAdapter1 methods ***/
2457
-#define IDXGIAdapter1_GetDesc1(This,pDesc) (This)->lpVtbl->GetDesc1(This,pDesc)
2458
-#else
2459
-/*** IUnknown methods ***/
2460
-static FORCEINLINE HRESULT IDXGIAdapter1_QueryInterface(IDXGIAdapter1* This,REFIID riid,void **ppvObject) {
2461
- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
2462
-}
2463
-static FORCEINLINE ULONG IDXGIAdapter1_AddRef(IDXGIAdapter1* This) {
2464
- return This->lpVtbl->AddRef(This);
2465
-}
2466
-static FORCEINLINE ULONG IDXGIAdapter1_Release(IDXGIAdapter1* This) {
2467
- return This->lpVtbl->Release(This);
2468
-}
2469
-/*** IDXGIObject methods ***/
2470
-static FORCEINLINE HRESULT IDXGIAdapter1_SetPrivateData(IDXGIAdapter1* This,REFGUID guid,UINT data_size,const void *data) {
2471
- return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
2472
-}
2473
-static FORCEINLINE HRESULT IDXGIAdapter1_SetPrivateDataInterface(IDXGIAdapter1* This,REFGUID guid,const IUnknown *object) {
2474
- return This->lpVtbl->SetPrivateDataInterface(This,guid,object);
2475
-}
2476
-static FORCEINLINE HRESULT IDXGIAdapter1_GetPrivateData(IDXGIAdapter1* This,REFGUID guid,UINT *data_size,void *data) {
2477
- return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
2478
-}
2479
-static FORCEINLINE HRESULT IDXGIAdapter1_GetParent(IDXGIAdapter1* This,REFIID riid,void **parent) {
2480
- return This->lpVtbl->GetParent(This,riid,parent);
2481
-}
2482
-/*** IDXGIAdapter methods ***/
2483
-static FORCEINLINE HRESULT IDXGIAdapter1_EnumOutputs(IDXGIAdapter1* This,UINT output_idx,IDXGIOutput **output) {
2484
- return This->lpVtbl->EnumOutputs(This,output_idx,output);
2485
-}
2486
-static FORCEINLINE HRESULT IDXGIAdapter1_GetDesc(IDXGIAdapter1* This,DXGI_ADAPTER_DESC *desc) {
2487
- return This->lpVtbl->GetDesc(This,desc);
2488
-}
2489
-static FORCEINLINE HRESULT IDXGIAdapter1_CheckInterfaceSupport(IDXGIAdapter1* This,REFGUID guid,LARGE_INTEGER *umd_version) {
2490
- return This->lpVtbl->CheckInterfaceSupport(This,guid,umd_version);
2491
-}
2492
-/*** IDXGIAdapter1 methods ***/
2493
-static FORCEINLINE HRESULT IDXGIAdapter1_GetDesc1(IDXGIAdapter1* This,DXGI_ADAPTER_DESC1 *pDesc) {
2494
- return This->lpVtbl->GetDesc1(This,pDesc);
2495
-}
2496
-#endif
2497
-#endif
2498
-
2499
-#endif
2500
-
2501
-HRESULT STDMETHODCALLTYPE IDXGIAdapter1_GetDesc1_Proxy(
2502
- IDXGIAdapter1* This,
2503
- DXGI_ADAPTER_DESC1 *pDesc);
2504
-void __RPC_STUB IDXGIAdapter1_GetDesc1_Stub(
2505
- IRpcStubBuffer* This,
2506
- IRpcChannelBuffer* pRpcChannelBuffer,
2507
- PRPC_MESSAGE pRpcMessage,
2508
- DWORD* pdwStubPhase);
2509
-
2510
-#endif /* __IDXGIAdapter1_INTERFACE_DEFINED__ */
2511
-
2512
-/*****************************************************************************
2513
- * IDXGIFactory1 interface
2514
- */
2515
-#ifndef __IDXGIFactory1_INTERFACE_DEFINED__
2516
-#define __IDXGIFactory1_INTERFACE_DEFINED__
2517
-
2518
-DEFINE_GUID(IID_IDXGIFactory1, 0x770aae78, 0xf26f, 0x4dba, 0xa8,0x29, 0x25,0x3c,0x83,0xd1,0xb3,0x87);
2519
-#if defined(__cplusplus) && !defined(CINTERFACE)
2520
-MIDL_INTERFACE("770aae78-f26f-4dba-a829-253c83d1b387")
2521
-IDXGIFactory1 : public IDXGIFactory
2522
-{
2523
- virtual HRESULT STDMETHODCALLTYPE EnumAdapters1(
2524
- UINT Adapter,
2525
- IDXGIAdapter1 **ppAdapter) = 0;
2526
-
2527
- virtual WINBOOL STDMETHODCALLTYPE IsCurrent(
2528
- ) = 0;
2529
-
2530
-};
2531
-#ifdef __CRT_UUID_DECL
2532
-__CRT_UUID_DECL(IDXGIFactory1, 0x770aae78, 0xf26f, 0x4dba, 0xa8,0x29, 0x25,0x3c,0x83,0xd1,0xb3,0x87)
2533
-#endif
2534
-#else
2535
-typedef struct IDXGIFactory1Vtbl {
2536
- BEGIN_INTERFACE
2537
-
2538
- /*** IUnknown methods ***/
2539
- HRESULT (STDMETHODCALLTYPE *QueryInterface)(
2540
- IDXGIFactory1* This,
2541
- REFIID riid,
2542
- void **ppvObject);
2543
-
2544
- ULONG (STDMETHODCALLTYPE *AddRef)(
2545
- IDXGIFactory1* This);
2546
-
2547
- ULONG (STDMETHODCALLTYPE *Release)(
2548
- IDXGIFactory1* This);
2549
-
2550
- /*** IDXGIObject methods ***/
2551
- HRESULT (STDMETHODCALLTYPE *SetPrivateData)(
2552
- IDXGIFactory1* This,
2553
- REFGUID guid,
2554
- UINT data_size,
2555
- const void *data);
2556
-
2557
- HRESULT (STDMETHODCALLTYPE *SetPrivateDataInterface)(
2558
- IDXGIFactory1* This,
2559
- REFGUID guid,
2560
- const IUnknown *object);
2561
-
2562
- HRESULT (STDMETHODCALLTYPE *GetPrivateData)(
2563
- IDXGIFactory1* This,
2564
- REFGUID guid,
2565
- UINT *data_size,
2566
- void *data);
2567
-
2568
- HRESULT (STDMETHODCALLTYPE *GetParent)(
2569
- IDXGIFactory1* This,
2570
- REFIID riid,
2571
- void **parent);
2572
-
2573
- /*** IDXGIFactory methods ***/
2574
- HRESULT (STDMETHODCALLTYPE *EnumAdapters)(
2575
- IDXGIFactory1* This,
2576
- UINT adapter_idx,
2577
- IDXGIAdapter **adapter);
2578
-
2579
- HRESULT (STDMETHODCALLTYPE *MakeWindowAssociation)(
2580
- IDXGIFactory1* This,
2581
- HWND window,
2582
- UINT flags);
2583
-
2584
- HRESULT (STDMETHODCALLTYPE *GetWindowAssociation)(
2585
- IDXGIFactory1* This,
2586
- HWND *window);
2587
-
2588
- HRESULT (STDMETHODCALLTYPE *CreateSwapChain)(
2589
- IDXGIFactory1* This,
2590
- IUnknown *device,
2591
- DXGI_SWAP_CHAIN_DESC *desc,
2592
- IDXGISwapChain **swapchain);
2593
-
2594
- HRESULT (STDMETHODCALLTYPE *CreateSoftwareAdapter)(
2595
- IDXGIFactory1* This,
2596
- HMODULE swrast,
2597
- IDXGIAdapter **adapter);
2598
-
2599
- /*** IDXGIFactory1 methods ***/
2600
- HRESULT (STDMETHODCALLTYPE *EnumAdapters1)(
2601
- IDXGIFactory1* This,
2602
- UINT Adapter,
2603
- IDXGIAdapter1 **ppAdapter);
2604
-
2605
- WINBOOL (STDMETHODCALLTYPE *IsCurrent)(
2606
- IDXGIFactory1* This);
2607
-
2608
- END_INTERFACE
2609
-} IDXGIFactory1Vtbl;
2610
-interface IDXGIFactory1 {
2611
- CONST_VTBL IDXGIFactory1Vtbl* lpVtbl;
2612
-};
2613
-
2614
-#ifdef COBJMACROS
2615
-#ifndef WIDL_C_INLINE_WRAPPERS
2616
-/*** IUnknown methods ***/
2617
-#define IDXGIFactory1_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
2618
-#define IDXGIFactory1_AddRef(This) (This)->lpVtbl->AddRef(This)
2619
-#define IDXGIFactory1_Release(This) (This)->lpVtbl->Release(This)
2620
-/*** IDXGIObject methods ***/
2621
-#define IDXGIFactory1_SetPrivateData(This,guid,data_size,data) (This)->lpVtbl->SetPrivateData(This,guid,data_size,data)
2622
-#define IDXGIFactory1_SetPrivateDataInterface(This,guid,object) (This)->lpVtbl->SetPrivateDataInterface(This,guid,object)
2623
-#define IDXGIFactory1_GetPrivateData(This,guid,data_size,data) (This)->lpVtbl->GetPrivateData(This,guid,data_size,data)
2624
-#define IDXGIFactory1_GetParent(This,riid,parent) (This)->lpVtbl->GetParent(This,riid,parent)
2625
-/*** IDXGIFactory methods ***/
2626
-#define IDXGIFactory1_EnumAdapters(This,adapter_idx,adapter) (This)->lpVtbl->EnumAdapters(This,adapter_idx,adapter)
2627
-#define IDXGIFactory1_MakeWindowAssociation(This,window,flags) (This)->lpVtbl->MakeWindowAssociation(This,window,flags)
2628
-#define IDXGIFactory1_GetWindowAssociation(This,window) (This)->lpVtbl->GetWindowAssociation(This,window)
2629
-#define IDXGIFactory1_CreateSwapChain(This,device,desc,swapchain) (This)->lpVtbl->CreateSwapChain(This,device,desc,swapchain)
2630
-#define IDXGIFactory1_CreateSoftwareAdapter(This,swrast,adapter) (This)->lpVtbl->CreateSoftwareAdapter(This,swrast,adapter)
2631
-/*** IDXGIFactory1 methods ***/
2632
-#define IDXGIFactory1_EnumAdapters1(This,Adapter,ppAdapter) (This)->lpVtbl->EnumAdapters1(This,Adapter,ppAdapter)
2633
-#define IDXGIFactory1_IsCurrent(This) (This)->lpVtbl->IsCurrent(This)
2634
-#else
2635
-/*** IUnknown methods ***/
2636
-static FORCEINLINE HRESULT IDXGIFactory1_QueryInterface(IDXGIFactory1* This,REFIID riid,void **ppvObject) {
2637
- return This->lpVtbl->QueryInterface(This,riid,ppvObject);
2638
-}
2639
-static FORCEINLINE ULONG IDXGIFactory1_AddRef(IDXGIFactory1* This) {
2640
- return This->lpVtbl->AddRef(This);
2641
-}
2642
-static FORCEINLINE ULONG IDXGIFactory1_Release(IDXGIFactory1* This) {
2643
- return This->lpVtbl->Release(This);
2644
-}
2645
-/*** IDXGIObject methods ***/
2646
-static FORCEINLINE HRESULT IDXGIFactory1_SetPrivateData(IDXGIFactory1* This,REFGUID guid,UINT data_size,const void *data) {
2647
- return This->lpVtbl->SetPrivateData(This,guid,data_size,data);
2648
-}
2649
-static FORCEINLINE HRESULT IDXGIFactory1_SetPrivateDataInterface(IDXGIFactory1* This,REFGUID guid,const IUnknown *object) {
2650
- return This->lpVtbl->SetPrivateDataInterface(This,guid,object);
2651
-}
2652
-static FORCEINLINE HRESULT IDXGIFactory1_GetPrivateData(IDXGIFactory1* This,REFGUID guid,UINT *data_size,void *data) {
2653
- return This->lpVtbl->GetPrivateData(This,guid,data_size,data);
2654
-}
2655
-static FORCEINLINE HRESULT IDXGIFactory1_GetParent(IDXGIFactory1* This,REFIID riid,void **parent) {
2656
- return This->lpVtbl->GetParent(This,riid,parent);
2657
-}
2658
-/*** IDXGIFactory methods ***/
2659
-static FORCEINLINE HRESULT IDXGIFactory1_EnumAdapters(IDXGIFactory1* This,UINT adapter_idx,IDXGIAdapter **adapter) {
2660
- return This->lpVtbl->EnumAdapters(This,adapter_idx,adapter);
2661
-}
2662
-static FORCEINLINE HRESULT IDXGIFactory1_MakeWindowAssociation(IDXGIFactory1* This,HWND window,UINT flags) {
2663
- return This->lpVtbl->MakeWindowAssociation(This,window,flags);
2664
-}
2665
-static FORCEINLINE HRESULT IDXGIFactory1_GetWindowAssociation(IDXGIFactory1* This,HWND *window) {
2666
- return This->lpVtbl->GetWindowAssociation(This,window);
2667
-}
2668
-static FORCEINLINE HRESULT IDXGIFactory1_CreateSwapChain(IDXGIFactory1* This,IUnknown *device,DXGI_SWAP_CHAIN_DESC *desc,IDXGISwapChain **swapchain) {
2669
- return This->lpVtbl->CreateSwapChain(This,device,desc,swapchain);
2670
-}
2671
-static FORCEINLINE HRESULT IDXGIFactory1_CreateSoftwareAdapter(IDXGIFactory1* This,HMODULE swrast,IDXGIAdapter **adapter) {
2672
- return This->lpVtbl->CreateSoftwareAdapter(This,swrast,adapter);
2673
-}
2674
-/*** IDXGIFactory1 methods ***/
2675
-static FORCEINLINE HRESULT IDXGIFactory1_EnumAdapters1(IDXGIFactory1* This,UINT Adapter,IDXGIAdapter1 **ppAdapter) {
2676
- return This->lpVtbl->EnumAdapters1(This,Adapter,ppAdapter);
2677
-}
2678
-static FORCEINLINE WINBOOL IDXGIFactory1_IsCurrent(IDXGIFactory1* This) {
2679
- return This->lpVtbl->IsCurrent(This);
2680
-}
2681
-#endif
2682
-#endif
2683
-
2684
-#endif
2685
-
2686
-HRESULT STDMETHODCALLTYPE IDXGIFactory1_EnumAdapters1_Proxy(
2687
- IDXGIFactory1* This,
2688
- UINT Adapter,
2689
- IDXGIAdapter1 **ppAdapter);
2690
-void __RPC_STUB IDXGIFactory1_EnumAdapters1_Stub(
2691
- IRpcStubBuffer* This,
2692
- IRpcChannelBuffer* pRpcChannelBuffer,
2693
- PRPC_MESSAGE pRpcMessage,
2694
- DWORD* pdwStubPhase);
2695
-WINBOOL STDMETHODCALLTYPE IDXGIFactory1_IsCurrent_Proxy(
2696
- IDXGIFactory1* This);
2697
-void __RPC_STUB IDXGIFactory1_IsCurrent_Stub(
2698
- IRpcStubBuffer* This,
2699
- IRpcChannelBuffer* pRpcChannelBuffer,
2700
- PRPC_MESSAGE pRpcMessage,
2701
- DWORD* pdwStubPhase);
2702
-
2703
-#endif /* __IDXGIFactory1_INTERFACE_DEFINED__ */
2704
-
2705
-/* Begin additional prototypes for all interfaces */
2706
-
2707
-
2708
-/* End additional prototypes */
2709
-
2710
-#ifdef __cplusplus
2711
-}
2712
-#endif
2713
-
2714
-#endif /* __dxgi_h__ */
2715
obs-studio-0.8.2+git20150211.6099c65.tar.xz/.mailmap
Added
7
1
2
+Jim <obs.jim@gmail.com>
3
+Zachary Lund <admin@computerquip.com>
4
+Benjamin Klettbach <b.klettbach@gmail.com>
5
+BtbN <btbn@btbn.de>
6
+John Bradley <jrb@turrettech.com>
7
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/CMakeLists.txt -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/CMakeLists.txt
Changed
21
1
2
3
if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG)
4
set(CMAKE_CXX_FLAGS "-Wall -Wextra -Wno-unused-function -Werror-implicit-function-declaration -Wno-missing-field-initializers ${CMAKE_CXX_FLAGS} -fno-strict-aliasing")
5
- set(CMAKE_C_FLAGS "-Wall -Wextra -Wno-unused-function -Werror-implicit-function-declaration -Wno-missing-field-initializers ${CMAKE_C_FLAGS} -std=gnu99 -fno-strict-aliasing")
6
+ set(CMAKE_C_FLAGS "-Wall -Wextra -Wno-unused-function -Werror-implicit-function-declaration -Wno-missing-braces -Wno-missing-field-initializers ${CMAKE_C_FLAGS} -std=gnu99 -fno-strict-aliasing")
7
8
option(USE_LIBC++ "Use libc++ instead of libstdc++" ${APPLE})
9
if(USE_LIBC++)
10
11
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} /SAFESEH:NO")
12
endif()
13
else()
14
+ if(MINGW)
15
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_WIN32_WINNT=0x0600 -DWINVER=0x0600")
16
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32_WINNT=0x0600 -DWINVER=0x0600")
17
+ endif()
18
set(CMAKE_C_FLAGS_DEBUG "-DDEBUG=1 -D_DEBUG=1 ${CMAKE_C_FLAGS_DEBUG}")
19
set(CMAKE_CXX_FLAGS_DEBUG "-DDEBUG=1 -D_DEBUG=1 ${CMAKE_C_FLAGS_DEBUG}")
20
endif()
21
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/INSTALL -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/INSTALL
Changed
16
1
2
This will create a .dmg file with an app bundle inside.
3
4
5
-Linux (Ubuntu 14.04 installation)
6
+Linux (Ubuntu 14.04/14.10 installation)
7
- FFmpeg is required. If you do not have the FFmpeg installed (if you're not
8
sure, then you probably don't have it), you can get it with the following
9
commands:
10
11
- sudo add-apt-repository ppa:jon-severinsson/ffmpeg
12
+ sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next
13
sudo apt-get update && sudo apt-get install ffmpeg
14
15
- Then you can install OBS with the following commands:
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/cmake/Modules/CopyMSVCBins.cmake -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/cmake/Modules/CopyMSVCBins.cmake
Changed
12
1
2
"${FFMPEG_avcodec_INCLUDE_DIR}/../bin/zlib*.dll"
3
"${FFMPEG_avcodec_INCLUDE_DIR}/bin/libbz2*.dll"
4
"${FFMPEG_avcodec_INCLUDE_DIR}/bin/zlib*.dll"
5
+ "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/libopus*.dll"
6
+ "${FFMPEG_avcodec_INCLUDE_DIR}/../bin/opus*.dll"
7
+ "${FFMPEG_avcodec_INCLUDE_DIR}/bin/libopus*.dll"
8
+ "${FFMPEG_avcodec_INCLUDE_DIR}/bin/opus*.dll"
9
"${FFMPEG_avutil_INCLUDE_DIR}/bin${_bin_suffix}/avutil-*.dll"
10
"${FFMPEG_avcodec_INCLUDE_DIR}/bin${_bin_suffix}/avcodec-*.dll"
11
"${FFMPEG_avformat_INCLUDE_DIR}/bin${_bin_suffix}/avformat-*.dll"
12
obs-studio-0.8.2+git20150211.6099c65.tar.xz/cmake/Modules/FindJack.cmake
Added
84
1
2
+# - Try to find jack-2.6
3
+# Once done this will define
4
+#
5
+# JACK_FOUND - system has jack
6
+# JACK_INCLUDE_DIRS - the jack include directory
7
+# JACK_LIBRARIES - Link these to use jack
8
+# JACK_DEFINITIONS - Compiler switches required for using jack
9
+#
10
+# Copyright (c) 2008 Andreas Schneider <mail@cynapses.org>
11
+# Modified for other libraries by Lasse Kärkkäinen <tronic>
12
+#
13
+# Redistribution and use is allowed according to the terms of the New
14
+# BSD license.
15
+# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
16
+#
17
+
18
+if (JACK_LIBRARIES AND JACK_INCLUDE_DIRS)
19
+ # in cache already
20
+ set(JACK_FOUND TRUE)
21
+else (JACK_LIBRARIES AND JACK_INCLUDE_DIRS)
22
+ # use pkg-config to get the directories and then use these values
23
+ # in the FIND_PATH() and FIND_LIBRARY() calls
24
+ if (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4)
25
+ include(UsePkgConfig)
26
+ pkgconfig(jack _JACK_INCLUDEDIR _JACK_LIBDIR _JACK_LDFLAGS _JACK_CFLAGS)
27
+ else (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4)
28
+ find_package(PkgConfig)
29
+ if (PKG_CONFIG_FOUND)
30
+ pkg_check_modules(_JACK jack)
31
+ endif (PKG_CONFIG_FOUND)
32
+ endif (${CMAKE_MAJOR_VERSION} EQUAL 2 AND ${CMAKE_MINOR_VERSION} EQUAL 4)
33
+ find_path(JACK_INCLUDE_DIR
34
+ NAMES
35
+ jack/jack.h
36
+ PATHS
37
+ ${_JACK_INCLUDEDIR}
38
+ /usr/include
39
+ /usr/local/include
40
+ /opt/local/include
41
+ /sw/include
42
+ )
43
+
44
+ find_library(JACK_LIBRARY
45
+ NAMES
46
+ jack
47
+ PATHS
48
+ ${_JACK_LIBDIR}
49
+ /usr/lib
50
+ /usr/local/lib
51
+ /opt/local/lib
52
+ /sw/lib
53
+ )
54
+
55
+ if (JACK_LIBRARY AND JACK_INCLUDE_DIR)
56
+ set(JACK_FOUND TRUE)
57
+
58
+ set(JACK_INCLUDE_DIRS
59
+ ${JACK_INCLUDE_DIR}
60
+ )
61
+
62
+ set(JACK_LIBRARIES
63
+ ${JACK_LIBRARIES}
64
+ ${JACK_LIBRARY}
65
+ )
66
+
67
+ endif (JACK_LIBRARY AND JACK_INCLUDE_DIR)
68
+
69
+ if (JACK_FOUND)
70
+ if (NOT JACK_FIND_QUIETLY)
71
+ message(STATUS "Found jack: ${JACK_LIBRARY}")
72
+ endif (NOT JACK_FIND_QUIETLY)
73
+ else (JACK_FOUND)
74
+ if (JACK_FIND_REQUIRED)
75
+ message(FATAL_ERROR "Could not find JACK")
76
+ endif (JACK_FIND_REQUIRED)
77
+ endif (JACK_FOUND)
78
+
79
+ # show the JACK_INCLUDE_DIRS and JACK_LIBRARIES variables only in the advanced view
80
+ mark_as_advanced(JACK_INCLUDE_DIRS JACK_LIBRARIES)
81
+
82
+endif (JACK_LIBRARIES AND JACK_INCLUDE_DIRS)
83
+
84
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/cmake/Modules/ObsCpack.cmake -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/cmake/Modules/ObsCpack.cmake
Changed
28
1
2
set(CPACK_PACKAGE_VERSION_PATCH "1")
3
set(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
4
5
-if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
6
- execute_process(COMMAND git describe --always --tags --dirty=-modified
7
- OUTPUT_VARIABLE OBS_VERSION
8
- WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
9
- OUTPUT_STRIP_TRAILING_WHITESPACE)
10
+if(NOT DEFINED OBS_VERSION_OVERRIDE)
11
+ if(EXISTS "${CMAKE_SOURCE_DIR}/.git")
12
+ execute_process(COMMAND git describe --always --tags --dirty=-modified
13
+ OUTPUT_VARIABLE OBS_VERSION
14
+ WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
15
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
16
+ else()
17
+ set(OBS_VERSION "${CPACK_PACKAGE_VERSION}")
18
+ endif()
19
else()
20
- set(OBS_VERSION "${CPACK_PACKAGE_VERSION}")
21
+ set(OBS_VERSION "${OBS_VERSION_OVERRIDE}")
22
endif()
23
24
+MESSAGE(STATUS "OBS_VERSION: ${OBS_VERSION}")
25
26
if(INSTALLER_RUN)
27
set(CPACK_PACKAGE_EXECUTABLES
28
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/deps/CMakeLists.txt -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/deps/CMakeLists.txt
Changed
10
1
2
3
+if(NOT MINGW)
4
add_subdirectory(w32-pthreads)
5
+endif()
6
+
7
add_subdirectory(glad)
8
add_subdirectory(ipc-util)
9
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/deps/glad/CMakeLists.txt -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/deps/glad/CMakeLists.txt
Changed
13
1
2
3
if(NOT MSVC)
4
target_compile_options(glad
5
- PRIVATE -DPIC -fPIC -fvisibility=hidden)
6
+ PRIVATE -DPIC -fvisibility=hidden)
7
+ if(NOT MINGW)
8
+ target_compile_options(glad PRIVATE -fPIC)
9
+ endif()
10
endif()
11
12
if(NOT WIN32 AND NOT APPLE)
13
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/deps/glad/src/glad_wgl.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/deps/glad/src/glad_wgl.c
Changed
12
1
2
}
3
4
static void find_coreWGL(HDC hdc) {
5
- int major = 9;
6
- int minor = 9;
7
+ //int major = 9;
8
+ //int minor = 9;
9
GLADWGLhdc = hdc;
10
}
11
12
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs-d3d11/d3d11-duplicator.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs-d3d11/d3d11-duplicator.cpp
Changed
10
1
2
}
3
4
gs_duplicator::gs_duplicator(gs_device_t *device_, int monitor_idx)
5
- : device(device_), texture(nullptr)
6
+ : texture(nullptr), device(device_)
7
{
8
ComPtr<IDXGIOutput1> output1;
9
ComPtr<IDXGIOutput> output;
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs-d3d11/d3d11-indexbuffer.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs-d3d11/d3d11-indexbuffer.cpp
Changed
14
1
2
gs_index_buffer::gs_index_buffer(gs_device_t *device, enum gs_index_type type,
3
void *indices, size_t num, uint32_t flags)
4
: device (device),
5
+ dynamic ((flags & GS_DYNAMIC) != 0),
6
type (type),
7
- indices (indices),
8
num (num),
9
- dynamic ((flags & GS_DYNAMIC) != 0)
10
+ indices (indices)
11
{
12
switch (type) {
13
case GS_UNSIGNED_SHORT: indexSize = 2; break;
14
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs-d3d11/d3d11-samplerstate.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs-d3d11/d3d11-samplerstate.cpp
Changed
9
1
2
******************************************************************************/
3
4
#include <graphics/vec4.h>
5
+#include <float.h>
6
7
#include "d3d11-subsystem.hpp"
8
9
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs-d3d11/d3d11-shader.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs-d3d11/d3d11-shader.cpp
Changed
16
1
2
case GS_SHADER_PARAM_VEC2: size = sizeof(vec2); break;
3
case GS_SHADER_PARAM_VEC3: size = sizeof(float)*3; break;
4
case GS_SHADER_PARAM_VEC4: size = sizeof(vec4); break;
5
- case GS_SHADER_PARAM_MATRIX4X4: size = sizeof(float)*4*4;
6
+ case GS_SHADER_PARAM_MATRIX4X4:
7
+ size = sizeof(float)*4*4;
8
+ break;
9
+ case GS_SHADER_PARAM_TEXTURE:
10
+ case GS_SHADER_PARAM_STRING:
11
+ case GS_SHADER_PARAM_UNKNOWN:
12
+ continue;
13
}
14
15
/* checks to see if this constant needs to start at a new
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs-d3d11/d3d11-shaderprocessor.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs-d3d11/d3d11-shaderprocessor.cpp
Changed
12
1
2
}
3
4
gs_shader_param::gs_shader_param(shader_var &var, uint32_t &texCounter)
5
- : type (get_shader_param_type(var.type)),
6
- name (var.name),
7
+ : name (var.name),
8
+ type (get_shader_param_type(var.type)),
9
textureID (texCounter),
10
arrayCount (var.array_count),
11
changed (false)
12
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs-d3d11/d3d11-subsystem.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs-d3d11/d3d11-subsystem.cpp
Changed
61
1
2
along with this program. If not, see <http://www.gnu.org/licenses/>.
3
******************************************************************************/
4
5
-#include <inttypes.h>
6
+#include <cinttypes>
7
#include <util/base.h>
8
#include <util/platform.h>
9
#include <graphics/matrix3.h>
10
11
int ver = 49;
12
13
while (ver > 30) {
14
- sprintf_s(d3dcompiler, 40, "D3DCompiler_%02d.dll", ver);
15
+ sprintf(d3dcompiler, "D3DCompiler_%02d.dll", ver);
16
17
HMODULE module = LoadLibraryA(d3dcompiler);
18
if (module) {
19
20
wstring adapterName;
21
DXGI_SWAP_CHAIN_DESC swapDesc;
22
DXGI_ADAPTER_DESC desc;
23
- D3D_FEATURE_LEVEL levelUsed;
24
- HRESULT hr;
25
+ D3D_FEATURE_LEVEL levelUsed = D3D_FEATURE_LEVEL_9_3;
26
+ HRESULT hr = 0;
27
28
make_swap_desc(swapDesc, data);
29
30
31
"swap chain", hr);
32
33
blog(LOG_INFO, "D3D11 loaded sucessfully, feature level used: %u",
34
- (uint32_t)levelUsed);
35
+ (unsigned int)levelUsed);
36
37
defaultSwap.device = this;
38
defaultSwap.hwnd = (HWND)data->window.hwnd;
39
40
}
41
42
gs_device::gs_device(const gs_init_data *data)
43
- : curRenderTarget (NULL),
44
- curZStencilBuffer (NULL),
45
- curRenderSide (0),
46
- curIndexBuffer (NULL),
47
- curVertexBuffer (NULL),
48
- curVertexShader (NULL),
49
- curPixelShader (NULL),
50
- curSwapChain (&defaultSwap),
51
- zstencilStateChanged (true),
52
- rasterStateChanged (true),
53
- blendStateChanged (true),
54
- curDepthStencilState (NULL),
55
- curRasterState (NULL),
56
- curBlendState (NULL),
57
+ : curSwapChain (&defaultSwap),
58
curToplogy (D3D11_PRIMITIVE_TOPOLOGY_UNDEFINED)
59
{
60
ComPtr<IDXGIAdapter1> adapter;
61
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs-d3d11/d3d11-subsystem.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs-d3d11/d3d11-subsystem.hpp
Changed
172
1
2
static inline DXGI_FORMAT ConvertGSTextureFormat(gs_color_format format)
3
{
4
switch (format) {
5
+ case GS_UNKNOWN: return DXGI_FORMAT_UNKNOWN;
6
case GS_A8: return DXGI_FORMAT_A8_UNORM;
7
case GS_R8: return DXGI_FORMAT_R8_UNORM;
8
case GS_RGBA: return DXGI_FORMAT_R8G8B8A8_UNORM;
9
10
11
static inline gs_color_format ConvertDXGITextureFormat(DXGI_FORMAT format)
12
{
13
- switch (format) {
14
+ switch ((unsigned long)format) {
15
case DXGI_FORMAT_A8_UNORM: return GS_A8;
16
case DXGI_FORMAT_R8_UNORM: return GS_R8;
17
case DXGI_FORMAT_R8G8B8A8_UNORM: return GS_RGBA;
18
19
static inline DXGI_FORMAT ConvertGSZStencilFormat(gs_zstencil_format format)
20
{
21
switch (format) {
22
+ case GS_ZS_NONE: return DXGI_FORMAT_UNKNOWN;
23
case GS_Z16: return DXGI_FORMAT_D16_UNORM;
24
case GS_Z24_S8: return DXGI_FORMAT_D24_UNORM_S8_UINT;
25
case GS_Z32F: return DXGI_FORMAT_D32_FLOAT;
26
27
ComPtr<ID3D11Buffer> tangentBuffer;
28
vector<ComPtr<ID3D11Buffer>> uvBuffers;
29
30
- gs_device_t *device;
31
+ gs_device_t *device;
32
bool dynamic;
33
VBDataPtr vbd;
34
size_t numVerts;
35
36
37
inline gs_texture(gs_device *device, gs_texture_type type,
38
uint32_t levels, gs_color_format format)
39
- : device (device),
40
- type (type),
41
+ : type (type),
42
+ device (device),
43
levels (levels),
44
format (format)
45
{
46
47
ComPtr<ID3D11RenderTargetView> renderTarget[6];
48
ComPtr<IDXGISurface1> gdiSurface;
49
50
- uint32_t width, height;
51
- DXGI_FORMAT dxgiFormat;
52
- bool isRenderTarget;
53
- bool isGDICompatible;
54
- bool isDynamic;
55
- bool isShared;
56
- bool genMipmaps;
57
- uint32_t sharedHandle;
58
+ uint32_t width = 0, height = 0;
59
+ DXGI_FORMAT dxgiFormat = DXGI_FORMAT_UNKNOWN;
60
+ bool isRenderTarget = false;
61
+ bool isGDICompatible = false;
62
+ bool isDynamic = false;
63
+ bool isShared = false;
64
+ bool genMipmaps = false;
65
+ uint32_t sharedHandle = 0;
66
67
void InitSRD(vector<D3D11_SUBRESOURCE_DATA> &srd, const uint8_t **data);
68
void InitTexture(const uint8_t **data);
69
70
void InitRenderTargets();
71
72
inline gs_texture_2d()
73
- : gs_texture (NULL, GS_TEXTURE_2D, 0, GS_UNKNOWN),
74
- width (0),
75
- height (0),
76
- dxgiFormat (DXGI_FORMAT_UNKNOWN),
77
- isRenderTarget (false),
78
- isGDICompatible (false),
79
- isDynamic (false),
80
- isShared (false),
81
- genMipmaps (false),
82
- sharedHandle (NULL)
83
+ : gs_texture (NULL, GS_TEXTURE_2D, 0, GS_UNKNOWN)
84
{
85
}
86
87
88
};
89
90
struct gs_shader_param {
91
- string name;
92
- gs_shader_param_type type;
93
+ string name;
94
+ gs_shader_param_type type;
95
96
- uint32_t textureID;
97
+ uint32_t textureID;
98
99
- int arrayCount;
100
+ int arrayCount;
101
102
- size_t pos;
103
+ size_t pos;
104
105
- vector<uint8_t> curValue;
106
- vector<uint8_t> defaultValue;
107
- bool changed;
108
+ vector<uint8_t> curValue;
109
+ vector<uint8_t> defaultValue;
110
+ bool changed;
111
112
gs_shader_param(shader_var &var, uint32_t &texCounter);
113
};
114
115
gs_device_t *device;
116
gs_shader_type type;
117
vector<gs_shader_param> params;
118
- ComPtr<ID3D11Buffer> constants;
119
- size_t constantSize;
120
+ ComPtr<ID3D11Buffer> constants;
121
+ size_t constantSize;
122
123
inline void UpdateParam(vector<uint8_t> &constData,
124
gs_shader_param ¶m, bool &upload);
125
126
ComPtr<ID3D11DeviceContext> context;
127
gs_swap_chain defaultSwap;
128
129
- gs_texture_2d *curRenderTarget;
130
- gs_zstencil_buffer *curZStencilBuffer;
131
- int curRenderSide;
132
+ gs_texture_2d *curRenderTarget = nullptr;
133
+ gs_zstencil_buffer *curZStencilBuffer = nullptr;
134
+ int curRenderSide = 0;
135
gs_texture *curTextures[GS_MAX_TEXTURES];
136
gs_sampler_state *curSamplers[GS_MAX_TEXTURES];
137
- gs_vertex_buffer *curVertexBuffer;
138
- gs_index_buffer *curIndexBuffer;
139
- gs_vertex_shader *curVertexShader;
140
- gs_pixel_shader *curPixelShader;
141
+ gs_vertex_buffer *curVertexBuffer = nullptr;
142
+ gs_index_buffer *curIndexBuffer = nullptr;
143
+ gs_vertex_shader *curVertexShader = nullptr;
144
+ gs_pixel_shader *curPixelShader = nullptr;
145
gs_swap_chain *curSwapChain;
146
147
- bool zstencilStateChanged;
148
- bool rasterStateChanged;
149
- bool blendStateChanged;
150
+ bool zstencilStateChanged = true;
151
+ bool rasterStateChanged = true;
152
+ bool blendStateChanged = true;
153
ZStencilState zstencilState;
154
RasterState rasterState;
155
BlendState blendState;
156
vector<SavedZStencilState> zstencilStates;
157
vector<SavedRasterState> rasterStates;
158
vector<SavedBlendState> blendStates;
159
- ID3D11DepthStencilState *curDepthStencilState;
160
- ID3D11RasterizerState *curRasterState;
161
- ID3D11BlendState *curBlendState;
162
+ ID3D11DepthStencilState *curDepthStencilState = nullptr;
163
+ ID3D11RasterizerState *curRasterState = nullptr;
164
+ ID3D11BlendState *curBlendState = nullptr;
165
D3D11_PRIMITIVE_TOPOLOGY curToplogy;
166
167
- pD3DCompile d3dCompile;
168
+ pD3DCompile d3dCompile = nullptr;
169
170
gs_rect viewport;
171
172
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs-d3d11/d3d11-texture2d.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs-d3d11/d3d11-texture2d.cpp
Changed
32
1
2
width (width),
3
height (height),
4
dxgiFormat (ConvertGSTextureFormat(format)),
5
+ isRenderTarget ((flags & GS_RENDER_TARGET) != 0),
6
isGDICompatible (gdiCompatible),
7
- isShared (shared),
8
isDynamic ((flags & GS_DYNAMIC) != 0),
9
- isRenderTarget ((flags & GS_RENDER_TARGET) != 0),
10
+ isShared (shared),
11
genMipmaps ((flags & GS_BUILD_MIPMAPS) != 0)
12
{
13
InitTexture(data);
14
15
}
16
17
gs_texture_2d::gs_texture_2d(gs_device_t *device, uint32_t handle)
18
- : isRenderTarget (false),
19
- isGDICompatible (false),
20
- isDynamic (false),
21
- isShared (true),
22
- genMipmaps (false),
23
+ : isShared (true),
24
sharedHandle (handle)
25
{
26
HRESULT hr;
27
- hr = device->device->OpenSharedResource((HANDLE)handle,
28
+ hr = device->device->OpenSharedResource((HANDLE)(uintptr_t)handle,
29
__uuidof(ID3D11Texture2D), (void**)texture.Assign());
30
if (FAILED(hr))
31
throw HRError("Failed to open resource", hr);
32
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs-d3d11/d3d11-vertexbuffer.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs-d3d11/d3d11-vertexbuffer.cpp
Changed
13
1
2
gs_vertex_buffer::gs_vertex_buffer(gs_device_t *device, struct gs_vb_data *data,
3
uint32_t flags)
4
: device (device),
5
+ dynamic ((flags & GS_DYNAMIC) != 0),
6
vbd (data),
7
- numVerts (data->num),
8
- dynamic ((flags & GS_DYNAMIC) != 0)
9
+ numVerts (data->num)
10
{
11
if (!data->num)
12
throw "Cannot initialize vertex buffer with 0 vertices";
13
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs-opengl/gl-windows.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs-opengl/gl-windows.c
Changed
82
1
2
bool success = wglMakeCurrent(hdc, hglrc);
3
if (!success)
4
blog(LOG_ERROR, "wglMakeCurrent failed, GetLastError "
5
- "returned %u", GetLastError());
6
+ "returned %lu", GetLastError());
7
8
return success;
9
}
10
11
{
12
HGLRC hglrc = wglCreateContext(hdc);
13
if (!hglrc) {
14
- blog(LOG_ERROR, "wglCreateContext failed, %u", GetLastError());
15
+ blog(LOG_ERROR, "wglCreateContext failed, %lu", GetLastError());
16
return NULL;
17
}
18
19
20
if (GLAD_WGL_ARB_create_context) {
21
HGLRC hglrc = wglCreateContextAttribsARB(hdc, 0, attribs);
22
if (!hglrc) {
23
- blog(LOG_ERROR, "wglCreateContextAttribsARB failed, %u",
24
- GetLastError());
25
+ blog(LOG_ERROR, "wglCreateContextAttribsARB failed, "
26
+ "%lu", GetLastError());
27
return NULL;
28
}
29
30
31
init_dummy_pixel_format(&pfd);
32
format_index = ChoosePixelFormat(dummy->hdc, &pfd);
33
if (!format_index) {
34
- blog(LOG_ERROR, "Dummy ChoosePixelFormat failed, %u",
35
+ blog(LOG_ERROR, "Dummy ChoosePixelFormat failed, %lu",
36
GetLastError());
37
return false;
38
}
39
40
if (!SetPixelFormat(dummy->hdc, format_index, &pfd)) {
41
- blog(LOG_ERROR, "Dummy SetPixelFormat failed, %u",
42
+ blog(LOG_ERROR, "Dummy SetPixelFormat failed, %lu",
43
GetLastError());
44
return false;
45
}
46
47
success = wglChoosePixelFormatARB(hdc, attribs.array, NULL, 1, &format,
48
&num_formats);
49
if (!success || !num_formats) {
50
- blog(LOG_ERROR, "wglChoosePixelFormatARB failed, %u",
51
+ blog(LOG_ERROR, "wglChoosePixelFormatARB failed, %lu",
52
GetLastError());
53
format = 0;
54
}
55
56
*format = gl_choose_pixel_format(hdc, info);
57
58
if (!DescribePixelFormat(hdc, *format, sizeof(*pfd), pfd)) {
59
- blog(LOG_ERROR, "DescribePixelFormat failed, %u",
60
+ blog(LOG_ERROR, "DescribePixelFormat failed, %lu",
61
GetLastError());
62
return false;
63
}
64
65
PIXELFORMATDESCRIPTOR *pfd)
66
{
67
if (!SetPixelFormat(hdc, format, pfd)) {
68
- blog(LOG_ERROR, "SetPixelFormat failed, %u", GetLastError());
69
+ blog(LOG_ERROR, "SetPixelFormat failed, %lu", GetLastError());
70
return false;
71
}
72
73
74
{
75
if (!SwapBuffers(device->cur_swap->wi->hdc)) {
76
blog(LOG_ERROR, "SwapBuffers failed, GetLastError "
77
- "returned %u", GetLastError());
78
+ "returned %lu", GetLastError());
79
blog(LOG_ERROR, "device_present (GL) failed");
80
}
81
}
82
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/CMakeLists.txt -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/CMakeLists.txt
Changed
17
1
2
util/threading-windows.c
3
util/pipe-windows.c
4
util/platform-windows.c)
5
- set(libobs_PLATFORM_DEPS
6
- w32-pthreads
7
- winmm.lib)
8
+ set(libobs_PLATFORM_DEPS winmm)
9
+ if(MSVC)
10
+ set(libobs_PLATFORM_DEPS
11
+ ${libobs_PLATFORM_DEPS}
12
+ w32-pthreads)
13
+ endif()
14
elseif(APPLE)
15
set(libobs_PLATFORM_SOURCES
16
obs-cocoa.c
17
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/media-io/audio-io.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/media-io/audio-io.c
Changed
349
1
2
struct audio_convert_info conversion;
3
audio_resampler_t *resampler;
4
5
- void (*callback)(void *param, struct audio_data *data);
6
+ audio_output_callback_t callback;
7
void *param;
8
};
9
10
11
12
uint64_t next_ts_min;
13
14
+ /* specifies which mixes this line applies to via bits */
15
+ uint32_t mixers;
16
+
17
/* states whether this line is still being used. if not, then when the
18
* buffer is depleted, it's destroyed */
19
bool alive;
20
21
bfree(line);
22
}
23
24
+struct audio_mix {
25
+ DARRAY(struct audio_input) inputs;
26
+ DARRAY(uint8_t) mix_buffers[MAX_AV_PLANES];
27
+};
28
+
29
struct audio_output {
30
struct audio_output_info info;
31
size_t block_size;
32
33
pthread_t thread;
34
os_event_t *stop_event;
35
36
- DARRAY(uint8_t) mix_buffers[MAX_AV_PLANES];
37
-
38
bool initialized;
39
40
pthread_mutex_t line_mutex;
41
struct audio_line *first_line;
42
43
pthread_mutex_t input_mutex;
44
- DARRAY(struct audio_input) inputs;
45
+
46
+ struct audio_mix mixes[MAX_AUDIO_MIXES];
47
};
48
49
static inline void audio_output_removeline(struct audio_output *audio,
50
51
#define MIX_BUFFER_SIZE 256
52
53
/* TODO: optimize mixing */
54
-static void mix_float(uint8_t *mix_in, struct circlebuf *buf, size_t size)
55
+static void mix_float(struct audio_output *audio, struct audio_line *line,
56
+ size_t size, size_t time_offset, size_t plane)
57
{
58
- float *mix = (float*)mix_in;
59
+ float *mixes[MAX_AUDIO_MIXES];
60
float vals[MIX_BUFFER_SIZE];
61
- register float mix_val;
62
+
63
+ for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; mix_idx++) {
64
+ uint8_t *bytes = audio->mixes[mix_idx].mix_buffers[plane].array;
65
+ mixes[mix_idx] = (float*)&bytes[time_offset];
66
+ }
67
68
while (size) {
69
size_t pop_count = min_size(size, sizeof(vals));
70
size -= pop_count;
71
72
- circlebuf_pop_front(buf, vals, pop_count);
73
+ circlebuf_pop_front(&line->buffers[plane], vals, pop_count);
74
pop_count /= sizeof(float);
75
76
- /* This sequence provides hints for MSVC to use packed SSE
77
- * instructions addps, minps, maxps, etc. */
78
- for (size_t i = 0; i < pop_count; i++) {
79
- mix_val = *mix + vals[i];
80
-
81
- /* clamp confuses the optimisation */
82
- mix_val = (mix_val > 1.0f) ? 1.0f : mix_val;
83
- mix_val = (mix_val < -1.0f) ? -1.0f : mix_val;
84
+ for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; mix_idx++) {
85
+ /* only include this audio line in this mix if it's set
86
+ * via the line's 'mixes' variable */
87
+ if ((line->mixers & (1 << mix_idx)) == 0)
88
+ continue;
89
90
- *(mix++) = mix_val;
91
+ for (size_t i = 0; i < pop_count; i++) {
92
+ *(mixes[mix_idx]++) += vals[i];
93
+ }
94
}
95
}
96
}
97
98
for (size_t i = 0; i < audio->planes; i++) {
99
size_t pop_size = min_size(size, line->buffers[i].size);
100
101
- mix_float(audio->mix_buffers[i].array + time_offset,
102
- &line->buffers[i], pop_size);
103
+ mix_float(audio, line, pop_size, time_offset, i);
104
}
105
106
return true;
107
108
}
109
110
static inline void do_audio_output(struct audio_output *audio,
111
- uint64_t timestamp, uint32_t frames)
112
+ size_t mix_idx, uint64_t timestamp, uint32_t frames)
113
{
114
+ struct audio_mix *mix = &audio->mixes[mix_idx];
115
struct audio_data data;
116
+
117
for (size_t i = 0; i < MAX_AV_PLANES; i++)
118
- data.data[i] = audio->mix_buffers[i].array;
119
+ data.data[i] = mix->mix_buffers[i].array;
120
+
121
data.frames = frames;
122
data.timestamp = timestamp;
123
data.volume = 1.0f;
124
125
pthread_mutex_lock(&audio->input_mutex);
126
127
- for (size_t i = 0; i < audio->inputs.num; i++) {
128
- struct audio_input *input = audio->inputs.array+i;
129
+ for (size_t i = 0; i < mix->inputs.num; i++) {
130
+ struct audio_input *input = mix->inputs.array+i;
131
132
if (resample_audio_output(input, &data))
133
- input->callback(input->param, &data);
134
+ input->callback(input->param, mix_idx, &data);
135
}
136
137
pthread_mutex_unlock(&audio->input_mutex);
138
}
139
140
+static inline void clamp_audio_output(struct audio_output *audio, size_t bytes)
141
+{
142
+ size_t float_size = bytes / sizeof(float);
143
+
144
+ for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; mix_idx++) {
145
+ struct audio_mix *mix = &audio->mixes[mix_idx];
146
+
147
+ /* do not process mixing if a specific mix is inactive */
148
+ if (!mix->inputs.num)
149
+ continue;
150
+
151
+ for (size_t plane = 0; plane < audio->planes; plane++) {
152
+ float *mix_data = (float*)mix->mix_buffers[plane].array;
153
+ float *mix_end = &mix_data[float_size];
154
+
155
+ while (mix_data < mix_end) {
156
+ float val = *mix_data;
157
+ val = (val > 1.0f) ? 1.0f : val;
158
+ val = (val < -1.0f) ? -1.0f : val;
159
+ *(mix_data++) = val;
160
+ }
161
+ }
162
+ }
163
+}
164
+
165
static uint64_t mix_and_output(struct audio_output *audio, uint64_t audio_time,
166
uint64_t prev_time)
167
{
168
169
audio_time = prev_time + conv_frames_to_time(audio, frames);
170
171
/* resize and clear mix buffers */
172
- for (size_t i = 0; i < audio->planes; i++) {
173
- da_resize(audio->mix_buffers[i], bytes);
174
- memset(audio->mix_buffers[i].array, 0, bytes);
175
+ for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; mix_idx++) {
176
+ struct audio_mix *mix = &audio->mixes[mix_idx];
177
+
178
+ for (size_t i = 0; i < audio->planes; i++) {
179
+ da_resize(mix->mix_buffers[i], bytes);
180
+ memset(mix->mix_buffers[i].array, 0, bytes);
181
+ }
182
}
183
184
/* mix audio lines */
185
186
line = next;
187
}
188
189
+ /* clamps audio data to -1.0..1.0 */
190
+ clamp_audio_output(audio, bytes);
191
+
192
/* output */
193
- do_audio_output(audio, prev_time, frames);
194
+ for (size_t i = 0; i < MAX_AUDIO_MIXES; i++)
195
+ do_audio_output(audio, i, prev_time, frames);
196
197
return audio_time;
198
}
199
200
201
/* ------------------------------------------------------------------------- */
202
203
-static size_t audio_get_input_idx(const audio_t *video,
204
- void (*callback)(void *param, struct audio_data *data),
205
- void *param)
206
+static size_t audio_get_input_idx(const audio_t *audio, size_t mix_idx,
207
+ audio_output_callback_t callback, void *param)
208
{
209
- for (size_t i = 0; i < video->inputs.num; i++) {
210
- struct audio_input *input = video->inputs.array+i;
211
+ const struct audio_mix *mix = &audio->mixes[mix_idx];
212
+
213
+ for (size_t i = 0; i < mix->inputs.num; i++) {
214
+ struct audio_input *input = mix->inputs.array+i;
215
+
216
if (input->callback == callback && input->param == param)
217
return i;
218
}
219
220
return true;
221
}
222
223
-bool audio_output_connect(audio_t *audio,
224
+bool audio_output_connect(audio_t *audio, size_t mi,
225
const struct audio_convert_info *conversion,
226
- void (*callback)(void *param, struct audio_data *data),
227
- void *param)
228
+ audio_output_callback_t callback, void *param)
229
{
230
bool success = false;
231
232
- if (!audio) return false;
233
+ if (!audio || mi >= MAX_AUDIO_MIXES) return false;
234
235
pthread_mutex_lock(&audio->input_mutex);
236
237
- if (audio_get_input_idx(audio, callback, param) == DARRAY_INVALID) {
238
+ if (audio_get_input_idx(audio, mi, callback, param) == DARRAY_INVALID) {
239
+ struct audio_mix *mix = &audio->mixes[mi];
240
struct audio_input input;
241
input.callback = callback;
242
input.param = param;
243
244
245
success = audio_input_init(&input, audio);
246
if (success)
247
- da_push_back(audio->inputs, &input);
248
+ da_push_back(mix->inputs, &input);
249
}
250
251
pthread_mutex_unlock(&audio->input_mutex);
252
253
return success;
254
}
255
256
-void audio_output_disconnect(audio_t *audio,
257
- void (*callback)(void *param, struct audio_data *data),
258
- void *param)
259
+void audio_output_disconnect(audio_t *audio, size_t mix_idx,
260
+ audio_output_callback_t callback, void *param)
261
{
262
- if (!audio) return;
263
+ if (!audio || mix_idx >= MAX_AUDIO_MIXES) return;
264
265
pthread_mutex_lock(&audio->input_mutex);
266
267
- size_t idx = audio_get_input_idx(audio, callback, param);
268
+ size_t idx = audio_get_input_idx(audio, mix_idx, callback, param);
269
if (idx != DARRAY_INVALID) {
270
- audio_input_free(audio->inputs.array+idx);
271
- da_erase(audio->inputs, idx);
272
+ struct audio_mix *mix = &audio->mixes[mix_idx];
273
+ audio_input_free(mix->inputs.array+idx);
274
+ da_erase(mix->inputs, idx);
275
}
276
277
pthread_mutex_unlock(&audio->input_mutex);
278
279
line = next;
280
}
281
282
- for (size_t i = 0; i < audio->inputs.num; i++)
283
- audio_input_free(audio->inputs.array+i);
284
+ for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; mix_idx++) {
285
+ struct audio_mix *mix = &audio->mixes[mix_idx];
286
287
- for (size_t i = 0; i < MAX_AV_PLANES; i++)
288
- da_free(audio->mix_buffers[i]);
289
+ for (size_t i = 0; i < mix->inputs.num; i++)
290
+ audio_input_free(mix->inputs.array+i);
291
+
292
+ for (size_t i = 0; i < MAX_AV_PLANES; i++)
293
+ da_free(mix->mix_buffers[i]);
294
+
295
+ da_free(mix->inputs);
296
+ }
297
298
- da_free(audio->inputs);
299
os_event_destroy(audio->stop_event);
300
pthread_mutex_destroy(&audio->line_mutex);
301
bfree(audio);
302
}
303
304
-audio_line_t *audio_output_create_line(audio_t *audio, const char *name)
305
+audio_line_t *audio_output_create_line(audio_t *audio, const char *name,
306
+ uint32_t mixers)
307
{
308
if (!audio) return NULL;
309
310
struct audio_line *line = bzalloc(sizeof(struct audio_line));
311
line->alive = true;
312
line->audio = audio;
313
+ line->mixers = mixers;
314
315
if (pthread_mutex_init(&line->mutex, NULL) != 0) {
316
blog(LOG_ERROR, "audio_output_createline: Failed to create "
317
318
bool audio_output_active(const audio_t *audio)
319
{
320
if (!audio) return false;
321
- return audio->inputs.num != 0;
322
+
323
+ for (size_t mix_idx = 0; mix_idx < MAX_AUDIO_MIXES; mix_idx++) {
324
+ const struct audio_mix *mix = &audio->mixes[mix_idx];
325
+
326
+ if (mix->inputs.num != 0)
327
+ return true;
328
+ }
329
+
330
+ return false;
331
}
332
333
size_t audio_output_get_block_size(const audio_t *audio)
334
335
336
pthread_mutex_unlock(&line->mutex);
337
}
338
+
339
+void audio_line_set_mixers(audio_line_t *line, uint32_t mixers)
340
+{
341
+ if (!!line)
342
+ line->mixers = mixers;
343
+}
344
+
345
+uint32_t audio_line_get_mixers(audio_line_t *line)
346
+{
347
+ return !!line ? line->mixers : 0;
348
+}
349
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/media-io/audio-io.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/media-io/audio-io.h
Changed
43
1
2
extern "C" {
3
#endif
4
5
+#define MAX_AUDIO_MIXES 4
6
+
7
/*
8
* Base audio output component. Use this to create an audio output track
9
* for the media.
10
11
EXPORT int audio_output_open(audio_t **audio, struct audio_output_info *info);
12
EXPORT void audio_output_close(audio_t *audio);
13
14
-EXPORT bool audio_output_connect(audio_t *video,
15
+typedef void (*audio_output_callback_t)(void *param, size_t mix_idx,
16
+ struct audio_data *data);
17
+
18
+EXPORT bool audio_output_connect(audio_t *video, size_t mix_idx,
19
const struct audio_convert_info *conversion,
20
- void (*callback)(void *param, struct audio_data *data),
21
- void *param);
22
-EXPORT void audio_output_disconnect(audio_t *video,
23
- void (*callback)(void *param, struct audio_data *data),
24
- void *param);
25
+ audio_output_callback_t callback, void *param);
26
+EXPORT void audio_output_disconnect(audio_t *video, size_t mix_idx,
27
+ audio_output_callback_t callback, void *param);
28
29
EXPORT bool audio_output_active(const audio_t *audio);
30
31
32
EXPORT const struct audio_output_info *audio_output_get_info(
33
const audio_t *audio);
34
35
-EXPORT audio_line_t *audio_output_create_line(audio_t *audio, const char *name);
36
+EXPORT audio_line_t *audio_output_create_line(audio_t *audio, const char *name,
37
+ uint32_t mixers);
38
+EXPORT void audio_line_set_mixers(audio_line_t *line, uint32_t mixers);
39
+EXPORT uint32_t audio_line_get_mixers(audio_line_t *line);
40
EXPORT void audio_line_destroy(audio_line_t *line);
41
EXPORT void audio_line_output(audio_line_t *line, const struct audio_data *data);
42
43
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-cocoa.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-cocoa.c
Changed
25
1
2
3
void add_default_module_paths(void)
4
{
5
+ char bin[512];
6
+ char data[512];
7
+ int ret;
8
+
9
for (int i = 0; i < module_patterns_size; i++)
10
obs_add_module_path(module_bin[i], module_data[i]);
11
+
12
+ ret = os_get_config_path(bin, sizeof(bin), "obs-plugins/%module%");
13
+ if (ret <= 0)
14
+ return;
15
+
16
+ strcpy(data, bin);
17
+ strcat(data, "/data");
18
+
19
+ strcat(bin, "/bin");
20
+
21
+ obs_add_module_path(bin, data);
22
}
23
24
char *find_libobs_data_file(const char *file)
25
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-config.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-config.h
Changed
18
1
2
*
3
* Reset to zero each major version
4
*/
5
-#define LIBOBS_API_MINOR_VER 7
6
+#define LIBOBS_API_MINOR_VER 8
7
8
/*
9
* Increment if backward-compatible bug fix
10
*
11
* Reset to zero each major or minor version
12
*/
13
-#define LIBOBS_API_PATCH_VER 3
14
+#define LIBOBS_API_PATCH_VER 2
15
16
#define MAKE_SEMANTIC_VERSION(major, minor, patch) \
17
((major << 24) | \
18
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-data.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-data.c
Changed
116
1
2
set_item_data(data, item, name, ptr, size, type, false, true);
3
}
4
5
+static void copy_obj(struct obs_data *data, const char *name,
6
+ struct obs_data *obj,
7
+ void (*callback)(obs_data_t *, const char *, obs_data_t *))
8
+{
9
+ if (obj) {
10
+ obs_data_t *new_obj = obs_data_create();
11
+ obs_data_apply(new_obj, obj);
12
+ callback(data, name, new_obj);
13
+ obs_data_release(new_obj);
14
+ }
15
+}
16
+
17
+static void copy_array(struct obs_data *data, const char *name,
18
+ struct obs_data_array *array,
19
+ void (*callback)(obs_data_t*, const char*, obs_data_array_t*))
20
+{
21
+ if (array) {
22
+ obs_data_array_t *new_array = obs_data_array_create();
23
+ da_reserve(new_array->objects, array->objects.num);
24
+
25
+ for (size_t i = 0; i < array->objects.num; i++) {
26
+ obs_data_t *new_obj = obs_data_create();
27
+ obs_data_t *obj = array->objects.array[i];
28
+
29
+ obs_data_apply(new_obj, obj);
30
+ obs_data_array_push_back(new_array, new_obj);
31
+
32
+ obs_data_release(new_obj);
33
+ }
34
+
35
+ callback(data, name, new_array);
36
+ obs_data_array_release(new_array);
37
+ }
38
+}
39
+
40
static inline void copy_item(struct obs_data *data, struct obs_data_item *item)
41
{
42
const char *name = get_item_name(item);
43
void *ptr = get_item_data(item);
44
45
- set_item(data, NULL, name, ptr, item->data_len, item->type);
46
+ if (item->type == OBS_DATA_OBJECT) {
47
+ obs_data_t **obj = item->data_size ? ptr : NULL;
48
+
49
+ if (obj)
50
+ copy_obj(data, name, *obj, obs_data_set_obj);
51
+
52
+ } else if (item->type == OBS_DATA_ARRAY) {
53
+ obs_data_array_t **array = item->data_size ? ptr : NULL;
54
+
55
+ if (array)
56
+ copy_array(data, name, *array, obs_data_set_array);
57
+
58
+ } else {
59
+ if (item->data_size)
60
+ set_item(data, NULL, name, ptr, item->data_size,
61
+ item->type);
62
+ }
63
}
64
65
void obs_data_apply(obs_data_t *target, obs_data_t *apply_data)
66
67
}
68
}
69
70
+static inline void clear_item(struct obs_data_item *item)
71
+{
72
+ void *ptr = get_item_data(item);
73
+ size_t size;
74
+
75
+ if (item->data_len) {
76
+ if (item->type == OBS_DATA_OBJECT) {
77
+ obs_data_t **obj = item->data_size ? ptr : NULL;
78
+
79
+ if (obj && *obj)
80
+ obs_data_release(*obj);
81
+
82
+ } else if (item->type == OBS_DATA_ARRAY) {
83
+ obs_data_array_t **array = item->data_size ? ptr : NULL;
84
+
85
+ if (array && *array)
86
+ obs_data_array_release(*array);
87
+ }
88
+
89
+ size = item->default_len + item->autoselect_size;
90
+ if (size)
91
+ memmove(ptr, (uint8_t*)ptr + item->data_len, size);
92
+
93
+ item->data_size = 0;
94
+ item->data_len = 0;
95
+ }
96
+}
97
+
98
+void obs_data_clear(obs_data_t *target)
99
+{
100
+ struct obs_data_item *item;
101
+
102
+ if (!target)
103
+ return;
104
+
105
+ item = target->first_item;
106
+
107
+ while (item) {
108
+ clear_item(item);
109
+ item = item->next;
110
+ }
111
+}
112
+
113
typedef void (*set_item_t)(obs_data_t*, obs_data_item_t**, const char*,
114
const void*, size_t, enum obs_data_type);
115
116
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-data.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-data.h
Changed
9
1
2
EXPORT void obs_data_apply(obs_data_t *target, obs_data_t *apply_data);
3
4
EXPORT void obs_data_erase(obs_data_t *data, const char *name);
5
+EXPORT void obs_data_clear(obs_data_t *data);
6
7
/* Set functions */
8
EXPORT void obs_data_set_string(obs_data_t *data, const char *name,
9
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-encoder.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-encoder.c
Changed
147
1
2
3
static struct obs_encoder *create_encoder(const char *id,
4
enum obs_encoder_type type, const char *name,
5
- obs_data_t *settings)
6
+ obs_data_t *settings, size_t mixer_idx)
7
{
8
struct obs_encoder *encoder;
9
struct obs_encoder_info *ei = find_encoder(id);
10
11
12
encoder = bzalloc(sizeof(struct obs_encoder));
13
encoder->info = *ei;
14
+ encoder->mixer_idx = mixer_idx;
15
16
success = init_encoder(encoder, name, settings);
17
if (!success) {
18
19
obs_data_t *settings)
20
{
21
if (!name || !id) return NULL;
22
- return create_encoder(id, OBS_ENCODER_VIDEO, name, settings);
23
+ return create_encoder(id, OBS_ENCODER_VIDEO, name, settings, 0);
24
}
25
26
obs_encoder_t *obs_audio_encoder_create(const char *id, const char *name,
27
- obs_data_t *settings)
28
+ obs_data_t *settings, size_t mixer_idx)
29
{
30
if (!name || !id) return NULL;
31
- return create_encoder(id, OBS_ENCODER_AUDIO, name, settings);
32
+ return create_encoder(id, OBS_ENCODER_AUDIO, name, settings, mixer_idx);
33
}
34
35
static void receive_video(void *param, struct video_data *frame);
36
-static void receive_audio(void *param, struct audio_data *data);
37
+static void receive_audio(void *param, size_t mix_idx, struct audio_data *data);
38
39
static inline struct audio_convert_info *get_audio_info(
40
const struct obs_encoder *encoder,
41
42
43
if (encoder->info.type == OBS_ENCODER_AUDIO) {
44
get_audio_info(encoder, &audio_info);
45
- audio_output_connect(encoder->media, &audio_info, receive_audio,
46
- encoder);
47
+ audio_output_connect(encoder->media, encoder->mixer_idx,
48
+ &audio_info, receive_audio, encoder);
49
} else {
50
struct video_scale_info *info =
51
get_video_info(encoder, &video_info);
52
53
static void remove_connection(struct obs_encoder *encoder)
54
{
55
if (encoder->info.type == OBS_ENCODER_AUDIO)
56
- audio_output_disconnect(encoder->media, receive_audio,
57
- encoder);
58
+ audio_output_disconnect(encoder->media, encoder->mixer_idx,
59
+ receive_audio, encoder);
60
else
61
video_output_disconnect(encoder->media, receive_video,
62
encoder);
63
64
return encoder ? encoder->context.name : NULL;
65
}
66
67
+void obs_encoder_set_name(obs_encoder_t *encoder, const char *name)
68
+{
69
+ if (!encoder) return;
70
+
71
+ if (name && *name && strcmp(name, encoder->context.name) != 0)
72
+ obs_context_data_setname(&encoder->context, name);
73
+}
74
+
75
static inline obs_data_t *get_defaults(const struct obs_encoder_info *info)
76
{
77
obs_data_t *settings = obs_data_create();
78
79
return encoder ? encoder->info.codec : NULL;
80
}
81
82
+const char *obs_get_encoder_codec(const char *id)
83
+{
84
+ struct obs_encoder_info *info = find_encoder(id);
85
+ return info ? info->codec : NULL;
86
+}
87
+
88
+enum obs_encoder_type obs_encoder_get_type(const obs_encoder_t *encoder)
89
+{
90
+ return encoder ? encoder->info.type : OBS_ENCODER_AUDIO;
91
+}
92
+
93
+enum obs_encoder_type obs_get_encoder_type(const char *id)
94
+{
95
+ struct obs_encoder_info *info = find_encoder(id);
96
+ return info ? info->type : OBS_ENCODER_AUDIO;
97
+}
98
+
99
void obs_encoder_set_scaled_size(obs_encoder_t *encoder, uint32_t width,
100
uint32_t height)
101
{
102
103
104
pkt.timebase_num = encoder->timebase_num;
105
pkt.timebase_den = encoder->timebase_den;
106
+ pkt.encoder = encoder;
107
108
success = encoder->info.encode(encoder->context.data, frame, &pkt,
109
&received);
110
111
size_t size = data->frames * encoder->blocksize;
112
size_t offset_size = 0;
113
114
- if (encoder->paired_encoder && !encoder->start_ts) {
115
+ if (!encoder->start_ts && encoder->paired_encoder) {
116
uint64_t end_ts = data->timestamp;
117
uint64_t v_start_ts = encoder->paired_encoder->start_ts;
118
119
120
}
121
122
encoder->start_ts = v_start_ts;
123
+
124
+ } else if (!encoder->start_ts && !encoder->paired_encoder) {
125
+ encoder->start_ts = data->timestamp;
126
}
127
128
size -= offset_size;
129
130
encoder->cur_pts += encoder->framesize;
131
}
132
133
-static void receive_audio(void *param, struct audio_data *data)
134
+static void receive_audio(void *param, size_t mix_idx, struct audio_data *data)
135
{
136
struct obs_encoder *encoder = param;
137
138
139
140
while (encoder->audio_input_buffer[0].size >= encoder->framesize_bytes)
141
send_audio_data(encoder);
142
+
143
+ UNUSED_PARAMETER(mix_idx);
144
}
145
146
void obs_encoder_add_output(struct obs_encoder *encoder,
147
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-encoder.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-encoder.h
Changed
14
1
2
* priority or higher to continue transmission.
3
*/
4
int drop_priority;
5
+
6
+ /** Audio track index (used with outputs) */
7
+ size_t track_idx;
8
+
9
+ /** Encoder from which the track originated from */
10
+ obs_encoder_t *encoder;
11
};
12
13
/** Encoder input frame */
14
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-internal.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-internal.h
Changed
30
1
2
bool received_video;
3
bool received_audio;
4
int64_t video_offset;
5
- int64_t audio_offset;
6
+ int64_t audio_offsets[MAX_AUDIO_MIXES];
7
int64_t highest_audio_ts;
8
int64_t highest_video_ts;
9
pthread_mutex_t interleaved_mutex;
10
11
video_t *video;
12
audio_t *audio;
13
obs_encoder_t *video_encoder;
14
- obs_encoder_t *audio_encoder;
15
+ obs_encoder_t *audio_encoders[MAX_AUDIO_MIXES];
16
obs_service_t *service;
17
+ size_t mixer_idx;
18
19
uint32_t scaled_width;
20
uint32_t scaled_height;
21
22
size_t framesize;
23
size_t framesize_bytes;
24
25
+ size_t mixer_idx;
26
+
27
uint32_t scaled_width;
28
uint32_t scaled_height;
29
30
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-module.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-module.c
Changed
11
1
2
char *parsed_data_dir;
3
bool bin_found = true;
4
5
+ if (strcmp(path, ".") == 0 || strcmp(path, "..") == 0)
6
+ return;
7
+
8
file = strrchr(path, '/');
9
file = file ? (file + 1) : path;
10
11
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-output.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-output.c
Changed
512
1
2
obs_encoder_remove_output(output->video_encoder,
3
output);
4
}
5
- if (output->audio_encoder) {
6
- obs_encoder_remove_output(output->audio_encoder,
7
- output);
8
+
9
+ for (size_t i = 0; i < MAX_AUDIO_MIXES; i++) {
10
+ if (output->audio_encoders[i]) {
11
+ obs_encoder_remove_output(
12
+ output->audio_encoders[i],
13
+ output);
14
+ }
15
}
16
17
pthread_mutex_destroy(&output->interleaved_mutex);
18
19
return output ? output->audio : NULL;
20
}
21
22
+void obs_output_set_mixer(obs_output_t *output, size_t mixer_idx)
23
+{
24
+ if (!output)
25
+ return;
26
+
27
+ if (!output->active)
28
+ output->mixer_idx = mixer_idx;
29
+}
30
+
31
+size_t obs_output_get_mixer(const obs_output_t *output)
32
+{
33
+ return output ? output->mixer_idx : 0;
34
+}
35
+
36
void obs_output_remove_encoder(struct obs_output *output,
37
struct obs_encoder *encoder)
38
{
39
if (!output) return;
40
41
- if (output->video_encoder == encoder)
42
+ if (output->video_encoder == encoder) {
43
output->video_encoder = NULL;
44
- else if (output->audio_encoder == encoder)
45
- output->audio_encoder = NULL;
46
+ } else {
47
+ for (size_t i = 0; i < MAX_AUDIO_MIXES; i++) {
48
+ if (output->audio_encoders[i] == encoder)
49
+ output->audio_encoders[i] = NULL;
50
+ }
51
+ }
52
}
53
54
void obs_output_set_video_encoder(obs_output_t *output, obs_encoder_t *encoder)
55
56
output->scaled_width, output->scaled_height);
57
}
58
59
-void obs_output_set_audio_encoder(obs_output_t *output, obs_encoder_t *encoder)
60
+void obs_output_set_audio_encoder(obs_output_t *output, obs_encoder_t *encoder,
61
+ size_t idx)
62
{
63
if (!output) return;
64
- if (output->audio_encoder == encoder) return;
65
if (encoder && encoder->info.type != OBS_ENCODER_AUDIO) return;
66
67
- obs_encoder_remove_output(output->audio_encoder, output);
68
+ if ((output->info.flags & OBS_OUTPUT_MULTI_TRACK) != 0) {
69
+ if (idx >= MAX_AUDIO_MIXES) {
70
+ return;
71
+ }
72
+ } else {
73
+ if (idx > 0) {
74
+ return;
75
+ }
76
+ }
77
+
78
+ if (output->audio_encoders[idx] == encoder) return;
79
+
80
+ obs_encoder_remove_output(output->audio_encoders[idx], output);
81
obs_encoder_add_output(encoder, output);
82
- output->audio_encoder = encoder;
83
+ output->audio_encoders[idx] = encoder;
84
}
85
86
obs_encoder_t *obs_output_get_video_encoder(const obs_output_t *output)
87
88
return output ? output->video_encoder : NULL;
89
}
90
91
-obs_encoder_t *obs_output_get_audio_encoder(const obs_output_t *output)
92
+obs_encoder_t *obs_output_get_audio_encoder(const obs_output_t *output,
93
+ size_t idx)
94
{
95
- return output ? output->audio_encoder : NULL;
96
+ if (!output) return NULL;
97
+
98
+ if ((output->info.flags & OBS_OUTPUT_MULTI_TRACK) != 0) {
99
+ if (idx >= MAX_AUDIO_MIXES) {
100
+ return NULL;
101
+ }
102
+ } else {
103
+ if (idx > 0) {
104
+ return NULL;
105
+ }
106
+ }
107
+
108
+ return output->audio_encoders[idx];
109
}
110
111
void obs_output_set_service(obs_output_t *output, obs_service_t *service)
112
113
output->audio_conversion_set = true;
114
}
115
116
+static inline bool service_supports_multitrack(const struct obs_output *output)
117
+{
118
+ const struct obs_service *service = output->service;
119
+
120
+ if (!service || !service->info.supports_multitrack) {
121
+ return false;
122
+ }
123
+
124
+ return service->info.supports_multitrack(service->context.data);
125
+}
126
+
127
+static inline size_t num_audio_mixes(const struct obs_output *output)
128
+{
129
+ size_t mix_count = 1;
130
+
131
+ if ((output->info.flags & OBS_OUTPUT_SERVICE) != 0) {
132
+ if (!service_supports_multitrack(output)) {
133
+ return 1;
134
+ }
135
+ }
136
+
137
+ if ((output->info.flags & OBS_OUTPUT_MULTI_TRACK) != 0) {
138
+ mix_count = 0;
139
+
140
+ for (size_t i = 0; i < MAX_AUDIO_MIXES; i++) {
141
+ if (!output->audio_encoders[i])
142
+ break;
143
+
144
+ mix_count++;
145
+ }
146
+ }
147
+
148
+ return mix_count;
149
+}
150
+
151
+static inline bool audio_valid(const struct obs_output *output, bool encoded)
152
+{
153
+ if (encoded) {
154
+ size_t mix_count = num_audio_mixes(output);
155
+ if (!mix_count)
156
+ return false;
157
+
158
+ for (size_t i = 0; i < mix_count; i++) {
159
+ if (!output->audio_encoders[i]) {
160
+ return false;
161
+ }
162
+ }
163
+ } else {
164
+ if (!output->audio)
165
+ return false;
166
+ }
167
+
168
+ return true;
169
+}
170
+
171
static bool can_begin_data_capture(const struct obs_output *output,
172
bool encoded, bool has_video, bool has_audio, bool has_service)
173
{
174
175
}
176
177
if (has_audio) {
178
- if (encoded) {
179
- if (!output->audio_encoder)
180
- return false;
181
- } else {
182
- if (!output->audio)
183
- return false;
184
+ if (!audio_valid(output, encoded)) {
185
+ return false;
186
}
187
}
188
189
190
return output->audio_conversion_set ? &output->audio_conversion : NULL;
191
}
192
193
-static void apply_interleaved_packet_offset(struct obs_output *output,
194
- struct encoder_packet *out)
195
+static size_t get_track_index(const struct obs_output *output,
196
+ struct encoder_packet *pkt)
197
{
198
- int64_t offset;
199
+ for (size_t i = 0; i < MAX_AUDIO_MIXES; i++) {
200
+ struct obs_encoder *encoder = output->audio_encoders[i];
201
202
- /* audio and video need to start at timestamp 0, and the encoders
203
- * may not currently be at 0 when we get data. so, we store the
204
- * current dts as offset and subtract that value from the dts/pts
205
- * of the output packet. */
206
+ if (pkt->encoder == encoder)
207
+ return i;
208
+ }
209
+
210
+ assert(false);
211
+ return 0;
212
+}
213
+
214
+static inline void check_received(struct obs_output *output,
215
+ struct encoder_packet *out)
216
+{
217
if (out->type == OBS_ENCODER_VIDEO) {
218
if (!output->received_video)
219
output->received_video = true;
220
-
221
- offset = output->video_offset;
222
} else {
223
if (!output->received_audio)
224
output->received_audio = true;
225
-
226
- offset = output->audio_offset;
227
}
228
+}
229
+
230
+static inline void apply_interleaved_packet_offset(struct obs_output *output,
231
+ struct encoder_packet *out)
232
+{
233
+ int64_t offset;
234
+
235
+ /* audio and video need to start at timestamp 0, and the encoders
236
+ * may not currently be at 0 when we get data. so, we store the
237
+ * current dts as offset and subtract that value from the dts/pts
238
+ * of the output packet. */
239
+ offset = (out->type == OBS_ENCODER_VIDEO) ?
240
+ output->video_offset : output->audio_offsets[out->track_idx];
241
242
out->dts -= offset;
243
out->pts -= offset;
244
245
}
246
247
static struct encoder_packet *find_first_packet_type(struct obs_output *output,
248
- enum obs_encoder_type type)
249
+ enum obs_encoder_type type, size_t audio_idx)
250
{
251
for (size_t i = 0; i < output->interleaved_packets.num; i++) {
252
struct encoder_packet *packet =
253
&output->interleaved_packets.array[i];
254
255
- if (packet->type == type)
256
+ if (packet->type == type) {
257
+ if (type == OBS_ENCODER_AUDIO &&
258
+ packet->track_idx != audio_idx) {
259
+ continue;
260
+ }
261
+
262
return packet;
263
+ }
264
}
265
266
return NULL;
267
268
static bool initialize_interleaved_packets(struct obs_output *output)
269
{
270
struct encoder_packet *video;
271
- struct encoder_packet *audio;
272
+ struct encoder_packet *audio[MAX_AUDIO_MIXES];
273
+ size_t audio_mixes = num_audio_mixes(output);
274
275
- video = find_first_packet_type(output, OBS_ENCODER_VIDEO);
276
- audio = find_first_packet_type(output, OBS_ENCODER_AUDIO);
277
-
278
- if (!audio)
279
- output->received_audio = false;
280
+ video = find_first_packet_type(output, OBS_ENCODER_VIDEO, 0);
281
if (!video)
282
output->received_video = false;
283
- if (!audio || !video) {
284
+
285
+ for (size_t i = 0; i < audio_mixes; i++) {
286
+ audio[i] = find_first_packet_type(output, OBS_ENCODER_AUDIO, i);
287
+ if (!audio[i]) {
288
+ output->received_audio = false;
289
+ return false;
290
+ }
291
+ }
292
+
293
+ if (!video) {
294
return false;
295
}
296
297
/* get new offsets */
298
output->video_offset = video->dts;
299
- output->audio_offset = audio->dts;
300
+ for (size_t i = 0; i < audio_mixes; i++)
301
+ output->audio_offsets[i] = audio[i]->dts;
302
303
/* subtract offsets from highest TS offset variables */
304
- output->highest_audio_ts -= audio->dts_usec;
305
+ output->highest_audio_ts -= audio[0]->dts_usec;
306
output->highest_video_ts -= video->dts_usec;
307
308
/* apply new offsets to all existing packet DTS/PTS values */
309
310
struct encoder_packet out;
311
bool was_started;
312
313
+ if (packet->type == OBS_ENCODER_AUDIO)
314
+ packet->track_idx = get_track_index(output, packet);
315
+
316
pthread_mutex_lock(&output->interleaved_mutex);
317
318
was_started = output->received_audio && output->received_video;
319
320
obs_duplicate_encoder_packet(&out, packet);
321
- apply_interleaved_packet_offset(output, &out);
322
+
323
+ if (was_started)
324
+ apply_interleaved_packet_offset(output, &out);
325
+ else
326
+ check_received(output, packet);
327
+
328
insert_interleaved_packet(output, &out);
329
set_higher_ts(output, &out);
330
331
332
static void default_encoded_callback(void *param, struct encoder_packet *packet)
333
{
334
struct obs_output *output = param;
335
+
336
+ if (packet->type == OBS_ENCODER_AUDIO)
337
+ packet->track_idx = get_track_index(output, packet);
338
+
339
if (!output->stopped)
340
output->info.encoded_packet(output->context.data, packet);
341
342
343
output->total_frames++;
344
}
345
346
-static void default_raw_audio_callback(void *param, struct audio_data *frames)
347
+static void default_raw_audio_callback(void *param, size_t mix_idx,
348
+ struct audio_data *frames)
349
{
350
struct obs_output *output = param;
351
if (!output->stopped)
352
output->info.raw_audio(output->context.data, frames);
353
+
354
+ UNUSED_PARAMETER(mix_idx);
355
+}
356
+
357
+typedef void (*encoded_callback_t)(void *data, struct encoder_packet *packet);
358
+
359
+static inline void start_audio_encoders(struct obs_output *output,
360
+ encoded_callback_t encoded_callback)
361
+{
362
+ size_t num_mixes = num_audio_mixes(output);
363
+
364
+ for (size_t i = 0; i < num_mixes; i++) {
365
+ obs_encoder_start(output->audio_encoders[i],
366
+ encoded_callback, output);
367
+ }
368
}
369
370
static void hook_data_capture(struct obs_output *output, bool encoded,
371
bool has_video, bool has_audio)
372
{
373
- void (*encoded_callback)(void *data, struct encoder_packet *packet);
374
+ encoded_callback_t encoded_callback;
375
376
if (encoded) {
377
output->received_audio = false;
378
379
output->highest_audio_ts = 0;
380
output->highest_video_ts = 0;
381
output->video_offset = 0;
382
- output->audio_offset = 0;
383
+
384
+ for (size_t i = 0; i < MAX_AUDIO_MIXES; i++)
385
+ output->audio_offsets[0] = 0;
386
+
387
free_packets(output);
388
389
encoded_callback = (has_video && has_audio) ?
390
391
obs_encoder_start(output->video_encoder,
392
encoded_callback, output);
393
if (has_audio)
394
- obs_encoder_start(output->audio_encoder,
395
- encoded_callback, output);
396
+ start_audio_encoders(output, encoded_callback);
397
} else {
398
if (has_video)
399
video_output_connect(output->video,
400
get_video_conversion(output),
401
default_raw_video_callback, output);
402
if (has_audio)
403
- audio_output_connect(output->audio,
404
+ audio_output_connect(output->audio, output->mixer_idx,
405
get_audio_conversion(output),
406
default_raw_audio_callback, output);
407
}
408
409
has_service);
410
}
411
412
+static inline bool initialize_audio_encoders(obs_output_t *output,
413
+ size_t num_mixes)
414
+{
415
+ for (size_t i = 0; i < num_mixes; i++) {
416
+ if (!obs_encoder_initialize(output->audio_encoders[i])) {
417
+ return false;
418
+ }
419
+ }
420
+
421
+ return true;
422
+}
423
+
424
+static inline bool pair_encoders(obs_output_t *output, size_t num_mixes)
425
+{
426
+ if (num_mixes == 1 &&
427
+ !output->audio_encoders[0]->active &&
428
+ !output->video_encoder->active &&
429
+ !output->video_encoder->paired_encoder &&
430
+ !output->audio_encoders[0]->paired_encoder) {
431
+
432
+ output->audio_encoders[0]->wait_for_video = true;
433
+ output->audio_encoders[0]->paired_encoder =
434
+ output->video_encoder;
435
+ output->video_encoder->paired_encoder =
436
+ output->audio_encoders[0];
437
+ }
438
+
439
+ return true;
440
+}
441
+
442
bool obs_output_initialize_encoders(obs_output_t *output, uint32_t flags)
443
{
444
bool encoded, has_video, has_audio, has_service;
445
+ size_t num_mixes = num_audio_mixes(output);
446
447
if (!output) return false;
448
if (output->active) return false;
449
450
return false;
451
if (has_video && !obs_encoder_initialize(output->video_encoder))
452
return false;
453
- if (has_audio && !obs_encoder_initialize(output->audio_encoder))
454
+ if (has_audio && !initialize_audio_encoders(output, num_mixes))
455
return false;
456
457
- if (has_video && has_audio && !output->audio_encoder->active &&
458
- !output->video_encoder->active) {
459
- output->audio_encoder->wait_for_video = true;
460
- output->video_encoder->paired_encoder = output->audio_encoder;
461
- output->audio_encoder->paired_encoder = output->video_encoder;
462
+ if (has_video && has_audio) {
463
+ if (!pair_encoders(output, num_mixes)) {
464
+ return false;
465
+ }
466
}
467
468
return true;
469
470
return true;
471
}
472
473
+static inline void stop_audio_encoders(obs_output_t *output,
474
+ encoded_callback_t encoded_callback)
475
+{
476
+ size_t num_mixes = num_audio_mixes(output);
477
+
478
+ for (size_t i = 0; i < num_mixes; i++) {
479
+ obs_encoder_stop(output->audio_encoders[i],
480
+ encoded_callback, output);
481
+ }
482
+}
483
+
484
void obs_output_end_data_capture(obs_output_t *output)
485
{
486
bool encoded, has_video, has_audio, has_service;
487
- void (*encoded_callback)(void *data, struct encoder_packet *packet);
488
+ encoded_callback_t encoded_callback;
489
490
if (!output) return;
491
if (!output->active) return;
492
493
obs_encoder_stop(output->video_encoder,
494
encoded_callback, output);
495
if (has_audio)
496
- obs_encoder_stop(output->audio_encoder,
497
- encoded_callback, output);
498
+ stop_audio_encoders(output, encoded_callback);
499
} else {
500
if (has_video)
501
video_output_disconnect(output->video,
502
default_raw_video_callback, output);
503
if (has_audio)
504
audio_output_disconnect(output->audio,
505
- output->info.raw_audio,
506
- output->context.data);
507
+ output->mixer_idx,
508
+ default_raw_audio_callback, output);
509
}
510
511
if (has_service)
512
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-output.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-output.h
Changed
9
1
2
#define OBS_OUTPUT_AV (OBS_OUTPUT_VIDEO | OBS_OUTPUT_AUDIO)
3
#define OBS_OUTPUT_ENCODED (1<<2)
4
#define OBS_OUTPUT_SERVICE (1<<3)
5
+#define OBS_OUTPUT_MULTI_TRACK (1<<4)
6
7
struct encoder_packet;
8
9
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-properties.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-properties.h
Changed
15
1
2
EXPORT obs_property_t *obs_properties_get(obs_properties_t *props,
3
const char *property);
4
5
-/* used internally by libobs */
6
-extern void obs_properties_apply_settings(obs_properties_t *props,
7
+/**
8
+ * Applies settings to the properties by calling all the necessary
9
+ * modification callbacks
10
+ */
11
+EXPORT void obs_properties_apply_settings(obs_properties_t *props,
12
obs_data_t *settings);
13
14
/* ------------------------------------------------------------------------- */
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-service.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-service.c
Changed
30
1
2
return NULL;
3
}
4
5
-const char *obs_service_gettype(const obs_service_t *service)
6
+const char *obs_service_get_type(const obs_service_t *service)
7
{
8
return service ? service->info.id : NULL;
9
}
10
11
return service->info.initialize(service->context.data, output);
12
return true;
13
}
14
+
15
+void obs_service_apply_encoder_settings(obs_service_t *service,
16
+ obs_encoder_t *video_encoder, obs_encoder_t *audio_encoder)
17
+{
18
+ if (!service || !service->info.apply_encoder_settings)
19
+ return;
20
+
21
+ if (video_encoder && video_encoder->info.type != OBS_ENCODER_VIDEO)
22
+ video_encoder = NULL;
23
+ if (audio_encoder && audio_encoder->info.type != OBS_ENCODER_AUDIO)
24
+ audio_encoder = NULL;
25
+
26
+ if (video_encoder || audio_encoder)
27
+ service->info.apply_encoder_settings(service->context.data,
28
+ video_encoder, audio_encoder);
29
+}
30
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-service.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-service.h
Changed
13
1
2
const char *(*get_username)(void *data);
3
const char *(*get_password)(void *data);
4
5
+ bool (*supports_multitrack)(void *data);
6
+
7
+ void (*apply_encoder_settings)(void *data, obs_encoder_t *video_encoder,
8
+ obs_encoder_t *audio_encoder);
9
+
10
/* TODO: more stuff later */
11
};
12
13
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-source.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-source.c
Changed
56
1
2
"void update_flags(ptr source, int flags)",
3
"void audio_sync(ptr source, int out int offset)",
4
"void audio_data(ptr source, ptr data)",
5
+ "void audio_mixers(ptr source, in out int mixers)",
6
NULL
7
};
8
9
10
11
if (info && info->output_flags & OBS_SOURCE_AUDIO) {
12
source->audio_line = audio_output_create_line(obs->audio.audio,
13
- source->context.name);
14
+ source->context.name, 0xF);
15
if (!source->audio_line) {
16
blog(LOG_ERROR, "Failed to create audio line for "
17
"source '%s'", source->context.name);
18
19
return source ? source->flags : 0;
20
}
21
22
+void obs_source_set_audio_mixers(obs_source_t *source, uint32_t mixers)
23
+{
24
+ struct calldata data = {0};
25
+ uint32_t cur_mixers;
26
+
27
+ if (!source) return;
28
+ if ((source->info.output_flags & OBS_SOURCE_AUDIO) == 0) return;
29
+
30
+ cur_mixers = audio_line_get_mixers(source->audio_line);
31
+ if (cur_mixers == mixers)
32
+ return;
33
+
34
+ calldata_set_ptr(&data, "source", source);
35
+ calldata_set_int(&data, "mixers", mixers);
36
+
37
+ signal_handler_signal(source->context.signals, "audio_mixers", &data);
38
+
39
+ mixers = (uint32_t)calldata_int(&data, "mixers");
40
+ calldata_free(&data);
41
+
42
+ audio_line_set_mixers(source->audio_line, mixers);
43
+}
44
+
45
+uint32_t obs_source_get_audio_mixers(const obs_source_t *source)
46
+{
47
+ if (!source) return 0;
48
+ if ((source->info.output_flags & OBS_SOURCE_AUDIO) == 0) return 0;
49
+
50
+ return audio_line_get_mixers(source->audio_line);
51
+}
52
+
53
void obs_source_draw_set_color_matrix(const struct matrix4 *color_matrix,
54
const struct vec3 *color_range_min,
55
const struct vec3 *color_range_max)
56
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-win-crash-handler.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-win-crash-handler.c
Changed
11
1
2
data->process, thread, &trace->frame, &trace->context,
3
NULL, data->sym_function_table_access64,
4
data->sym_get_module_base64, NULL);
5
-
6
- int last_error = GetLastError();
7
-
8
if (!success)
9
return false;
10
11
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs-windows.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs-windows.c
Changed
56
1
2
3
void add_default_module_paths(void)
4
{
5
+ char bin[512];
6
+ char data[512];
7
+ int ret;
8
+
9
for (int i = 0; i < module_patterns_size; i++)
10
obs_add_module_path(module_bin[i], module_data[i]);
11
+
12
+ ret = os_get_config_path(bin, sizeof(bin), "obs-plugins/%module%");
13
+ if (ret <= 0)
14
+ return;
15
+
16
+ strcpy(data, bin);
17
+ strcat(data, "/data");
18
+
19
+ strcat(bin, "/bin/" BIT_STRING);
20
+
21
+ obs_add_module_path(bin, data);
22
}
23
24
/* on windows, points to [base directory]/data/libobs */
25
26
status = RegQueryValueExW(key, L"~MHz", NULL, NULL, (LPBYTE)&speed,
27
&size);
28
if (status == ERROR_SUCCESS)
29
- blog(LOG_INFO, "CPU Speed: %dMHz", speed);
30
+ blog(LOG_INFO, "CPU Speed: %ldMHz", speed);
31
32
RegCloseKey(key);
33
}
34
35
const char *note = " (NOTE: 4 gigs max is normal for 32bit programs)";
36
#endif
37
38
- blog(LOG_INFO, "Physical Memory: %ldMB Total, %ldMB Free%s",
39
- ms.dwTotalPhys / 1048576,
40
- ms.dwAvailPhys / 1048576,
41
+ blog(LOG_INFO, "Physical Memory: %luMB Total, %luMB Free%s",
42
+ (DWORD)(ms.dwTotalPhys / 1048576),
43
+ (DWORD)(ms.dwAvailPhys / 1048576),
44
note);
45
}
46
47
48
GetVersionExW(&osvi);
49
50
os_wcs_to_utf8_ptr(osvi.szCSDVersion, 0, &build);
51
- blog(LOG_INFO, "Windows Version: %u.%u Build %u %s",
52
+ blog(LOG_INFO, "Windows Version: %ld.%ld Build %ld %s",
53
osvi.dwMajorVersion,
54
osvi.dwMinorVersion,
55
osvi.dwBuildNumber,
56
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs.c
Changed
36
1
2
double volume;
3
int64_t sync;
4
uint32_t flags;
5
+ uint32_t mixers;
6
7
source = obs_source_create(OBS_SOURCE_TYPE_INPUT, id, name, settings);
8
9
10
sync = obs_data_get_int(source_data, "sync");
11
obs_source_set_sync_offset(source, sync);
12
13
+ obs_data_set_default_int(source_data, "mixers", 0xF);
14
+ mixers = (uint32_t)obs_data_get_int(source_data, "mixers");
15
+ obs_source_set_audio_mixers(source, mixers);
16
+
17
obs_data_set_default_int(source_data, "flags", source->default_flags);
18
flags = (uint32_t)obs_data_get_int(source_data, "flags");
19
obs_source_set_flags(source, flags);
20
21
obs_data_t *source_data = obs_data_create();
22
obs_data_t *settings = obs_source_get_settings(source);
23
float volume = obs_source_get_volume(source);
24
+ uint32_t mixers = obs_source_get_audio_mixers(source);
25
int64_t sync = obs_source_get_sync_offset(source);
26
uint32_t flags = obs_source_get_flags(source);
27
const char *name = obs_source_get_name(source);
28
29
obs_data_set_string(source_data, "name", name);
30
obs_data_set_string(source_data, "id", id);
31
obs_data_set_obj (source_data, "settings", settings);
32
+ obs_data_set_int (source_data, "mixers", mixers);
33
obs_data_set_int (source_data, "sync", sync);
34
obs_data_set_int (source_data, "flags", flags);
35
obs_data_set_double(source_data, "volume", volume);
36
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/obs.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/obs.h
Changed
131
1
2
/** Specifies to force audio to mono */
3
#define OBS_SOURCE_FLAG_FORCE_MONO (1<<1)
4
5
-/** Sets source flags. Note that these are different from the main output
6
- * flags. */
7
+/**
8
+ * Sets source flags. Note that these are different from the main output
9
+ * flags. These are generally things that can be set by the source or user,
10
+ * while the output flags are more used to determine capabilities of a source.
11
+ */
12
EXPORT void obs_source_set_flags(obs_source_t *source, uint32_t flags);
13
14
/** Gets source flags. */
15
EXPORT uint32_t obs_source_get_flags(const obs_source_t *source);
16
17
+/**
18
+ * Sets audio mixer flags. These flags are used to specify which mixers
19
+ * the source's audio should be applied to.
20
+ */
21
+EXPORT void obs_source_set_audio_mixers(obs_source_t *source, uint32_t mixers);
22
+
23
+/** Gets audio mixer flags */
24
+EXPORT uint32_t obs_source_get_audio_mixers(const obs_source_t *source);
25
+
26
/* ------------------------------------------------------------------------- */
27
/* Functions used by sources */
28
29
30
/** Returns the audio media context associated with this output */
31
EXPORT audio_t *obs_output_audio(const obs_output_t *output);
32
33
+/** Sets the current audio mixer for non-encoded outputs */
34
+EXPORT void obs_output_set_mixer(obs_output_t *output, size_t mixer_idx);
35
+
36
+/** Gets the current audio mixer for non-encoded outputs */
37
+EXPORT size_t obs_output_get_mixer(const obs_output_t *output);
38
+
39
/**
40
* Sets the current video encoder associated with this output,
41
* required for encoded outputs
42
43
44
/**
45
* Sets the current audio encoder associated with this output,
46
- * required for encoded outputs
47
+ * required for encoded outputs.
48
+ *
49
+ * The idx parameter specifies the audio encoder index to set the encoder to.
50
+ * Only used with outputs that have multiple audio outputs (RTMP typically),
51
+ * otherwise the parameter is ignored.
52
*/
53
EXPORT void obs_output_set_audio_encoder(obs_output_t *output,
54
- obs_encoder_t *encoder);
55
+ obs_encoder_t *encoder, size_t idx);
56
57
/** Returns the current video encoder associated with this output */
58
EXPORT obs_encoder_t *obs_output_get_video_encoder(const obs_output_t *output);
59
60
-/** Returns the current audio encoder associated with this output */
61
-EXPORT obs_encoder_t *obs_output_get_audio_encoder(const obs_output_t *output);
62
+/**
63
+ * Returns the current audio encoder associated with this output
64
+ *
65
+ * The idx parameter specifies the audio encoder index. Only used with
66
+ * outputs that have multiple audio outputs, otherwise the parameter is
67
+ * ignored.
68
+ */
69
+EXPORT obs_encoder_t *obs_output_get_audio_encoder(const obs_output_t *output,
70
+ size_t idx);
71
72
/** Sets the current service associated with this output. */
73
EXPORT void obs_output_set_service(obs_output_t *output,
74
75
* @param id Audio Encoder ID
76
* @param name Name to assign to this context
77
* @param settings Settings
78
+ * @param mixer_idx Index of the mixer to use for this audio encoder
79
* @return The video encoder context, or NULL if failed or not found.
80
*/
81
EXPORT obs_encoder_t *obs_audio_encoder_create(const char *id, const char *name,
82
- obs_data_t *settings);
83
+ obs_data_t *settings, size_t mixer_idx);
84
85
/** Destroys an encoder context */
86
EXPORT void obs_encoder_destroy(obs_encoder_t *encoder);
87
88
+EXPORT void obs_encoder_set_name(obs_encoder_t *encoder, const char *name);
89
EXPORT const char *obs_encoder_get_name(const obs_encoder_t *encoder);
90
91
+/** Returns the codec of an encoder by the id */
92
+EXPORT const char *obs_get_encoder_codec(const char *id);
93
+
94
+/** Returns the type of an encoder by the id */
95
+EXPORT enum obs_encoder_type obs_get_encoder_type(const char *id);
96
+
97
/** Returns the codec of the encoder */
98
EXPORT const char *obs_encoder_get_codec(const obs_encoder_t *encoder);
99
100
+/** Returns the type of an encoder */
101
+EXPORT enum obs_encoder_type obs_encoder_get_type(const obs_encoder_t *encoder);
102
+
103
/**
104
* Sets the scaled resolution for a video encoder. Set width and height to 0
105
* to disable scaling. If the encoder is active, this function will trigger
106
107
EXPORT obs_properties_t *obs_service_properties(const obs_service_t *service);
108
109
/** Gets the service type */
110
-EXPORT const char *obs_service_gettype(const obs_service_t *service);
111
+EXPORT const char *obs_service_get_type(const obs_service_t *service);
112
113
/** Updates the settings of the service context */
114
EXPORT void obs_service_update(obs_service_t *service, obs_data_t *settings);
115
116
/** Returns the password (if any) for this service context */
117
EXPORT const char *obs_service_get_password(const obs_service_t *service);
118
119
+/**
120
+ * Applies service-specific video encoder settings.
121
+ *
122
+ * @param video_encoder Video encoder to apply settings to. Optional.
123
+ * @param audio_encoder Audio encoder to apply settings to. Optional.
124
+ */
125
+EXPORT void obs_service_apply_encoder_settings(obs_service_t *service,
126
+ obs_encoder_t *video_encoder, obs_encoder_t *audio_encoder);
127
+
128
129
/* ------------------------------------------------------------------------- */
130
/* Source frame allocation functions */
131
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/util/platform-cocoa.m -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/util/platform-cocoa.m
Changed
23
1
2
}
3
4
/* gets the location ~/Library/Application Support/[name] */
5
-char *os_get_config_path(const char *name)
6
+int os_get_config_path(char *dst, size_t size, const char *name)
7
+{
8
+ NSArray *paths = NSSearchPathForDirectoriesInDomains(
9
+ NSApplicationSupportDirectory, NSUserDomainMask, YES);
10
+
11
+ if([paths count] == 0)
12
+ bcrash("Could not get home directory (platform-cocoa)");
13
+
14
+ NSString *application_support = paths[0];
15
+ const char *base_path = [application_support UTF8String];
16
+ return snprintf(dst, size, "%s/%s", base_path, name);
17
+}
18
+
19
+char *os_get_config_path_ptr(const char *name)
20
{
21
NSArray *paths = NSSearchPathForDirectoriesInDomains(
22
NSApplicationSupportDirectory, NSUserDomainMask, YES);
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/util/platform-nix.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/util/platform-nix.c
Changed
19
1
2
}
3
4
/* should return $HOME/.[name] */
5
-char *os_get_config_path(const char *name)
6
+int os_get_config_path(char *dst, size_t size, const char *name)
7
+{
8
+ char *path_ptr = getenv("HOME");
9
+ if (path_ptr == NULL)
10
+ bcrash("Could not get $HOME\n");
11
+
12
+ return snprintf(dst, size, "%s/.%s", path_ptr, name);
13
+}
14
+
15
+char *os_get_config_path_ptr(const char *name)
16
{
17
char *path_ptr = getenv("HOME");
18
if (path_ptr == NULL)
19
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/util/platform-windows.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/util/platform-windows.c
Changed
45
1
2
dstr_free(&dll_name);
3
4
if (!h_library)
5
- blog(LOG_INFO, "LoadLibrary failed for '%s', error: %u",
6
+ blog(LOG_INFO, "LoadLibrary failed for '%s', error: %ld",
7
path, GetLastError());
8
9
return h_library;
10
11
}
12
13
/* returns %appdata%\[name] on windows */
14
-char *os_get_config_path(const char *name)
15
+int os_get_config_path(char *dst, size_t size, const char *name)
16
+{
17
+ wchar_t path_utf16[MAX_PATH];
18
+
19
+ SHGetFolderPathW(NULL, CSIDL_APPDATA, NULL, SHGFP_TYPE_CURRENT,
20
+ path_utf16);
21
+
22
+ if (os_wcs_to_utf8(path_utf16, 0, dst, size) != 0) {
23
+ if (strcat_s(dst, size, "\\") == 0) {
24
+ if (strcat_s(dst, size, name) == 0) {
25
+ return (int)strlen(dst);
26
+ }
27
+ }
28
+ }
29
+
30
+ return -1;
31
+}
32
+
33
+char *os_get_config_path_ptr(const char *name)
34
{
35
char *ptr;
36
wchar_t path_utf16[MAX_PATH];
37
38
HANDLE handle;
39
WIN32_FIND_DATA wfd;
40
int ret = -1;
41
- os_glob_t *out = NULL;
42
wchar_t *w_path;
43
44
da_init(files);
45
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/util/platform.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/util/platform.h
Changed
11
1
2
3
EXPORT uint64_t os_gettime_ns(void);
4
5
-EXPORT char *os_get_config_path(const char *name);
6
+EXPORT int os_get_config_path(char *dst, size_t size, const char *name);
7
+EXPORT char *os_get_config_path_ptr(const char *name);
8
9
EXPORT bool os_file_exists(const char *path);
10
11
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/util/threading-posix.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/util/threading-posix.c
Changed
34
1
2
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3
*/
4
5
-#ifdef __APPLE__
6
+#if defined(__APPLE__) || defined(__MINGW32__)
7
#include <sys/time.h>
8
+#endif
9
+#ifdef __APPLE__
10
#include <mach/semaphore.h>
11
#include <mach/task.h>
12
#include <mach/mach_init.h>
13
14
pthread_mutex_lock(&event->mutex);
15
if (!event->signalled) {
16
struct timespec ts;
17
-#ifdef __APPLE__
18
+#if defined(__APPLE__) || defined(__MINGW32__)
19
struct timeval tv;
20
gettimeofday(&tv, NULL);
21
ts.tv_sec = tv.tv_sec;
22
23
24
void os_set_thread_name(const char *name)
25
{
26
-#ifdef __APPLE__
27
+#if defined(__APPLE__)
28
pthread_setname_np(name);
29
-#else
30
+#elif !defined(__MINGW32__)
31
pthread_setname_np(pthread_self(), name);
32
#endif
33
}
34
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/util/threading-windows.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/util/threading-windows.c
Changed
51
1
2
#define WIN32_LEAN_AND_MEAN
3
#include <windows.h>
4
5
+#ifdef __MINGW32__
6
+#include <excpt.h>
7
+#ifndef TRYLEVEL_NONE
8
+#ifndef __MINGW64__
9
+#define NO_SEH_MINGW
10
+#endif
11
+#ifndef __try
12
+#define __try
13
+#endif
14
+#ifndef __except
15
+#define __except(x) if (0)
16
+#endif
17
+#endif
18
+#endif
19
+
20
struct os_event_data {
21
HANDLE handle;
22
};
23
24
25
void os_set_thread_name(const char *name)
26
{
27
+#ifdef __MINGW32__
28
+ UNUSED_PARAMETER(name);
29
+#else
30
struct vs_threadname_info info;
31
info.type = 0x1000;
32
info.name = name;
33
info.thread_id = GetCurrentThreadId();
34
info.flags = 0;
35
36
+#ifdef NO_SEH_MINGW
37
+ __try1(EXCEPTION_EXECUTE_HANDLER) {
38
+#else
39
__try {
40
+#endif
41
RaiseException(VC_EXCEPTION, 0, THREADNAME_INFO_SIZE,
42
(ULONG_PTR*)&info);
43
+#ifdef NO_SEH_MINGW
44
+ } __except1 {
45
+#else
46
} __except(EXCEPTION_EXECUTE_HANDLER) {
47
+#endif
48
}
49
+#endif
50
}
51
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/util/utf8.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/util/utf8.c
Changed
66
1
2
3
#include "utf8.h"
4
5
+#ifdef _WIN32
6
+
7
+#include <windows.h>
8
+#include "c99defs.h"
9
+
10
+static inline bool has_utf8_bom(const char *in_char)
11
+{
12
+ uint8_t *in = (uint8_t*)in_char;
13
+ return (in && in[0] == 0xef && in[1] == 0xbb && in[2] == 0xbf);
14
+}
15
+
16
+size_t utf8_to_wchar(const char *in, size_t insize, wchar_t *out,
17
+ size_t outsize, int flags)
18
+{
19
+ int i_insize = (int)insize;
20
+ int ret;
21
+
22
+ if (i_insize == 0)
23
+ i_insize = (int)strlen(in);
24
+
25
+ /* prevent bom from being used in the string */
26
+ if (has_utf8_bom(in)) {
27
+ if (i_insize >= 3) {
28
+ in += 3;
29
+ insize -= 3;
30
+ }
31
+ }
32
+
33
+ ret = MultiByteToWideChar(CP_UTF8, 0, in, i_insize, out, (int)outsize);
34
+
35
+ UNUSED_PARAMETER(flags);
36
+ return (ret > 0) ? (size_t)ret : 0;
37
+}
38
+
39
+size_t wchar_to_utf8(const wchar_t *in, size_t insize, char *out,
40
+ size_t outsize, int flags)
41
+{
42
+ int i_insize = (int)insize;
43
+ int ret;
44
+
45
+ if (i_insize == 0)
46
+ i_insize = (int)wcslen(in);
47
+
48
+ ret = WideCharToMultiByte(CP_UTF8, 0, in, i_insize, out, (int)outsize,
49
+ NULL, NULL);
50
+
51
+ UNUSED_PARAMETER(flags);
52
+ return (ret > 0) ? (size_t)ret : 0;
53
+}
54
+
55
+#else
56
+
57
#define _NXT 0x80
58
#define _SEQ2 0xc0
59
#define _SEQ3 0xe0
60
61
62
return total;
63
}
64
+
65
+#endif
66
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/libobs/util/windows/ComPtr.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/libobs/util/windows/ComPtr.hpp
Changed
113
1
2
/* Oh no I have my own com pointer class, the world is ending, how dare you
3
* write your own! */
4
5
-template<typename T> class ComPtr {
6
+template<class T> class ComPtr {
7
+
8
+protected:
9
T *ptr;
10
11
inline void Kill()
12
13
}
14
15
public:
16
- inline ComPtr() : ptr(NULL) {}
17
- inline ComPtr(T *p) : ptr(p) {if (ptr) ptr->AddRef();}
18
- inline ComPtr(const ComPtr &c) : ptr(c.ptr) {if (ptr) ptr->AddRef();}
19
- inline ComPtr(ComPtr &&c) : ptr(c.ptr) {c.ptr = NULL;}
20
- inline ~ComPtr() {Kill();}
21
+ inline ComPtr() : ptr(NULL) {}
22
+ inline ComPtr(T *p) : ptr(p) {if (ptr) ptr->AddRef();}
23
+ inline ComPtr(const ComPtr<T> &c) : ptr(c.ptr) {if (ptr) ptr->AddRef();}
24
+ inline ComPtr(ComPtr<T> &&c) : ptr(c.ptr) {c.ptr = NULL;}
25
+ inline ~ComPtr() {Kill();}
26
27
inline void Clear()
28
{
29
30
}
31
}
32
33
- inline ComPtr &operator=(T *p)
34
+ inline ComPtr<T> &operator=(T *p)
35
{
36
Replace(p);
37
return *this;
38
}
39
40
- inline ComPtr &operator=(const ComPtr &c)
41
+ inline ComPtr<T> &operator=(const ComPtr<T> &c)
42
{
43
Replace(c.ptr);
44
return *this;
45
}
46
47
- inline ComPtr &operator=(ComPtr &&c)
48
+ inline ComPtr<T> &operator=(ComPtr<T> &&c)
49
{
50
if (this != &c) {
51
Kill();
52
53
return *this;
54
}
55
56
+ inline T *Detach()
57
+ {
58
+ T *out = ptr;
59
+ ptr = nullptr;
60
+ return out;
61
+ }
62
+
63
+ inline void CopyTo(T **out)
64
+ {
65
+ if (out) {
66
+ if (ptr) ptr->AddRef();
67
+ *out = ptr;
68
+ }
69
+ }
70
+
71
+ inline ULONG Release()
72
+ {
73
+ ULONG ref;
74
+
75
+ if (!ptr) return 0;
76
+ ref = ptr->Release();
77
+ ptr = nullptr;
78
+ return ref;
79
+ }
80
+
81
inline T **Assign() {Clear(); return &ptr;}
82
inline void Set(T *p) {Kill(); ptr = p;}
83
84
inline T *Get() const {return ptr;}
85
86
- /* nabbed this one from virtualdub */
87
- inline T **operator~() {return Assign();}
88
+ inline T **operator&() {return Assign();}
89
90
inline operator T*() const {return ptr;}
91
inline T *operator->() const {return ptr;}
92
93
94
inline bool operator!() const {return !ptr;}
95
};
96
+
97
+template<class T> class ComQIPtr : public ComPtr<T> {
98
+
99
+public:
100
+ inline ComQIPtr(IUnknown *unk)
101
+ {
102
+ this->ptr = nullptr;
103
+ unk->QueryInterface(__uuidof(T), (void**)&this->ptr);
104
+ }
105
+
106
+ inline ComPtr<T> &operator=(IUnknown *unk)
107
+ {
108
+ ComPtr<T>::Clear();
109
+ unk->QueryInterface(__uuidof(T), (void**)&this->ptr);
110
+ return *this;
111
+ }
112
+};
113
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/CMakeLists.txt -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/CMakeLists.txt
Changed
17
1
2
window-basic-settings.cpp
3
window-basic-interaction.cpp
4
window-basic-properties.cpp
5
+ window-basic-main-outputs.cpp
6
window-basic-source-select.cpp
7
window-license-agreement.cpp
8
window-basic-status-bar.cpp
9
10
window-basic-settings.hpp
11
window-basic-interaction.hpp
12
window-basic-properties.hpp
13
+ window-basic-main-outputs.hpp
14
window-basic-source-select.hpp
15
window-license-agreement.hpp
16
window-basic-status-bar.hpp
17
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/adv-audio-control.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/adv-audio-control.cpp
Changed
278
1
2
#include <QHBoxLayout>
3
+#include <QGridLayout>
4
#include <QLabel>
5
#include <QSpinBox>
6
#include <QCheckBox>
7
8
#define NSEC_PER_MSEC 1000000
9
#endif
10
11
-OBSAdvAudioCtrl::OBSAdvAudioCtrl(obs_source_t *source_)
12
+OBSAdvAudioCtrl::OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_)
13
: source(source_)
14
{
15
- QWidget *forceMonoContainer;
16
- QWidget *mediaChannelContainer;
17
- QWidget *panningContainer;
18
QHBoxLayout *hlayout;
19
- QLabel *labelL, *labelR;
20
signal_handler_t *handler = obs_source_get_signal_handler(source);
21
const char *sourceName = obs_source_get_name(source);
22
float vol = obs_source_get_volume(source);
23
uint32_t flags = obs_source_get_flags(source);
24
+ uint32_t mixers = obs_source_get_audio_mixers(source);
25
26
forceMonoContainer = new QWidget();
27
- mediaChannelContainer = new QWidget();
28
+ mixerContainer = new QWidget();
29
panningContainer = new QWidget();
30
labelL = new QLabel();
31
labelR = new QLabel();
32
33
forceMono = new QCheckBox();
34
panning = new QSlider(Qt::Horizontal);
35
syncOffset = new QSpinBox();
36
- mediaChannel1 = new QCheckBox();
37
- mediaChannel2 = new QCheckBox();
38
- mediaChannel3 = new QCheckBox();
39
- mediaChannel4 = new QCheckBox();
40
+ mixer1 = new QCheckBox();
41
+ mixer2 = new QCheckBox();
42
+ mixer3 = new QCheckBox();
43
+ mixer4 = new QCheckBox();
44
45
volChangedSignal.Connect(handler, "volume", OBSSourceVolumeChanged,
46
this);
47
48
this);
49
flagsSignal.Connect(handler, "update_flags", OBSSourceFlagsChanged,
50
this);
51
+ mixersSignal.Connect(handler, "audio_mixers", OBSSourceMixersChanged,
52
+ this);
53
54
hlayout = new QHBoxLayout();
55
hlayout->setContentsMargins(0, 0, 0, 0);
56
forceMonoContainer->setLayout(hlayout);
57
hlayout = new QHBoxLayout();
58
hlayout->setContentsMargins(0, 0, 0, 0);
59
- mediaChannelContainer->setLayout(hlayout);
60
+ mixerContainer->setLayout(hlayout);
61
hlayout = new QHBoxLayout();
62
hlayout->setContentsMargins(0, 0, 0, 0);
63
panningContainer->setLayout(hlayout);
64
+ panningContainer->setMinimumWidth(100);
65
66
labelL->setText("L");
67
68
69
70
volume->setMinimum(0);
71
volume->setMaximum(2000);
72
- volume->setMinimumWidth(130);
73
- volume->setMaximumWidth(130);
74
volume->setValue(int(vol * 100.0f));
75
76
forceMono->setChecked((flags & OBS_SOURCE_FLAG_FORCE_MONO) != 0);
77
78
- forceMonoContainer->setMinimumWidth(130);
79
- forceMonoContainer->setMaximumWidth(130);
80
forceMonoContainer->layout()->addWidget(forceMono);
81
forceMonoContainer->layout()->setAlignment(forceMono,
82
Qt::AlignHCenter | Qt::AlignVCenter);
83
84
int64_t cur_sync = obs_source_get_sync_offset(source);
85
syncOffset->setMinimum(-20000);
86
syncOffset->setMaximum(20000);
87
- syncOffset->setMinimumWidth(130);
88
- syncOffset->setMaximumWidth(130);
89
syncOffset->setValue(int(cur_sync / NSEC_PER_MSEC));
90
91
- mediaChannel1->setChecked(true);
92
- mediaChannel1->setText("1");
93
- mediaChannel1->setEnabled(false);
94
- mediaChannel2->setText("2");
95
- mediaChannel2->setEnabled(false);
96
- mediaChannel3->setText("3");
97
- mediaChannel3->setEnabled(false);
98
- mediaChannel4->setText("4");
99
- mediaChannel4->setEnabled(false);
100
-
101
- panningContainer->setMinimumWidth(140);
102
- panningContainer->setMaximumWidth(140);
103
+ mixer1->setText("1");
104
+ mixer1->setChecked(mixers & (1<<0));
105
+ mixer2->setText("2");
106
+ mixer2->setChecked(mixers & (1<<1));
107
+ mixer3->setText("3");
108
+ mixer3->setChecked(mixers & (1<<2));
109
+ mixer4->setText("4");
110
+ mixer4->setChecked(mixers & (1<<3));
111
+
112
panningContainer->layout()->addWidget(labelL);
113
panningContainer->layout()->addWidget(panning);
114
panningContainer->layout()->addWidget(labelR);
115
+ panningContainer->setMaximumWidth(170);
116
117
- mediaChannelContainer->setMinimumWidth(160);
118
- mediaChannelContainer->setMaximumWidth(160);
119
- mediaChannelContainer->layout()->addWidget(mediaChannel1);
120
- mediaChannelContainer->layout()->addWidget(mediaChannel2);
121
- mediaChannelContainer->layout()->addWidget(mediaChannel3);
122
- mediaChannelContainer->layout()->addWidget(mediaChannel4);
123
+ mixerContainer->layout()->addWidget(mixer1);
124
+ mixerContainer->layout()->addWidget(mixer2);
125
+ mixerContainer->layout()->addWidget(mixer3);
126
+ mixerContainer->layout()->addWidget(mixer4);
127
128
QWidget::connect(volume, SIGNAL(valueChanged(int)),
129
this, SLOT(volumeChanged(int)));
130
131
this, SLOT(panningChanged(int)));
132
QWidget::connect(syncOffset, SIGNAL(valueChanged(int)),
133
this, SLOT(syncOffsetChanged(int)));
134
- QWidget::connect(mediaChannel1, SIGNAL(clicked(bool)),
135
- this, SLOT(mediaChannel1Changed(bool)));
136
- QWidget::connect(mediaChannel2, SIGNAL(clicked(bool)),
137
- this, SLOT(mediaChannel2Changed(bool)));
138
- QWidget::connect(mediaChannel3, SIGNAL(clicked(bool)),
139
- this, SLOT(mediaChannel3Changed(bool)));
140
- QWidget::connect(mediaChannel4, SIGNAL(clicked(bool)),
141
- this, SLOT(mediaChannel4Changed(bool)));
142
-
143
- hlayout = new QHBoxLayout;
144
- hlayout->setContentsMargins(0, 0, 0, 0);
145
- hlayout->addWidget(nameLabel);
146
- hlayout->addWidget(volume);
147
- hlayout->addWidget(forceMonoContainer);
148
- hlayout->addWidget(panningContainer);
149
- hlayout->addWidget(syncOffset);
150
- hlayout->addWidget(mediaChannelContainer);
151
- setLayout(hlayout);
152
- setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
153
+ QWidget::connect(mixer1, SIGNAL(clicked(bool)),
154
+ this, SLOT(mixer1Changed(bool)));
155
+ QWidget::connect(mixer2, SIGNAL(clicked(bool)),
156
+ this, SLOT(mixer2Changed(bool)));
157
+ QWidget::connect(mixer3, SIGNAL(clicked(bool)),
158
+ this, SLOT(mixer3Changed(bool)));
159
+ QWidget::connect(mixer4, SIGNAL(clicked(bool)),
160
+ this, SLOT(mixer4Changed(bool)));
161
+
162
+ int lastRow = layout->rowCount();
163
+
164
+ layout->addWidget(nameLabel, lastRow, 0);
165
+ layout->addWidget(volume, lastRow, 1);
166
+ layout->addWidget(forceMonoContainer, lastRow, 2);
167
+ layout->addWidget(panningContainer, lastRow, 3);
168
+ layout->addWidget(syncOffset, lastRow, 4);
169
+ layout->addWidget(mixerContainer, lastRow, 5);
170
+ layout->layout()->setAlignment(mixerContainer,
171
+ Qt::AlignHCenter | Qt::AlignVCenter);
172
+}
173
+
174
+OBSAdvAudioCtrl::~OBSAdvAudioCtrl()
175
+{
176
+ nameLabel->deleteLater();
177
+ volume->deleteLater();
178
+ forceMonoContainer->deleteLater();
179
+ panningContainer->deleteLater();
180
+ syncOffset->deleteLater();
181
+ mixerContainer->deleteLater();
182
}
183
184
/* ------------------------------------------------------------------------- */
185
186
"SourceSyncChanged", Q_ARG(int64_t, offset));
187
}
188
189
+void OBSAdvAudioCtrl::OBSSourceMixersChanged(void *param, calldata_t *calldata)
190
+{
191
+ uint32_t mixers = (uint32_t)calldata_int(calldata, "mixers");
192
+ QMetaObject::invokeMethod(reinterpret_cast<OBSAdvAudioCtrl*>(param),
193
+ "SourceMixersChanged", Q_ARG(uint32_t, mixers));
194
+}
195
+
196
/* ------------------------------------------------------------------------- */
197
/* Qt event queue source callbacks */
198
199
+static inline void setCheckboxState(QCheckBox *checkbox, bool checked)
200
+{
201
+ checkbox->blockSignals(true);
202
+ checkbox->setChecked(checked);
203
+ checkbox->blockSignals(false);
204
+}
205
+
206
void OBSAdvAudioCtrl::SourceFlagsChanged(uint32_t flags)
207
{
208
bool forceMonoVal = (flags & OBS_SOURCE_FLAG_FORCE_MONO) != 0;
209
-
210
- if (forceMono->isChecked() != forceMonoVal)
211
- forceMono->setChecked(forceMonoVal);
212
+ setCheckboxState(forceMono, forceMonoVal);
213
}
214
215
void OBSAdvAudioCtrl::SourceVolumeChanged(float value)
216
217
syncOffset->setValue(offset / NSEC_PER_MSEC);
218
}
219
220
+void OBSAdvAudioCtrl::SourceMixersChanged(uint32_t mixers)
221
+{
222
+ setCheckboxState(mixer1, mixers & (1<<0));
223
+ setCheckboxState(mixer2, mixers & (1<<1));
224
+ setCheckboxState(mixer3, mixers & (1<<2));
225
+ setCheckboxState(mixer4, mixers & (1<<3));
226
+}
227
+
228
/* ------------------------------------------------------------------------- */
229
/* Qt control callbacks */
230
231
232
int64_t(milliseconds) * NSEC_PER_MSEC);
233
}
234
235
-void OBSAdvAudioCtrl::mediaChannel1Changed(bool checked)
236
+static inline void setMixer(obs_source_t *source, const int mixerIdx,
237
+ const bool checked)
238
{
239
- /* TODO */
240
- UNUSED_PARAMETER(checked);
241
+ uint32_t mixers = obs_source_get_audio_mixers(source);
242
+ uint32_t new_mixers = mixers;
243
+
244
+ if (checked) new_mixers |= (1<<mixerIdx);
245
+ else new_mixers &= ~(1<<mixerIdx);
246
+
247
+ obs_source_set_audio_mixers(source, new_mixers);
248
}
249
250
-void OBSAdvAudioCtrl::mediaChannel2Changed(bool checked)
251
+void OBSAdvAudioCtrl::mixer1Changed(bool checked)
252
{
253
- /* TODO */
254
- UNUSED_PARAMETER(checked);
255
+ setMixer(source, 0, checked);
256
}
257
258
-void OBSAdvAudioCtrl::mediaChannel3Changed(bool checked)
259
+void OBSAdvAudioCtrl::mixer2Changed(bool checked)
260
{
261
- /* TODO */
262
- UNUSED_PARAMETER(checked);
263
+ setMixer(source, 1, checked);
264
}
265
266
-void OBSAdvAudioCtrl::mediaChannel4Changed(bool checked)
267
+void OBSAdvAudioCtrl::mixer3Changed(bool checked)
268
{
269
- /* TODO */
270
- UNUSED_PARAMETER(checked);
271
+ setMixer(source, 2, checked);
272
+}
273
+
274
+void OBSAdvAudioCtrl::mixer4Changed(bool checked)
275
+{
276
+ setMixer(source, 3, checked);
277
}
278
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/adv-audio-control.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/adv-audio-control.hpp
Changed
81
1
2
3
#include <obs.hpp>
4
#include <QWidget>
5
+#include <QPointer>
6
7
+class QGridLayout;
8
class QLabel;
9
class QSpinBox;
10
class QCheckBox;
11
class QSlider;
12
13
-class OBSAdvAudioCtrl : public QWidget {
14
+class OBSAdvAudioCtrl : public QObject {
15
Q_OBJECT
16
17
private:
18
OBSSource source;
19
- QLabel *nameLabel = nullptr;
20
- QSpinBox *volume = nullptr;
21
- QCheckBox *forceMono = nullptr;
22
- QSlider *panning = nullptr;
23
- QSpinBox *syncOffset = nullptr;
24
- QCheckBox *mediaChannel1 = nullptr;
25
- QCheckBox *mediaChannel2 = nullptr;
26
- QCheckBox *mediaChannel3 = nullptr;
27
- QCheckBox *mediaChannel4 = nullptr;
28
+
29
+ QPointer<QWidget> forceMonoContainer;
30
+ QPointer<QWidget> mixerContainer;
31
+ QPointer<QWidget> panningContainer;
32
+
33
+ QPointer<QLabel> nameLabel;
34
+ QPointer<QSpinBox> volume;
35
+ QPointer<QCheckBox> forceMono;
36
+ QPointer<QSlider> panning;
37
+ QPointer<QLabel> labelL;
38
+ QPointer<QLabel> labelR;
39
+ QPointer<QSpinBox> syncOffset;
40
+ QPointer<QCheckBox> mixer1;
41
+ QPointer<QCheckBox> mixer2;
42
+ QPointer<QCheckBox> mixer3;
43
+ QPointer<QCheckBox> mixer4;
44
45
OBSSignal volChangedSignal;
46
OBSSignal syncOffsetSignal;
47
OBSSignal flagsSignal;
48
+ OBSSignal mixersSignal;
49
50
static void OBSSourceFlagsChanged(void *param, calldata_t *calldata);
51
static void OBSSourceVolumeChanged(void *param, calldata_t *calldata);
52
static void OBSSourceSyncChanged(void *param, calldata_t *calldata);
53
+ static void OBSSourceMixersChanged(void *param, calldata_t *calldata);
54
55
public:
56
- OBSAdvAudioCtrl(obs_source_t *source_);
57
+ OBSAdvAudioCtrl(QGridLayout *layout, obs_source_t *source_);
58
+ virtual ~OBSAdvAudioCtrl();
59
60
inline obs_source_t *GetSource() const {return source;}
61
62
63
void SourceFlagsChanged(uint32_t flags);
64
void SourceVolumeChanged(float volume);
65
void SourceSyncChanged(int64_t offset);
66
+ void SourceMixersChanged(uint32_t mixers);
67
68
void volumeChanged(int percentage);
69
void downmixMonoChanged(bool checked);
70
void panningChanged(int val);
71
void syncOffsetChanged(int milliseconds);
72
- void mediaChannel1Changed(bool checked);
73
- void mediaChannel2Changed(bool checked);
74
- void mediaChannel3Changed(bool checked);
75
- void mediaChannel4Changed(bool checked);
76
+ void mixer1Changed(bool checked);
77
+ void mixer2Changed(bool checked);
78
+ void mixer3Changed(bool checked);
79
+ void mixer4Changed(bool checked);
80
};
81
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/ar-SA.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/ar-SA.ini
Changed
41
1
2
NameExists.Text="الاسم مستخدم حاليا."
3
4
5
+
6
ConfirmRemove.Title="تأكيد الإزالة"
7
ConfirmRemove.Text="هل أنت متأكد من رغبتك في إزالة '$1' ?"
8
9
10
11
Basic.Settings.Output="المخرج"
12
Basic.Settings.Output.Mode="نوع المخرج"
13
-Basic.Settings.Output.Mode.Simple="بسيط (بث و/أو تسجيل)"
14
-Basic.Settings.Output.Mode.Advanced="متقدم (أنواع إخراج مخصصة)"
15
Basic.Settings.Output.Simple.SavePath="مسار تسجيل FLV"
16
Basic.Settings.Output.VideoBitrate="معدل البت للفيديو"
17
Basic.Settings.Output.AudioBitrate="معدل البت للصوت"
18
19
Basic.Settings.Output.RetryDelay="إعادة محاولة تأخير (ثوان)"
20
Basic.Settings.Output.MaxRetries="أقصى عدد للمحاولات"
21
22
+
23
+
24
Basic.Settings.Video="الفيديو"
25
Basic.Settings.Video.Adapter="محول الفيديو:"
26
Basic.Settings.Video.BaseResolution="قاعدة الأبعاد:"
27
28
Basic.Settings.Video.InvalidResolution="قيمة الأبعاد غير صالحة. يجب أن يكون [العرض] x [الطول] (مثال. 1920 × 1080)"
29
Basic.Settings.Video.CurrentlyActive="إخراج الفيديو نشط حاليا. الرجاء إيقاف كل الإخراجات لتغيير إعدادات الفيديو."
30
31
+
32
Basic.Settings.Audio="الصوت"
33
Basic.Settings.Audio.SampleRate="معدل العينات"
34
Basic.Settings.Audio.Channels="قنوات"
35
36
Basic.Settings.Audio.AuxDevice2="جهاز صوت Mic/Auxiliary 2"
37
Basic.Settings.Audio.AuxDevice3="جهاز صوت Mic/Auxiliary 3"
38
39
+
40
+
41
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/bg-BG.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/bg-BG.ini
Changed
41
1
2
NameExists.Text="Името е вече използвано."
3
4
5
+
6
ConfirmRemove.Title="Потвърди премахване"
7
ConfirmRemove.Text="Наистина ли искате да премахнете \"$1\"?"
8
9
10
11
Basic.Settings.Output="Излъчване"
12
Basic.Settings.Output.Mode="Режим на излъчване"
13
-Basic.Settings.Output.Mode.Simple="Прост (Стрийм и/или записване)"
14
-Basic.Settings.Output.Mode.Advanced="Разширен (Персонализиран тип на излъчване)"
15
Basic.Settings.Output.Simple.SavePath="FLV път за запис"
16
Basic.Settings.Output.VideoBitrate="Видео битрейт"
17
Basic.Settings.Output.AudioBitrate="Аудио битрейт"
18
19
Basic.Settings.Output.RetryDelay="Отлагане на повторно свързване (секунди)"
20
Basic.Settings.Output.MaxRetries="Максимален брой повторни опити"
21
22
+
23
+
24
Basic.Settings.Video="Видео"
25
Basic.Settings.Video.Adapter="Видео адаптер:"
26
Basic.Settings.Video.BaseResolution="Базова резолюция:"
27
28
Basic.Settings.Video.InvalidResolution="Невалидна резолюция. Трябва да бъде [ширина] x [височина] (пример: 1920 x 1080)"
29
Basic.Settings.Video.CurrentlyActive="В момента излъчвате. Моля спрете излъчването за да промените видео настройките."
30
31
+
32
Basic.Settings.Audio="Аудио"
33
Basic.Settings.Audio.SampleRate="Честота на дискретизацията"
34
Basic.Settings.Audio.Channels="Канали"
35
36
Basic.Settings.Audio.AuxDevice2="Микрофон/Вторично аудио устройство 2"
37
Basic.Settings.Audio.AuxDevice3="Микрофон/Вторично аудио устройство 3"
38
39
+
40
+
41
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/cs-CZ.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/cs-CZ.ini
Changed
87
1
2
NameExists.Title="Jméno již existuje"
3
NameExists.Text="Toto jméno již bylo použito."
4
5
+NoNameEntered.Title="Zadejte prosím platné jméno"
6
+NoNameEntered.Text="Jméno nesmí být prázdné."
7
+
8
9
ConfirmRemove.Title="Potvrzení odebrání"
10
ConfirmRemove.Text="Opravdu si přejete odebrat '$1'?"
11
12
Output.ConnectFail.Title="Spojení se nezdařilo"
13
+Output.ConnectFail.BadPath="Chybná cesta nebo adresa připojení. Zkontrolujte, prosím, správnost svých nastavení."
14
+Output.ConnectFail.ConnectFailed="K serveru se nepodařilo připojit"
15
Output.ConnectFail.Disconnected="Odpojen od serveru."
16
17
+Output.BadPath.Title="Špatná cesta k souboru"
18
19
+LogReturnDialog="Záznam byl úspěšně nahrán"
20
LogReturnDialog.CopyURL="Zkopírovat URL"
21
-
22
-
23
-
24
+LogReturnDialog.ErrorUploadingLog="Nahrání záznamu se nezdařilo"
25
+
26
+LicenseAgreement="Licenční smlouva"
27
+LicenseAgreement.PleaseReview="Před použitím OBS si, prosím, přečtěte licenční podmínky. Použitím tohoto programu potvrzujete, že jste si přečetl/a a souhlasíte s podmínkami <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU General Public License v2.0</a>. Pro zobrazení zbytku ujednání sjeďte dolů."
28
+LicenseAgreement.ClickIAgreeToContinue="Pro pokračování klikněte na Souhlasím, pokud souhlasíte s podmínkami ujednání. Před použitím OBS je toto nutné odsouhlasit."
29
+LicenseAgreement.IAgree="Souhlasím"
30
+LicenseAgreement.Exit="Konec"
31
+
32
+Remux.SourceFile="Nahrávání OBS"
33
+Remux.TargetFile="Cílový soubor"
34
+Remux.Remux="Remuxovat"
35
+Remux.FinishedTitle="Remuxování dokončeno"
36
+Remux.Finished="Nahrávka remuxována"
37
+Remux.FinishedError="Nahrávka remuxována, ale soubor nemusí být kompletní"
38
+Remux.SelectRecording="Vyberte OBS nahrávku …"
39
+Remux.SelectTarget="Vyberte cílový soubor …"
40
+Remux.FileExistsTitle="Cílový soubor existuje"
41
+Remux.FileExists="Cílový soubor existuje, chcete jej nahradit ?"
42
+Remux.ExitUnfinishedTitle="Probíhá remuxování"
43
+Remux.ExitUnfinished="Remuxování není dokončeno, ukončení procesu může znemožnit další použití cílového souboru.\nOpravdu chcete tento proces zastavit?"
44
+
45
+UpdateAvailable="K dispozici je nová verze"
46
+UpdateAvailable.Text="Verze %1.%2.%3 je nyní k dispozici. <a href='%4'>Stáhnout</a>"
47
48
49
Basic.Scene="Scéna"
50
51
52
Basic.Main.DefaultSceneName.Text="Scéna %1"
53
54
+Basic.SourceSelect="Vytvořit/vybrat zdroj"
55
Basic.SourceSelect.CreateNew="Vytvořit nový"
56
Basic.SourceSelect.AddExisting="Přidat existující"
57
58
+Basic.PropertiesWindow="Vlastnosti pro '%1'"
59
Basic.PropertiesWindow.AutoSelectFormat="%1 (nepodporováno; auto-výběr: %2)"
60
+Basic.PropertiesWindow.SelectColor="Výběr barvy"
61
+Basic.PropertiesWindow.SelectFont="Výběr písma"
62
63
64
65
+Basic.TransformWindow.Position="Umístění"
66
+Basic.TransformWindow.Rotation="Otočení"
67
+Basic.TransformWindow.Size="Velikost"
68
69
70
71
72
+Basic.Main.Scenes="Scény"
73
+Basic.Main.Sources="Zdroje"
74
+Basic.Main.Connecting="Připojování..."
75
76
Basic.MainMenu.File="&Soubor"
77
78
79
80
81
82
+
83
+
84
+
85
+
86
+
87
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/da-DK.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/da-DK.ini
Changed
110
1
2
OK="OK"
3
Apply="Anvend"
4
Cancel="Annuller"
5
+Save="Gem"
6
+Discard="Kassér"
7
Yes="Ja"
8
No="Nej"
9
Add="Tilføj"
10
11
MoveUp="Flyt Op"
12
MoveDown="Flyt Ned"
13
Settings="Indstillinger"
14
+Name="Navn"
15
Exit="Afslut"
16
Mixer="Mixer"
17
Browse="Browse"
18
19
NoNameEntered.Title="Indtast venligst et gyldigt navn"
20
NoNameEntered.Text="Du kan ikke bruge tomme navne."
21
22
+ConfirmExit.Title="Forlad OBS?"
23
+ConfirmExit.Text="OBS er i øjeblikket aktivt. Er du sikker på du ønsker at forlade det?"
24
+
25
ConfirmRemove.Title="Bekræfte Fjern"
26
ConfirmRemove.Text="Er du sikker på du ønsker at fjerne '$1'?"
27
28
29
Basic.PropertiesWindow.AutoSelectFormat="%1 (ikke understøttet; autoselect: %2)"
30
Basic.PropertiesWindow.SelectColor="Vælg farve"
31
Basic.PropertiesWindow.SelectFont="Vælg skrifttype"
32
+Basic.PropertiesWindow.ConfirmTitle="Indstillinger ændret"
33
+Basic.PropertiesWindow.Confirm="Der er ændringer, som ikke er gemt. Vil du gerne beholde dem?"
34
35
Basic.InteractionWindow="Interagere med '%1'"
36
37
38
Basic.MainMenu.Edit.Order.MoveDown="Flyt Ned (&D)"
39
Basic.MainMenu.Edit.Order.MoveToTop="Flyt til &Toppen"
40
Basic.MainMenu.Edit.Order.MoveToBottom="Flyt til &Bunden"
41
+Basic.MainMenu.Edit.AdvAudio="&Avancerede lydegenskaber"
42
43
Basic.MainMenu.Help="&Hjælp"
44
Basic.MainMenu.Help.Logs="&Logfiler"
45
46
Basic.Settings.Stream.StreamType="Stream Type"
47
48
Basic.Settings.Output="Output"
49
+Basic.Settings.Output.Encoder="Encoder"
50
+Basic.Settings.Output.SelectDirectory="Vælg optagelsesmappe"
51
+Basic.Settings.Output.SelectFile="Vælg optagelsesfil"
52
Basic.Settings.Output.Mode="Output Mode"
53
-Basic.Settings.Output.Mode.Simple="Enkel (Stream og/eller record)"
54
-Basic.Settings.Output.Mode.Advanced="Avanceret (brugerdefinerede outputtype)"
55
+Basic.Settings.Output.Mode.Simple="Simpel"
56
+Basic.Settings.Output.Mode.Adv="Avanceret"
57
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg output"
58
Basic.Settings.Output.Simple.SavePath="FLV Recording sti"
59
Basic.Settings.Output.VideoBitrate="Video Bitrate"
60
Basic.Settings.Output.AudioBitrate="Audio Bitrate"
61
62
Basic.Settings.Output.RetryDelay="Retry forsinkelse (sekunder)"
63
Basic.Settings.Output.MaxRetries="Maksimum forsøg"
64
Basic.Settings.Output.Advanced="Aktivere avancerede Encoder indstillinger"
65
-Basic.Settings.Output.X264Preset="x264 preset"
66
-Basic.Settings.Output.CustomX264Settings="Brugerdefinerede x264 indstillinger"
67
Basic.Settings.Output.UseCBR="Brug konstant bitrate"
68
69
+Basic.Settings.Output.Adv.AudioTrack="Lydspor"
70
+Basic.Settings.Output.Adv.Streaming="Streaming"
71
+Basic.Settings.Output.Adv.ApplyServiceSettings="Håndhæv streaming service encoder indstillinger"
72
+Basic.Settings.Output.Adv.Audio.Track1="Spor 1"
73
+Basic.Settings.Output.Adv.Audio.Track2="Spor 2"
74
+Basic.Settings.Output.Adv.Audio.Track3="Spor 3"
75
+Basic.Settings.Output.Adv.Audio.Track4="Spor 4"
76
+
77
+Basic.Settings.Output.Adv.Recording="Optagelse"
78
+Basic.Settings.Output.Adv.Recording.Type="Type"
79
+Basic.Settings.Output.Adv.Recording.Type.Standard="Standard"
80
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Brug stream encoder)"
81
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Alle filer"
82
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Filsti eller URL"
83
+
84
Basic.Settings.Video="Video"
85
Basic.Settings.Video.Adapter="Skærmkort:"
86
Basic.Settings.Video.BaseResolution="Basis Opløsning:"
87
88
Basic.Settings.Video.InvalidResolution="Ugyldig opløsningsværdi. Skal være [bredde] x [højde] (dvs. 1920 x 1080)"
89
Basic.Settings.Video.CurrentlyActive="Video output er aktiv i øjeblikket. Venligst slukke eventuelle udgange til at ændre videoindstillinger."
90
91
+
92
Basic.Settings.Audio="Lyd"
93
Basic.Settings.Audio.SampleRate="Sample Rate"
94
Basic.Settings.Audio.Channels="Kanaler"
95
96
Basic.Settings.Audio.AuxDevice2="Mic/Auxiliary lydenhed 2"
97
Basic.Settings.Audio.AuxDevice3="Mic/Auxiliary lydenhed 3"
98
99
+Basic.Settings.Advanced="Avanceret"
100
+Basic.Settings.Advanced.Video.ColorFormat="Farveformat"
101
+Basic.Settings.Advanced.Video.ColorRange.Partial="Delvis"
102
+Basic.Settings.Advanced.Video.ColorRange.Full="Fuld"
103
+
104
+Basic.AdvAudio="Avancerede lydegenskaber"
105
+Basic.AdvAudio.Name="Navn"
106
+Basic.AdvAudio.Volume="Volumen (%)"
107
+Basic.AdvAudio.Panning="Panorering"
108
+Basic.AdvAudio.AudioTracks="Spor"
109
+
110
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/de-DE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/de-DE.ini
Changed
196
1
2
OK="OK"
3
Apply="Anwenden"
4
Cancel="Abbrechen"
5
+Save="Speichern"
6
+Discard="Verwerfen"
7
Yes="Ja"
8
No="Nein"
9
Add="Hinzufügen"
10
11
MoveUp="Nach oben bewegen"
12
MoveDown="Nach unten bewegen"
13
Settings="Einstellungen"
14
+Name="Name"
15
Exit="Beenden"
16
Mixer="Mixer"
17
Browse="Durchsuchen"
18
19
NoNameEntered.Title="Bitte geben Sie einen gültigen Namen ein"
20
NoNameEntered.Text="Sie können leere Namen nicht verwenden."
21
22
+ConfirmExit.Title="OBS beenden?"
23
+ConfirmExit.Text="OBS ist derzeit aktiv. Sind Sie sicher, dass Sie die Anwendung beenden wollen?"
24
+
25
ConfirmRemove.Title="Entfernen bestätigen"
26
ConfirmRemove.Text="Sind Sie sicher, dass Sie '$1' entfernen möchten?"
27
28
-Output.ConnectFail.Title="Verbindung fehlgeschalgen"
29
-Output.ConnectFail.BadPath="Ungültiger Pfad oder Verbindungs URL. Bitte überprüfen Sie Ihre Einstellungen und stellen Sie sicher, dass sie gültig sind."
30
+Output.ConnectFail.Title="Verbindung fehlgeschlagen"
31
+Output.ConnectFail.BadPath="Ungültiger Pfad oder Verbindungs-URL. Bitte überprüfen Sie Ihre Einstellungen und stellen Sie sicher, dass sie gültig sind."
32
Output.ConnectFail.ConnectFailed="Verbindung zum Server fehlgeschlagen"
33
Output.ConnectFail.InvalidStream="Konnte auf den angegebenen Kanal oder Streamschlüssel nicht zugreifen. Dies kann daran liegen, dass der Schlüssel oder Kanal ungültig ist, oder der Server noch denkt, dass Sie angemeldet bist."
34
-Output.ConnectFail.Error="Ein unerwarteter Fehler ist beim Verbindungsversuch zum Server aufgetreten. Mehr Informationen in der Logdatei."
35
+Output.ConnectFail.Error="Ein unerwarteter Fehler ist beim Verbindungsversuch zum Server aufgetreten. Mehr Informationen finden Sie in der Logdatei."
36
Output.ConnectFail.Disconnected="Verbindung zum Server getrennt."
37
38
Output.BadPath.Title="Ungültiger Dateipfad"
39
40
LogReturnDialog.ErrorUploadingLog="Fehler beim Upload der Logdatei"
41
42
LicenseAgreement="Lizenzvereinbarung"
43
-LicenseAgreement.PleaseReview="Bitte lesen Sie die Lizenzbedingungen vor der Verwendung von OBS. Mit dem verwenden dieses Programms, bestätigen Sie, dass Sie sie gelesen haben und den Bedingungen der <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU General Public License v2.0</a> zustimmen. Bitte scrollen Sie nach unten, um den Rest der Vereinbarung zu sehen."
44
+LicenseAgreement.PleaseReview="Bitte lesen Sie die Lizenzbedingungen vor der Verwendung von OBS. Mit dem verwenden dieses Programms, bestätigen Sie, dass Sie diese gelesen haben und den Bedingungen der <a href='http://www.gnu.org/licenses/gpl-2.0.html'>GNU General Public License v2.0</a> zustimmen. Bitte scrollen Sie nach unten, um den Rest der Vereinbarung zu sehen."
45
LicenseAgreement.ClickIAgreeToContinue="Wenn Sie die Vereinbarung akzeptieren, klicken Sie auf ich stimme zu, um fortzufahren. Sie müssen akzeptieren, um OBS verwenden zu können."
46
LicenseAgreement.IAgree="Ich stimme zu"
47
LicenseAgreement.Exit="Beenden"
48
49
Remux.SelectRecording="Wählen Sie die OBS Aufnahme aus …"
50
Remux.SelectTarget="Wähle Zieldatei …"
51
Remux.FileExistsTitle="Zieldatei ist bereits vorhanden"
52
-Remux.FileExists="Zieldatei ist bereits vorhanden, möchten Sie sie ersetzen?"
53
+Remux.FileExists="Zieldatei ist bereits vorhanden. Möchten Sie diese ersetzen?"
54
Remux.ExitUnfinishedTitle="Remuxen in Bearbeitung"
55
-Remux.ExitUnfinished="Remuxen ist noch nicht fertig, wenn Sie jetzt stoppen kann die Zieldatei unbrauchbar werden. \nSind Sie sicher, dass Sie das Remuxen beenden möchten?"
56
+Remux.ExitUnfinished="Das Remuxen ist noch nicht fertig. Wenn Sie jetzt stoppen, kann die Zieldatei unbrauchbar werden. \nSind Sie sicher, dass Sie das Remuxen beenden möchten?"
57
58
UpdateAvailable="Neues Update verfügbar"
59
UpdateAvailable.Text="Version %1.%2.%3 ist nun verfügbar. <a href='%4'>Hier klicken zum Download</a>"
60
61
62
Basic.SourceSelect="Quelle erstellen/auswählen"
63
Basic.SourceSelect.CreateNew="Neu erstellen"
64
-Basic.SourceSelect.AddExisting="Existierender hinzufügen"
65
+Basic.SourceSelect.AddExisting="Existierende hinzufügen"
66
67
Basic.PropertiesWindow="Eigenschaften für '%1'"
68
Basic.PropertiesWindow.AutoSelectFormat="%1 (nicht unterstützt; automatisch ausgewählt: %2)"
69
Basic.PropertiesWindow.SelectColor="Farbe auswählen"
70
Basic.PropertiesWindow.SelectFont="Schriftart auswählen"
71
+Basic.PropertiesWindow.ConfirmTitle="Einstellungen geändert"
72
+Basic.PropertiesWindow.Confirm="Es gibt ungesicherte Änderungen. Möchten Sie diese behalten?"
73
74
Basic.InteractionWindow="Interagiere mit '%1'"
75
76
77
Basic.TransformWindow.BoundsType.Stretch="Bis zu den Begrenzungen strecken"
78
79
Basic.Main.AddSourceHelp.Title="Konnte Quelle nicht hinzufügen"
80
-Basic.Main.AddSourceHelp.Text="Sie müssen mindestens 1 Szene besitzen um eine Quelle hinzuzufügen."
81
+Basic.Main.AddSourceHelp.Text="Sie müssen mindestens 1 Szene besitzen, um eine Quelle hinzuzufügen."
82
83
Basic.Main.Scenes="Szenen"
84
Basic.Main.Sources="Quellen"
85
86
Basic.MainMenu.Edit.Transform.ResetTransform="Transformation zu&rücksetzen"
87
Basic.MainMenu.Edit.Transform.Rotate90CW="Um 90° im Uhrzeigersinn drehen"
88
Basic.MainMenu.Edit.Transform.Rotate90CCW="Um 90° gegen den Uhrzeigersinn drehen"
89
-Basic.MainMenu.Edit.Transform.Rotate180="Um 180 Grad drehen"
90
+Basic.MainMenu.Edit.Transform.Rotate180="Um 180° drehen"
91
Basic.MainMenu.Edit.Transform.FlipHorizontal="&Horizontal spiegeln"
92
Basic.MainMenu.Edit.Transform.FlipVertical="&Vertikal spiegeln"
93
Basic.MainMenu.Edit.Transform.FitToScreen="An Bildschirmgröße anpassen (&F)"
94
95
Basic.MainMenu.Edit.Order.MoveDown="Nach unten bewegen (&D)"
96
Basic.MainMenu.Edit.Order.MoveToTop="Ganz nach oben bewegen (&T)"
97
Basic.MainMenu.Edit.Order.MoveToBottom="Ganz nach unten &bewegen"
98
+Basic.MainMenu.Edit.AdvAudio="Erweiterte &Audioeigenschaften"
99
100
Basic.MainMenu.Help="&Hilfe"
101
Basic.MainMenu.Help.Logs="&Logdateien"
102
103
Basic.Settings.Stream.StreamType="Stream Typ"
104
105
Basic.Settings.Output="Ausgabe"
106
-Basic.Settings.Output.Mode="Output Modus"
107
-Basic.Settings.Output.Mode.Simple="Einfach (Streamen und/oder Aufnehmen)"
108
-Basic.Settings.Output.Mode.Advanced="Fortgeschritten (Benutzerdefinierter Ausgabetyp)"
109
+Basic.Settings.Output.Encoder="Encoder"
110
+Basic.Settings.Output.SelectDirectory="Wählen Sie das Aufnahmeverzeichnis"
111
+Basic.Settings.Output.SelectFile="Wählen Sie die Aufnahmedatei"
112
+Basic.Settings.Output.Mode="Ausgabemodus"
113
+Basic.Settings.Output.Mode.Simple="Einfach"
114
+Basic.Settings.Output.Mode.Adv="Erweitert"
115
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg Ausgabe"
116
Basic.Settings.Output.Simple.SavePath="FLV Aufnahmepfad"
117
Basic.Settings.Output.VideoBitrate="Video-Bitrate"
118
Basic.Settings.Output.AudioBitrate="Audio-Bitrate"
119
120
Basic.Settings.Output.RetryDelay="Wiederverbindungsverzögerung (Sekunden)"
121
Basic.Settings.Output.MaxRetries="Maximale Wiederholungsversuche"
122
Basic.Settings.Output.Advanced="Erweiterte Encoder-Einstellungen aktivieren"
123
-Basic.Settings.Output.X264Preset="x264 Voreinstellung"
124
-Basic.Settings.Output.CustomX264Settings="Benutzerdefinierte x264 Einstellungen"
125
-Basic.Settings.Output.UseCBR="Benutze Konstante Bitrate"
126
+Basic.Settings.Output.EncoderPreset="Encoder-Voreinstellung (höher = weniger CPU Auslastung)"
127
+Basic.Settings.Output.CustomEncoderSettings="Benutzerdefinierte Encoder-Einstellungen"
128
+Basic.Settings.Output.UseCBR="Benutze konstante Bitrate"
129
+Basic.Settings.Output.UseBufferSize="Benutzerdefinierte Puffergröße"
130
+
131
+Basic.Settings.Output.Adv.Rescale="Ausgabe umskalieren"
132
+Basic.Settings.Output.Adv.AudioTrack="Audiospur"
133
+Basic.Settings.Output.Adv.Streaming="Streamen"
134
+Basic.Settings.Output.Adv.ApplyServiceSettings="Erzwinge Streamingdienst-Encodereinstellungen"
135
+Basic.Settings.Output.Adv.Audio.Track1="Spur 1"
136
+Basic.Settings.Output.Adv.Audio.Track2="Spur 2"
137
+Basic.Settings.Output.Adv.Audio.Track3="Spur 3"
138
+Basic.Settings.Output.Adv.Audio.Track4="Spur 4"
139
+
140
+Basic.Settings.Output.Adv.Recording="Aufnehmen"
141
+Basic.Settings.Output.Adv.Recording.Type="Art"
142
+Basic.Settings.Output.Adv.Recording.Type.Standard="Normal"
143
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Benutzerdefinierte Ausgabe (FFmpeg)"
144
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Benutze Streamencoder)"
145
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Häufige Aufnahmeformate"
146
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Alle Dateien"
147
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Dateipfad oder URL"
148
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Video-Encoder (leer = Standard)"
149
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Video Encoder-Einstellungen (falls gewünscht)"
150
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Audio-Encoder (leer = Standard)"
151
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Audio Encoder-Einstellungen (falls gewünscht)"
152
153
Basic.Settings.Video="Video"
154
Basic.Settings.Video.Adapter="Grafikkarte:"
155
156
Basic.Settings.Video.Denominator="Nenner:"
157
Basic.Settings.Video.Renderer="Renderer:"
158
Basic.Settings.Video.InvalidResolution="Ungültige Auflösung. Muss sein [Breite]x[Höhe] (z.B. 1920x1080)"
159
-Basic.Settings.Video.CurrentlyActive="Videoausgabe ist derzeit aktiv. Bitte schalten Sie alle Ausgaben ab um die Videoeinstellungen zu ändern."
160
+Basic.Settings.Video.CurrentlyActive="Videoausgabe ist derzeit aktiv. Bitte schalten Sie alle Ausgaben ab, um die Videoeinstellungen zu ändern."
161
+
162
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (am schnellsten, aber Unscharf bei Skalierung)"
163
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (geschärfte Skalierung, 16 Stichproben)"
164
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (geschärfte Skalierung, 32 Stichproben)"
165
166
Basic.Settings.Audio="Audio"
167
Basic.Settings.Audio.SampleRate="Abtastrate"
168
Basic.Settings.Audio.Channels="Kanäle"
169
-Basic.Settings.Audio.DesktopDevice="Desktop Audio Gerät"
170
-Basic.Settings.Audio.DesktopDevice2="Desktop Audio Gerät 2"
171
-Basic.Settings.Audio.AuxDevice="Mikrofon/Extern Audio Gerät"
172
-Basic.Settings.Audio.AuxDevice2="Mikrofon/Extern Audio Gerät 2"
173
-Basic.Settings.Audio.AuxDevice3="Mikrofon/Extern Audio Gerät 3"
174
+Basic.Settings.Audio.DesktopDevice="Desktop Audiogerät"
175
+Basic.Settings.Audio.DesktopDevice2="Desktop Audiogerät 2"
176
+Basic.Settings.Audio.AuxDevice="Mikrofon/Externes Audiogerät"
177
+Basic.Settings.Audio.AuxDevice2="Mikrofon/Externes Audiogerät 2"
178
+Basic.Settings.Audio.AuxDevice3="Mikrofon/Externes Audiogerät 3"
179
+
180
+Basic.Settings.Advanced="Erweitert"
181
+Basic.Settings.Advanced.Audio.BufferingTime="Audio Pufferungszeit"
182
+Basic.Settings.Advanced.Video.ColorFormat="Farbformat"
183
+Basic.Settings.Advanced.Video.ColorSpace="YUV-Farbraum"
184
+Basic.Settings.Advanced.Video.ColorRange="YUV Farbpalette"
185
+Basic.Settings.Advanced.Video.ColorRange.Partial="Teilweise"
186
+Basic.Settings.Advanced.Video.ColorRange.Full="Voll"
187
+
188
+Basic.AdvAudio="Erweiterte Audioeigenschaften"
189
+Basic.AdvAudio.Name="Name"
190
+Basic.AdvAudio.Volume="Lautstärke (%)"
191
+Basic.AdvAudio.Mono="Heruntermischen zu Mono"
192
+Basic.AdvAudio.Panning="Schwenken"
193
+Basic.AdvAudio.SyncOffset="Sync Verschiebung (ms)"
194
+Basic.AdvAudio.AudioTracks="Spuren"
195
196
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/el-GR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/el-GR.ini
Changed
128
1
2
OK="ΟΚ"
3
Apply="Εφαρμογή"
4
Cancel="Ακύρωση"
5
+Save="Αποθήκευση"
6
+Discard="Απόρριψη"
7
Yes="Ναι"
8
No="Όχι"
9
Add="Προσθήκη"
10
11
MoveUp="Μετακίνηση Πάνω"
12
MoveDown="Μετακίνηση Κάτω"
13
Settings="Ρυθμίσεις"
14
+Name="Όνομα"
15
Exit="Έξοδος"
16
Mixer="Μίξερ"
17
Browse="Αναζήτηση"
18
19
NoNameEntered.Title="Πληκτρολογήστε ένα έγκυρο όνομα"
20
NoNameEntered.Text="Δεν μπορείτε να χρησιμοποιήσετε κενά ονόματα."
21
22
+ConfirmExit.Title="Έξοδος από το OBS;"
23
+ConfirmExit.Text="Το OBS είναι ενεργό αυτή τη στιγμή. Είστε σίγουροι ότι θέλετε να το κλείσετε;"
24
+
25
ConfirmRemove.Title="Επιβεβαίωση Αφαίρεσης"
26
ConfirmRemove.Text="Είστε βέβαιοι ότι θέλετε να καταργήσετε \"$1\";"
27
28
29
Basic.PropertiesWindow.AutoSelectFormat="%1 (μη υποστηριζόμενη; autoselect: %2)"
30
Basic.PropertiesWindow.SelectColor="Επιλέξτε χρώμα"
31
Basic.PropertiesWindow.SelectFont="Επιλέξτε γραμματοσειρά"
32
+Basic.PropertiesWindow.ConfirmTitle="Άλλαξαν οι Ρυθμίσεις"
33
+Basic.PropertiesWindow.Confirm="Υπάρχουν μη αποθηκευμένες αλλαγές. Θέλετε να τις κρατήσετε;"
34
35
Basic.InteractionWindow="Αλληλεπίδραση με '%1'"
36
37
38
Basic.Main.Scenes="Σκηνές"
39
Basic.Main.Sources="Πηγές"
40
Basic.Main.Connecting="Σύνδεση..."
41
-Basic.Main.StartRecording="Έναρξη Ηχογράφησης"
42
+Basic.Main.StartRecording="Έναρξη Καταγραφής"
43
Basic.Main.StartStreaming="Έναρξη Μετάδοσης"
44
-Basic.Main.StopRecording="Διακοπή Ηχογράφησης"
45
+Basic.Main.StopRecording="Διακοπή Καταγραφής"
46
Basic.Main.StopStreaming="Διακοπή Μετάδοσης"
47
48
Basic.MainMenu.File="Αρχείο(&F)"
49
50
Basic.MainMenu.Edit.Order.MoveDown="Μετακίνηση Κάτω(&D)"
51
Basic.MainMenu.Edit.Order.MoveToTop="Μετακίνηση στην Κορυφή(&T)"
52
Basic.MainMenu.Edit.Order.MoveToBottom="Μετακίνηση τελέιως Κάτω(&B)"
53
+Basic.MainMenu.Edit.AdvAudio="Ιδιότητες(&A) Ήχου για Προχωρημένους"
54
55
Basic.MainMenu.Help="Βοήθεια(&H)"
56
Basic.MainMenu.Help.Logs="Αρχεία(&) Καταγραφής"
57
58
Basic.Settings.Stream.StreamType="Τύπος Μετάδοσης"
59
60
Basic.Settings.Output="Έξοδος"
61
+Basic.Settings.Output.Encoder="Κωδικοποιητής"
62
+Basic.Settings.Output.SelectDirectory="Επιλέξτε κατάλογο καταγραφής"
63
+Basic.Settings.Output.SelectFile="Επιλέξτε αρχείο καταγραφής"
64
Basic.Settings.Output.Mode="Λειτουργία Εξόδου"
65
-Basic.Settings.Output.Mode.Simple="Απλό (Μετάδοση και/ή εγγραφή)"
66
-Basic.Settings.Output.Mode.Advanced="Προηγμένο (Προσαρμοσμένος τύπος εξόδου)"
67
+Basic.Settings.Output.Mode.Adv="Σύνθετες επιλογές"
68
+Basic.Settings.Output.Mode.FFmpeg="Έξοδος FFmpeg"
69
Basic.Settings.Output.Simple.SavePath="Διαδρομή Καταγραφής FLV"
70
Basic.Settings.Output.VideoBitrate="Ρυθμός Bit του Βίντεο"
71
Basic.Settings.Output.AudioBitrate="Ρυθμός Bit του Ήχου"
72
73
Basic.Settings.Output.RetryDelay="Καθυστέρηση Επανάληψης (δευτερόλεπτα)"
74
Basic.Settings.Output.MaxRetries="Μέγιστος Αριθμός Επαναλήψεων"
75
Basic.Settings.Output.Advanced="Ενεργοποίηση Ρυθμίσεις Κωδικοποιήτη Για Προχωρημένους"
76
-Basic.Settings.Output.X264Preset="Προφίλ x264"
77
-Basic.Settings.Output.CustomX264Settings="Προσαρμοσμένες Ρυθμίσεις x264"
78
+Basic.Settings.Output.EncoderPreset="Προφίλ Κωδικοποιητή (υψηλότερο = λιγότερη CPU)"
79
+Basic.Settings.Output.CustomEncoderSettings="Προσαρμοσμένες Ρυθμίσεις Κωδικοποιητή"
80
Basic.Settings.Output.UseCBR="Χρήση Συνεχής Ροής Bit"
81
+Basic.Settings.Output.UseBufferSize="Χρήση Προσαρμοσμένου Μεγέθους Buffer"
82
+
83
+Basic.Settings.Output.Adv.Rescale="Κλιμάκωση Εξόδου"
84
+Basic.Settings.Output.Adv.AudioTrack="Κομμάτι ήχου"
85
+Basic.Settings.Output.Adv.ApplyServiceSettings="Επιβολή ρυθμίσεων κωδικοποιητή της υπηρεσίας streaming"
86
+Basic.Settings.Output.Adv.Audio.Track1="Κομμάτι 1"
87
+Basic.Settings.Output.Adv.Audio.Track2="Κομμάτι 2"
88
+Basic.Settings.Output.Adv.Audio.Track3="Κομμάτι 3"
89
+Basic.Settings.Output.Adv.Audio.Track4="Κομμάτι 4"
90
+
91
+Basic.Settings.Output.Adv.Recording.Type="Τύπος"
92
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Προσαρμοσμένη Έξοδος (FFmpeg)"
93
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Χρήση κωδικοποιητή ροής)"
94
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Κοινή μορφές εγγραφής"
95
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Όλα τα αρχεία"
96
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Διαδρομή αρχείου ή URL"
97
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Κωδικοποιητής Βίντεο (κενό=προεπιλογή)"
98
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Ρυθμίσεις Κωδικοποιητή Βίντεο (αν υπάρχουν)"
99
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Κωδικοποιητής Ήχου (κενό=προεπιλογή)"
100
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Ρυθμίσεις Κωδικοποιητή Ήχου (αν υπάρχουν)"
101
102
Basic.Settings.Video="Βίντεο"
103
Basic.Settings.Video.Adapter="Προσαρμογέας Βίντεο:"
104
105
Basic.Settings.Video.InvalidResolution="Μη έγκυρη τιμή ανάλυσης. Πρέπει να είναι [width]x[height] (π.χ. 1920x1080)"
106
Basic.Settings.Video.CurrentlyActive="Δεν υπάρχει ενεργή έξοδος βίντεο. Παρακαλώ απενεργοποιήστε κάθε έξοδο για να αλλάξετε τις ρυθμίσεις βίντεο."
107
108
+Basic.Settings.Video.DownscaleFilter.Bilinear="Διγραμμικό (Πιο γρήγορο, αλλά θολό στην κλιμάκωση)"
109
+Basic.Settings.Video.DownscaleFilter.Bicubic="Δικυβικό (Οξυμμένη κλιμάκωση, 16 δείγματα)"
110
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Οξυμμένη κλιμάκωση, 32 δείγματα)"
111
+
112
Basic.Settings.Audio="Ήχος"
113
Basic.Settings.Audio.SampleRate="Ρυθμός Δειγματοληψίας"
114
Basic.Settings.Audio.Channels="Κανάλια"
115
116
Basic.Settings.Audio.AuxDevice2="Μικρόφωνο/Αuxillary Συσκευή Ήχου 2"
117
Basic.Settings.Audio.AuxDevice3="Μικρόφωνο/Αuxillary Συσκευή Ήχου 3"
118
119
+
120
+Basic.AdvAudio="Ιδιότητες Ήχου για Προχωρημένους"
121
+Basic.AdvAudio.Name="Όνομα"
122
+Basic.AdvAudio.Volume="Ένταση (%)"
123
+Basic.AdvAudio.Mono="Αποκωδικοποίηση σε Mono"
124
+Basic.AdvAudio.Panning="Πανοραμικό"
125
+Basic.AdvAudio.SyncOffset="Μετατόπιση Συγχρονισμού (ms)"
126
+Basic.AdvAudio.AudioTracks="Κομμάτια"
127
+
128
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/en-US.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/en-US.ini
Changed
113
1
2
OK="OK"
3
Apply="Apply"
4
Cancel="Cancel"
5
+Save="Save"
6
+Discard="Discard"
7
Yes="Yes"
8
No="No"
9
Add="Add"
10
11
MoveUp="Move Up"
12
MoveDown="Move Down"
13
Settings="Settings"
14
+Name="Name"
15
Exit="Exit"
16
Mixer="Mixer"
17
Browse="Browse"
18
19
NoNameEntered.Title="Please enter a valid name"
20
NoNameEntered.Text="You cannot use empty names."
21
22
+# confirm exit dialog box
23
+ConfirmExit.Title="Exit OBS?"
24
+ConfirmExit.Text="OBS is currently active. Are you sure you wish to exit?"
25
+
26
# confirm delete dialog box
27
ConfirmRemove.Title="Confirm Remove"
28
ConfirmRemove.Text="Are you sure you wish to remove '$1'?"
29
30
Basic.PropertiesWindow.AutoSelectFormat="%1 (unsupported; autoselect: %2)"
31
Basic.PropertiesWindow.SelectColor="Select color"
32
Basic.PropertiesWindow.SelectFont="Select font"
33
+Basic.PropertiesWindow.ConfirmTitle="Settings Changed"
34
+Basic.PropertiesWindow.Confirm="There are unsaved changes. Do you want to keep them?"
35
36
# interaction window
37
Basic.InteractionWindow="Interacting with '%1'"
38
39
40
# basic mode 'output' settings
41
Basic.Settings.Output="Output"
42
+Basic.Settings.Output.Encoder="Encoder"
43
+Basic.Settings.Output.SelectDirectory="Select Recording Directory"
44
+Basic.Settings.Output.SelectFile="Select Recording File"
45
Basic.Settings.Output.Mode="Output Mode"
46
-Basic.Settings.Output.Mode.Simple="Simple (Stream and/or record)"
47
-Basic.Settings.Output.Mode.Advanced="Advanced (Custom output type)"
48
+Basic.Settings.Output.Mode.Simple="Simple"
49
+Basic.Settings.Output.Mode.Adv="Advanced"
50
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg Output"
51
Basic.Settings.Output.Simple.SavePath="FLV Recording Path"
52
Basic.Settings.Output.VideoBitrate="Video Bitrate"
53
Basic.Settings.Output.AudioBitrate="Audio Bitrate"
54
55
Basic.Settings.Output.RetryDelay="Retry Delay (seconds)"
56
Basic.Settings.Output.MaxRetries="Maximum Retries"
57
Basic.Settings.Output.Advanced="Enable Advanced Encoder Settings"
58
-Basic.Settings.Output.X264Preset="x264 Preset"
59
-Basic.Settings.Output.CustomX264Settings="Custom x264 Settings"
60
+Basic.Settings.Output.EncoderPreset="Encoder Preset (higher = less CPU)"
61
+Basic.Settings.Output.CustomEncoderSettings="Custom Encoder Settings"
62
Basic.Settings.Output.UseCBR="Use Constant Bitrate"
63
+Basic.Settings.Output.UseBufferSize="Use Custom Buffer Size"
64
+
65
+# basic mode 'output' settings - advanced section
66
+Basic.Settings.Output.Adv.Rescale="Rescale Output"
67
+Basic.Settings.Output.Adv.AudioTrack="Audio Track"
68
+Basic.Settings.Output.Adv.Streaming="Streaming"
69
+Basic.Settings.Output.Adv.ApplyServiceSettings="Enforce streaming service encoder settings"
70
+Basic.Settings.Output.Adv.Audio.Track1="Track 1"
71
+Basic.Settings.Output.Adv.Audio.Track2="Track 2"
72
+Basic.Settings.Output.Adv.Audio.Track3="Track 3"
73
+Basic.Settings.Output.Adv.Audio.Track4="Track 4"
74
+
75
+# basic mode 'output' settings - advanced section - recording subsection
76
+Basic.Settings.Output.Adv.Recording="Recording"
77
+Basic.Settings.Output.Adv.Recording.Type="Type"
78
+Basic.Settings.Output.Adv.Recording.Type.Standard="Standard"
79
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Custom Output (FFmpeg)"
80
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Use stream encoder)"
81
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Common recording formats"
82
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="All Files"
83
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="File path or URL"
84
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Video Encoder (blank=default)"
85
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Video Encoder Settings (if any)"
86
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Audio Encoder (blank=default)"
87
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Audio Encoder Settings (if any)"
88
89
# basic mode 'video' settings
90
Basic.Settings.Video="Video"
91
92
Basic.Settings.Audio.AuxDevice2="Mic/Auxiliary Audio Device 2"
93
Basic.Settings.Audio.AuxDevice3="Mic/Auxiliary Audio Device 3"
94
95
+# basic mode 'advanced' settings
96
+Basic.Settings.Advanced="Advanced"
97
+Basic.Settings.Advanced.Audio.BufferingTime="Audio Buffering Time"
98
+Basic.Settings.Advanced.Video.ColorFormat="Color Format"
99
+Basic.Settings.Advanced.Video.ColorSpace="YUV Color Space"
100
+Basic.Settings.Advanced.Video.ColorRange="YUV Color Range"
101
+Basic.Settings.Advanced.Video.ColorRange.Partial="Partial"
102
+Basic.Settings.Advanced.Video.ColorRange.Full="Full"
103
+
104
# advanced audio properties
105
Basic.AdvAudio="Advanced Audio Properties"
106
Basic.AdvAudio.Name="Name"
107
108
Basic.AdvAudio.Mono="Downmix to Mono"
109
Basic.AdvAudio.Panning="Panning"
110
Basic.AdvAudio.SyncOffset="Sync Offset (ms)"
111
-Basic.AdvAudio.MediaChannel="Media Channel"
112
+Basic.AdvAudio.AudioTracks="Tracks"
113
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/es-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/es-ES.ini
Changed
127
1
2
OK="Aceptar"
3
Apply="Aplicar"
4
Cancel="Cancelar"
5
+Save="Grabar"
6
+Discard="Descartar"
7
Yes="Sí"
8
No="No"
9
Add="Agregar"
10
11
MoveUp="Mover arriba"
12
MoveDown="Mover abajo"
13
Settings="Configuración"
14
+Name="Nombre"
15
Exit="Salir"
16
Mixer="Mezclador"
17
Browse="Examinar"
18
19
NoNameEntered.Title="Por favor, introduzca un nombre válido"
20
NoNameEntered.Text="No puede utilizar nombres de vacíos."
21
22
+ConfirmExit.Title="¿Cerrar OBS?"
23
+ConfirmExit.Text="OBS está activo en este momento. ¿Está seguro que desea salir?"
24
+
25
ConfirmRemove.Title="Confirmar borrado"
26
ConfirmRemove.Text="¿Seguro que desea eliminar '$1'?"
27
28
29
Basic.PropertiesWindow.AutoSelectFormat="%1 (no soportado; seleccionar: %2)"
30
Basic.PropertiesWindow.SelectColor="Seleccionar color"
31
Basic.PropertiesWindow.SelectFont="Elija fuente"
32
+Basic.PropertiesWindow.ConfirmTitle="Configuración cambiada"
33
+Basic.PropertiesWindow.Confirm="Hay cambios sin guardar. ¿Deseas conservarlos?"
34
35
Basic.InteractionWindow="Interactuando con '%1'"
36
37
38
Basic.MainMenu.Edit.Order.MoveDown="Mover &abajo"
39
Basic.MainMenu.Edit.Order.MoveToTop="Mover a la &cima"
40
Basic.MainMenu.Edit.Order.MoveToBottom="Mover al &fondo"
41
+Basic.MainMenu.Edit.AdvAudio="Propiedades de &Audio avanzadas"
42
43
Basic.MainMenu.Help="&Ayuda"
44
Basic.MainMenu.Help.Logs="&Archivos de registro"
45
46
Basic.Settings.Stream.StreamType="Tipo de flujo"
47
48
Basic.Settings.Output="Salida"
49
+Basic.Settings.Output.Encoder="Codificador"
50
+Basic.Settings.Output.SelectDirectory="Seleccione Directorio de grabación"
51
+Basic.Settings.Output.SelectFile="Seleccione archivo de grabación"
52
Basic.Settings.Output.Mode="Modo de salida"
53
-Basic.Settings.Output.Mode.Simple="Simple (Flujo y/o grabación)"
54
-Basic.Settings.Output.Mode.Advanced="Avanzado (Salida personalizada)"
55
+Basic.Settings.Output.Mode.Simple="Sencillo"
56
+Basic.Settings.Output.Mode.Adv="Avanzado"
57
+Basic.Settings.Output.Mode.FFmpeg="Salida de FFmpeg"
58
Basic.Settings.Output.Simple.SavePath="Ruta de grabación FLV"
59
Basic.Settings.Output.VideoBitrate="Bitrate de vídeo"
60
Basic.Settings.Output.AudioBitrate="Bitrate de audio"
61
62
Basic.Settings.Output.RetryDelay="Demora al reintentar (segundos)"
63
Basic.Settings.Output.MaxRetries="Reintentos máximos"
64
Basic.Settings.Output.Advanced="Habilitar la configuración de codificador avanzada"
65
-Basic.Settings.Output.X264Preset="Perfil x264"
66
-Basic.Settings.Output.CustomX264Settings="Configuración personalizada x264"
67
+Basic.Settings.Output.EncoderPreset="Perfil de Codificador (más rapido = menos CPU)"
68
+Basic.Settings.Output.CustomEncoderSettings="Configuración del codificador personalizada"
69
Basic.Settings.Output.UseCBR="Usar Bitrate constante"
70
+Basic.Settings.Output.UseBufferSize="Usar tamaño de caché personalizado"
71
+
72
+Basic.Settings.Output.Adv.Rescale="Cambiar la escala de salida"
73
+Basic.Settings.Output.Adv.AudioTrack="Pista de audio"
74
+Basic.Settings.Output.Adv.Streaming="En tiempo real"
75
+Basic.Settings.Output.Adv.ApplyServiceSettings="Aplicar ajustes de codificador de servicio streaming"
76
+Basic.Settings.Output.Adv.Audio.Track1="Pista 1"
77
+Basic.Settings.Output.Adv.Audio.Track2="Pista 2"
78
+Basic.Settings.Output.Adv.Audio.Track3="Pista 3"
79
+Basic.Settings.Output.Adv.Audio.Track4="Pista 4"
80
+
81
+Basic.Settings.Output.Adv.Recording="Grabando"
82
+Basic.Settings.Output.Adv.Recording.Type="Tipo"
83
+Basic.Settings.Output.Adv.Recording.Type.Standard="Estándar"
84
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Salida personalizada (FFmpeg)"
85
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Usar flujo del codificador)"
86
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Formatos comunes de grabación"
87
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Todos los Archivos"
88
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Ruta de archivo o URL"
89
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Codificador de vídeo (en blanco = default)"
90
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Configuración de codificador de vídeo (si existe)"
91
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Codificador de audio (en blanco = por defecto)"
92
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Configuración de codificador de vídeo (si existe)"
93
94
Basic.Settings.Video="Vídeo"
95
Basic.Settings.Video.Adapter="Adaptador de vídeo:"
96
97
Basic.Settings.Video.InvalidResolution="Valor de la resolución no válido. Debe ser [ancho] x [altura] (por ejemplo, 1920 x 1080)"
98
Basic.Settings.Video.CurrentlyActive="La salida de vídeo está actualmente activa. Por favor apague cualquier salida para cambiar la configuración de vídeo."
99
100
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilineal (más rápido, pero borroso si se escala la imagen)"
101
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bicúbico (Escalado fino, 16 muestras)"
102
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Scalado fino, 32 muestras)"
103
+
104
Basic.Settings.Audio="Audio"
105
Basic.Settings.Audio.SampleRate="Frecuencia de muestreo"
106
Basic.Settings.Audio.Channels="Canales"
107
108
Basic.Settings.Audio.AuxDevice2="Dispositivo de audio Mic/auxiliar 2"
109
Basic.Settings.Audio.AuxDevice3="Dispositivo de audio Mic/auxiliar 3"
110
111
+Basic.Settings.Advanced="Avanzado"
112
+Basic.Settings.Advanced.Audio.BufferingTime="Tiempo de búfer de audio"
113
+Basic.Settings.Advanced.Video.ColorFormat="Formato de color"
114
+Basic.Settings.Advanced.Video.ColorSpace="Espacio de color YUV"
115
+Basic.Settings.Advanced.Video.ColorRange="Gama de Color YUV"
116
+Basic.Settings.Advanced.Video.ColorRange.Partial="Parcial"
117
+Basic.Settings.Advanced.Video.ColorRange.Full="Completo"
118
+
119
+Basic.AdvAudio="Propiedades de Audio avanzadas"
120
+Basic.AdvAudio.Name="Nombre"
121
+Basic.AdvAudio.Volume="Volumen (%)"
122
+Basic.AdvAudio.Mono="Remezclar a Mono"
123
+Basic.AdvAudio.Panning="Panorámica"
124
+Basic.AdvAudio.SyncOffset="Sincronización Offset (ms)"
125
+Basic.AdvAudio.AudioTracks="Pistas"
126
+
127
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/eu-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/eu-ES.ini
Changed
120
1
2
OK="Ongi"
3
Apply="Ezarri"
4
Cancel="Ezeztatu"
5
+Save="Gorde"
6
+Discard="Baztertu"
7
Yes="Bai"
8
No="Ez"
9
Add="Gehitu"
10
11
MoveUp="Mugitu Gora"
12
MoveDown="Mugitu Behera"
13
Settings="Ezarpenak..."
14
+Name="Izena"
15
Exit="Irten"
16
Mixer="Nahastzailea"
17
Browse="Bilatu..."
18
19
NoNameEntered.Title="Mesedez sartu baliozko izen bat"
20
NoNameEntered.Text="Ezin duzu izena hutsik erabili."
21
22
+ConfirmExit.Title="Irten OBS-tik?"
23
+ConfirmExit.Text="OBS lanean dago une honetan. Zihur zaude irtetzea nahi duzula?"
24
+
25
ConfirmRemove.Title="Baieztatu Kentzea"
26
ConfirmRemove.Text="Zihur zaude '$1' kentzea nahi duzula?"
27
28
29
Basic.PropertiesWindow.AutoSelectFormat="%1 (sostengatu gabea; berez-hautapena: %2)"
30
Basic.PropertiesWindow.SelectColor="Hautatu margoa"
31
Basic.PropertiesWindow.SelectFont="Hautatu hizkia"
32
+Basic.PropertiesWindow.ConfirmTitle="Ezarpenak Aldatuta"
33
+Basic.PropertiesWindow.Confirm="Gorde gabeko aldaketak daude. Heustea nahi diezu?"
34
35
Basic.InteractionWindow="Elkarrekintza '%1'-rekin"
36
37
38
Basic.MainMenu.Edit.Order.MoveDown="Mugitu &Behera"
39
Basic.MainMenu.Edit.Order.MoveToTop="Mugitu G&oren"
40
Basic.MainMenu.Edit.Order.MoveToBottom="Mugitu B&eheren"
41
+Basic.MainMenu.Edit.AdvAudio="A&udio Ezaugarri Aurreratuak"
42
43
Basic.MainMenu.Help="&Laguntza"
44
Basic.MainMenu.Help.Logs="&Ohar Agiriak"
45
46
Basic.Settings.Stream.StreamType="Jario Mota"
47
48
Basic.Settings.Output="Irteera"
49
+Basic.Settings.Output.Encoder="Kodeatzailea"
50
+Basic.Settings.Output.SelectDirectory="Hautatu Grabaketa Zuzenbidea"
51
+Basic.Settings.Output.SelectFile="Hautatu Grabaketa Agiria"
52
Basic.Settings.Output.Mode="Irteera Modua"
53
-Basic.Settings.Output.Mode.Simple="Arrunta (Jarioa eta/edo grabaketa)"
54
-Basic.Settings.Output.Mode.Advanced="Aurreratua (Norbere irteera mota)"
55
+Basic.Settings.Output.Mode.Simple="Arrunta"
56
+Basic.Settings.Output.Mode.Adv="Aurreratua"
57
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg Irteera"
58
Basic.Settings.Output.Simple.SavePath="FLV Grabaketa Helburua"
59
Basic.Settings.Output.VideoBitrate="Bideo Bitneurria"
60
Basic.Settings.Output.AudioBitrate="Audio Bitneurria"
61
62
Basic.Settings.Output.RetryDelay="Saiakera Atzerapena (segundu)"
63
Basic.Settings.Output.MaxRetries="Gehienezko Saiakerak"
64
Basic.Settings.Output.Advanced="Gaitu Kodeatzaile Aurreratu Ezarpenak"
65
-Basic.Settings.Output.X264Preset="x264 Aurrezarpena"
66
-Basic.Settings.Output.CustomX264Settings="Norbere x264 Ezarpenak"
67
+Basic.Settings.Output.EncoderPreset="Kodeatzaile Aurrezarpena (handiagoa = CPU gutxiago)"
68
+Basic.Settings.Output.CustomEncoderSettings="Norbere Kodeatzaile Ezarpenak"
69
Basic.Settings.Output.UseCBR="Erabili Bitneurri Aldagaitza"
70
+Basic.Settings.Output.UseBufferSize="Erabili Norbere Buffer Neurria"
71
+
72
+Basic.Settings.Output.Adv.Rescale="Birneurriratu Irteera"
73
+Basic.Settings.Output.Adv.AudioTrack="Audio Bidea"
74
+Basic.Settings.Output.Adv.Streaming="Jarioa"
75
+Basic.Settings.Output.Adv.ApplyServiceSettings="Behartu jario zerbitzu kodeatzaile ezarpenak"
76
+Basic.Settings.Output.Adv.Audio.Track1="1 Bidea"
77
+Basic.Settings.Output.Adv.Audio.Track2="2 Bidea"
78
+Basic.Settings.Output.Adv.Audio.Track3="3 Bidea"
79
+Basic.Settings.Output.Adv.Audio.Track4="4 Bidea"
80
+
81
+Basic.Settings.Output.Adv.Recording="Grabatzen"
82
+Basic.Settings.Output.Adv.Recording.Type="Mota"
83
+Basic.Settings.Output.Adv.Recording.Type.Standard="Estandarra"
84
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Norbere Irteera (FFmpeg)"
85
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Erabili jario kodeatzailea)"
86
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Grabaketa heuskarri arruntak"
87
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Agiri Guztiak"
88
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Agiri helburua edo URL-a"
89
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Bideo Kodeatzailea (hutsik=berezkoa)"
90
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Bideo Kodeatzaile Ezarpenak (egonez gero)"
91
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Audio Kodeatzailea (hutsik=berezkoa)"
92
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Audio Kodeatzaile Ezarpenak (egonez gero)"
93
94
Basic.Settings.Video="Bideoa"
95
Basic.Settings.Video.Adapter="Bideo Egokitzailea:"
96
97
Basic.Settings.Video.InvalidResolution="Bereizmen balio baliogabea. Izan behar da [width]x[height] (adib. 1920x1080)"
98
Basic.Settings.Video.CurrentlyActive="Bideo irtera gaituta dago une honetan. Mesedez eten irteera guztiak bideo ezarpenak aldatzeko."
99
100
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinearra (Azkarrena, baina lausoa eskalatuz gero)"
101
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bikubikoa (Eskalatze itzaldua, 16 lagin)"
102
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Eskalatze itzaldua, 32 lagin)"
103
+
104
Basic.Settings.Audio="Audioa"
105
Basic.Settings.Audio.SampleRate="Laginketa Neurria"
106
Basic.Settings.Audio.Channels="Bideak"
107
108
Basic.Settings.Audio.AuxDevice2="Mik/Osagarri Audio Gailua 2"
109
Basic.Settings.Audio.AuxDevice3="Mik/Osagarri Audio Gailua 3"
110
111
+
112
+Basic.AdvAudio="Audio Ezaugarri Aurreratuak"
113
+Basic.AdvAudio.Name="Izena"
114
+Basic.AdvAudio.Volume="Bolumena (%)"
115
+Basic.AdvAudio.Mono="Behera-nahastu Monora"
116
+Basic.AdvAudio.Panning="Panoramika"
117
+Basic.AdvAudio.SyncOffset="Aldiberetze Oreka (sm)"
118
+Basic.AdvAudio.AudioTracks="Bideak"
119
+
120
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/fi-FI.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/fi-FI.ini
Changed
120
1
2
OK="OK"
3
Apply="Käytä"
4
Cancel="Peruuta"
5
+Save="Tallenna"
6
+Discard="Hylkää"
7
Yes="Kyllä"
8
No="Ei"
9
Add="Lisää"
10
11
MoveUp="Siirrä ylös"
12
MoveDown="Siirrä alas"
13
Settings="Asetukset"
14
+Name="Nimi"
15
Exit="Poistu"
16
Mixer="Mikseri"
17
Browse="Selaa"
18
19
NoNameEntered.Title="Syötä sopiva nimi"
20
NoNameEntered.Text="Et voi käyttää tyhjiä nimiä."
21
22
+ConfirmExit.Title="Sulje OBS?"
23
+ConfirmExit.Text="OBS on käytössä. Haluatko varmasti sulkea sen?"
24
+
25
ConfirmRemove.Title="Vahvista poisto"
26
ConfirmRemove.Text="Haluatko varmasti poistaa '$1'?"
27
28
29
Basic.PropertiesWindow.AutoSelectFormat="%1 (ei tueta; automaattinen: %2)"
30
Basic.PropertiesWindow.SelectColor="Valitse väri"
31
Basic.PropertiesWindow.SelectFont="Valitse kirjasin"
32
+Basic.PropertiesWindow.ConfirmTitle="Asetukset ovat muuttuneet"
33
+Basic.PropertiesWindow.Confirm="Muutoksia ei ole vielä tallennettu. Haluatko pitää muutokset?"
34
35
Basic.InteractionWindow="Vuorovaikutetaan '%1' kanssa"
36
37
38
Basic.MainMenu.Edit.Order.MoveDown="Siirrä &alas"
39
Basic.MainMenu.Edit.Order.MoveToTop="Siirrä &ylimmäksi"
40
Basic.MainMenu.Edit.Order.MoveToBottom="Siirrä &alimmaksi"
41
+Basic.MainMenu.Edit.AdvAudio="&Äänen lisäominaisuudet"
42
43
Basic.MainMenu.Help="&Apua"
44
Basic.MainMenu.Help.Logs="&Lokitiedostot"
45
46
Basic.Settings.Stream.StreamType="Lähetystyyppi"
47
48
Basic.Settings.Output="Ulostulo"
49
+Basic.Settings.Output.Encoder="Enkooderi"
50
+Basic.Settings.Output.SelectDirectory="Valitse tallennuskansio"
51
+Basic.Settings.Output.SelectFile="Valitse tallennustiedosto"
52
Basic.Settings.Output.Mode="Ulostulon tila"
53
-Basic.Settings.Output.Mode.Simple="Yksinkertainen (Lähetys ja/tai tallennus)"
54
-Basic.Settings.Output.Mode.Advanced="Monipuolinen (Custom output type)"
55
+Basic.Settings.Output.Mode.Simple="Yksinkertainen"
56
+Basic.Settings.Output.Mode.Adv="Kehittynyt"
57
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg ulostulo"
58
Basic.Settings.Output.Simple.SavePath="FLV-tallennuksen polku"
59
Basic.Settings.Output.VideoBitrate="Kuvan bitrate"
60
Basic.Settings.Output.AudioBitrate="Äänen bitrate"
61
62
Basic.Settings.Output.RetryDelay="Uudelleenyrityksen viive (sekunteja)"
63
Basic.Settings.Output.MaxRetries="Uudelleenyhdistyksien määrä"
64
Basic.Settings.Output.Advanced="Käytä enkooderin lisäasetuksia"
65
-Basic.Settings.Output.X264Preset="x264-esiasetus"
66
-Basic.Settings.Output.CustomX264Settings="Mukautetut x264-asetukset"
67
+Basic.Settings.Output.EncoderPreset="Enkooderin asetus (korkeampi lisää tehon kulutusta)"
68
+Basic.Settings.Output.CustomEncoderSettings="Valinnaiset enkooderiasetukset"
69
Basic.Settings.Output.UseCBR="Pidä bitrate vakiona"
70
+Basic.Settings.Output.UseBufferSize="Käytä valinnaista puskurin kokoa"
71
+
72
+Basic.Settings.Output.Adv.Rescale="Uudelleenskaalaa ulostulo"
73
+Basic.Settings.Output.Adv.AudioTrack="Ääniraita"
74
+Basic.Settings.Output.Adv.Streaming="Lähetys"
75
+Basic.Settings.Output.Adv.ApplyServiceSettings="Pakota asetukset palvelun suosituksiin"
76
+Basic.Settings.Output.Adv.Audio.Track1="Raita 1"
77
+Basic.Settings.Output.Adv.Audio.Track2="Raita 2"
78
+Basic.Settings.Output.Adv.Audio.Track3="Raita 3"
79
+Basic.Settings.Output.Adv.Audio.Track4="Raita 4"
80
+
81
+Basic.Settings.Output.Adv.Recording="Tallennus"
82
+Basic.Settings.Output.Adv.Recording.Type="Tyyppi"
83
+Basic.Settings.Output.Adv.Recording.Type.Standard="Tavallinen"
84
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Valinnainen lähtö (FFmpeg)"
85
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Käytä lähetysenkooderia)"
86
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Yleiset tallennusmuodot"
87
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Kaikki tiedostot"
88
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Tiedostopolku tai URL-osoite"
89
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Video-enkooderi (tyhjä = oletus)"
90
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Video-enkooderin asetukset"
91
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Ääni-enkooderi (tyhjä = oletus)"
92
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Ääni-enkooderin asetukset"
93
94
Basic.Settings.Video="Kuva"
95
Basic.Settings.Video.Adapter="Näytönohjain:"
96
97
Basic.Settings.Video.InvalidResolution="Vialliset resoluution asetus. Muodon pitää olla [leveys]x[korkeus] (esim. 1920x1080)"
98
Basic.Settings.Video.CurrentlyActive="Kuvan ulostulo on tällä hetkellä käytössä. Kytke pois kaikki ulostulot vaihtaaksesi kuva-asetuksia."
99
100
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (nopein, sumeutuu skaalattaessa)"
101
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (Terävöity skaalaus, 16 näytettä)"
102
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Terävöity skaalaus, 32 näytettä)"
103
+
104
Basic.Settings.Audio="Ääni"
105
Basic.Settings.Audio.SampleRate="Näytteenottotaajuus"
106
Basic.Settings.Audio.Channels="Kanavat"
107
108
Basic.Settings.Audio.AuxDevice2="Mic/Aux -äänilaite 2"
109
Basic.Settings.Audio.AuxDevice3="Mic/Aux -äänilaite 3"
110
111
+
112
+Basic.AdvAudio="Äänen lisäominaisuudet"
113
+Basic.AdvAudio.Name="Nimi"
114
+Basic.AdvAudio.Volume="Äänenvoimakkuus (%)"
115
+Basic.AdvAudio.Mono="Miksaa yksikanavaiseksi"
116
+Basic.AdvAudio.Panning="Vieritys"
117
+Basic.AdvAudio.SyncOffset="Sync Offset (ms)"
118
+Basic.AdvAudio.AudioTracks="Raidat"
119
+
120
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/fr-FR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/fr-FR.ini
Changed
278
1
2
3
-Language="français"
4
+Language="Français"
5
Region="France"
6
7
OK="Ok"
8
Apply="Appliquer"
9
Cancel="Annuler"
10
+Save="Enregistrer"
11
+Discard="Ignorer les modifications"
12
Yes="Oui"
13
No="Non"
14
Add="Ajouter"
15
16
MoveUp="Déplacer vers le haut"
17
MoveDown="Déplacer vers le bas"
18
Settings="Paramètres"
19
+Name="Nom"
20
Exit="Quitter OBS"
21
Mixer="Table de mixage"
22
Browse="Parcourir"
23
Mono="Mono"
24
Stereo="Stéréo"
25
-DroppedFrames="Images Perdus %1 (%2%)"
26
+DroppedFrames="Images Perdues %1 (%2%)"
27
28
NameExists.Title="Ce nom existe déjà"
29
NameExists.Text="Ce nom est déjà utilisé."
30
31
NoNameEntered.Title="Veuillez saisir un nom valide"
32
NoNameEntered.Text="Vous ne pouvez pas utiliser de noms vides."
33
34
+ConfirmExit.Title="Quitter OBS ?"
35
+ConfirmExit.Text="OBS est toujours actif. Êtes-vous certain de vouloir quitter ?"
36
+
37
ConfirmRemove.Title="Confirmer la suppression"
38
ConfirmRemove.Text="Êtes-vous sûr de vouloir supprimer « $1 » ?"
39
40
-Output.ConnectFail.Title="Echec de la connexion"
41
+Output.ConnectFail.Title="Échec de la connexion"
42
Output.ConnectFail.BadPath="Adresse de Connexion ou Chemin Invalide. Veuillez vérifier vos paramètres afin de confirmer leur validité."
43
Output.ConnectFail.ConnectFailed="Échec de Connexion au Serveur"
44
Output.ConnectFail.InvalidStream="Impossible d'accéder à la chaîne ou à la clé spécifiée. Cela peut être causé par une chaîne/clé invalide ou par le serveur qui vous considère toujours connecté."
45
46
47
Remux.SourceFile="Enregistrement OBS"
48
Remux.TargetFile="Fichier cible"
49
-Remux.Remux="Réencapsuler"
50
+Remux.Remux="Convertir"
51
Remux.RecordingPattern="Enregistrement OBS (*.flv)"
52
-Remux.FinishedTitle="Réencapsulage terminé"
53
-Remux.Finished="L'enregistrement est réencapsulé"
54
-Remux.FinishedError="L'enregistrement est réencapsulé, mais le fichier peut être incomplet"
55
+Remux.FinishedTitle="Conversion terminée"
56
+Remux.Finished="L'enregistrement a été converti"
57
+Remux.FinishedError="L'enregistrement a été converti, mais le fichier peut être incomplet"
58
Remux.SelectRecording="Choisir un enregistrement OBS …"
59
Remux.SelectTarget="Choisir le fichier cible …"
60
Remux.FileExistsTitle="Fichier cible existant"
61
Remux.FileExists="Le fichier cible existe, voulez-vous le remplacer ?"
62
-Remux.ExitUnfinishedTitle="Réencapsulage en cours"
63
-Remux.ExitUnfinished="Le réencapsulage n'est pas terminé, arrêter maintenant peut rendre le fichier cible inutilisable.\nVoulez-vous vraiment arrêter le réencapsulage ?"
64
+Remux.ExitUnfinishedTitle="Conversion en cours"
65
+Remux.ExitUnfinished="La conversion n'est pas terminée, arrêter maintenant peut rendre le fichier cible inutilisable.\nVoulez-vous vraiment arrêter la conversion ?"
66
67
UpdateAvailable="Nouvelle Mise à Jour Disponible"
68
UpdateAvailable.Text="La version %1.%2.%3 est désormais disponible. <a href='%4'>Cliquez ici pour la télécharger</a>"
69
70
Basic.PropertiesWindow.AutoSelectFormat="%1 (non supporté ; sélection automatique: %2)"
71
Basic.PropertiesWindow.SelectColor="Sélectionnez une couleur"
72
Basic.PropertiesWindow.SelectFont="Sélectionnez la police"
73
+Basic.PropertiesWindow.ConfirmTitle="Paramètres modifiés"
74
+Basic.PropertiesWindow.Confirm="Des modifications n'ont pas été enregistrées. Voulez-vous les conserver ?"
75
76
Basic.InteractionWindow="Interagit avec '%1'"
77
78
79
Basic.TransformWindow.Alignment.BottomRight="En Bas à Droite"
80
81
Basic.TransformWindow.BoundsType.None="Sans Contours"
82
-Basic.TransformWindow.BoundsType.MaxOnly="Taille Maximale Uniquement"
83
-Basic.TransformWindow.BoundsType.ScaleInner="Mettre à l'échelle par les Dimensions Intérieurs"
84
-Basic.TransformWindow.BoundsType.ScaleOuter="Mettre à l'échelle par les Dimensions Extérieurs"
85
-Basic.TransformWindow.BoundsType.ScaleToWidth="Mettre à l'échelle par la Largeur"
86
-Basic.TransformWindow.BoundsType.ScaleToHeight="Mettre à l'échelle par la Hauteur"
87
-Basic.TransformWindow.BoundsType.Stretch="Étiré au Dimensions"
88
-
89
-Basic.Main.AddSourceHelp.Title="Impossible d'ajouter la Source"
90
+Basic.TransformWindow.BoundsType.MaxOnly="Taille maximale uniquement"
91
+Basic.TransformWindow.BoundsType.ScaleInner="Mettre à l'échelle par les dimensions intérieurs"
92
+Basic.TransformWindow.BoundsType.ScaleOuter="Mettre à l'échelle par les dimensions extérieurs"
93
+Basic.TransformWindow.BoundsType.ScaleToWidth="Mettre à l'échelle par la largeur"
94
+Basic.TransformWindow.BoundsType.ScaleToHeight="Mettre à l'échelle par la hauteur"
95
+Basic.TransformWindow.BoundsType.Stretch="Étirer aux dimensions"
96
+
97
+Basic.Main.AddSourceHelp.Title="Impossible d'ajouter la source"
98
Basic.Main.AddSourceHelp.Text="Vous devez avoir au moins 1 scène pour ajouter une source."
99
100
Basic.Main.Scenes="Scènes"
101
Basic.Main.Sources="Sources"
102
Basic.Main.Connecting="Connexion en cours..."
103
Basic.Main.StartRecording="Démarrer l'enregistrement"
104
-Basic.Main.StartStreaming="Commencer le Streaming"
105
+Basic.Main.StartStreaming="Commencer le streaming"
106
Basic.Main.StopRecording="Arrêter l'enregistrement"
107
-Basic.Main.StopStreaming="Arrêter le Streaming"
108
+Basic.Main.StopStreaming="Arrêter le streaming"
109
110
Basic.MainMenu.File="&Fichier"
111
Basic.MainMenu.File.Export="&Exporter"
112
Basic.MainMenu.File.Import="&Importer"
113
Basic.MainMenu.File.ShowRecordings="Affichage & enregistrements"
114
-Basic.MainMenu.File.Remux="Réencapsuler un enregistrement"
115
+Basic.MainMenu.File.Remux="&Convertir un enregistrement"
116
Basic.MainMenu.File.Settings="&Paramètres"
117
Basic.MainMenu.File.Exit="&Quitter"
118
119
-Basic.MainMenu.Edit="E&diter"
120
+Basic.MainMenu.Edit="&Editer"
121
Basic.MainMenu.Edit.Undo="&Annuler"
122
Basic.MainMenu.Edit.Redo="&Rétablir"
123
-Basic.MainMenu.Edit.UndoAction="A&nnuler $1"
124
-Basic.MainMenu.Edit.RedoAction="Réta&blir $1"
125
+Basic.MainMenu.Edit.UndoAction="&Annuler $1"
126
+Basic.MainMenu.Edit.RedoAction="&Rétablir $1"
127
Basic.MainMenu.Edit.Transform="&Transformer"
128
-Basic.MainMenu.Edit.Transform.EditTransform="Éditer la Transformation..."
129
-Basic.MainMenu.Edit.Transform.ResetTransform="Réinitialiser la Transformation"
130
-Basic.MainMenu.Edit.Transform.Rotate90CW="Rotation 90° Horaire"
131
-Basic.MainMenu.Edit.Transform.Rotate90CCW="Rotation 90° Anti-horaire"
132
+Basic.MainMenu.Edit.Transform.EditTransform="Éditer la transformation..."
133
+Basic.MainMenu.Edit.Transform.ResetTransform="Réinitialiser la transformation"
134
+Basic.MainMenu.Edit.Transform.Rotate90CW="Rotation de 90° sens horaire"
135
+Basic.MainMenu.Edit.Transform.Rotate90CCW="Rotation de 90° sens antihoraire"
136
Basic.MainMenu.Edit.Transform.Rotate180="Rotation de 180°"
137
-Basic.MainMenu.Edit.Transform.FlipHorizontal="Inverser &Horizontalement"
138
-Basic.MainMenu.Edit.Transform.FlipVertical="Inverser &Verticalement"
139
+Basic.MainMenu.Edit.Transform.FlipHorizontal="Inverser &horizontalement"
140
+Basic.MainMenu.Edit.Transform.FlipVertical="Inverser &verticalement"
141
Basic.MainMenu.Edit.Transform.FitToScreen="&Adapter à l'écran"
142
Basic.MainMenu.Edit.Transform.StretchToScreen="&Etirer à l'écran"
143
Basic.MainMenu.Edit.Transform.CenterToScreen="&Centrer à l'écran"
144
Basic.MainMenu.Edit.Order="&Ordonner"
145
Basic.MainMenu.Edit.Order.MoveUp="&Monter d'un cran"
146
Basic.MainMenu.Edit.Order.MoveDown="&Descendre d'un cran"
147
-Basic.MainMenu.Edit.Order.MoveToTop="Déplacer en tout en &Haut"
148
-Basic.MainMenu.Edit.Order.MoveToBottom="Déplacer tout en &Bas"
149
+Basic.MainMenu.Edit.Order.MoveToTop="Déplacer tout en &haut"
150
+Basic.MainMenu.Edit.Order.MoveToBottom="Déplacer tout en &bas"
151
+Basic.MainMenu.Edit.AdvAudio="Propriétés audio &avancées"
152
153
Basic.MainMenu.Help="&Aide"
154
Basic.MainMenu.Help.Logs="&Fichiers journaux"
155
-Basic.MainMenu.Help.Logs.ShowLogs="& Afficher les fichiers de Log"
156
-Basic.MainMenu.Help.Logs.UploadCurrentLog="Mettre en Ligne le Fichier Journal &Actuel"
157
-Basic.MainMenu.Help.Logs.UploadLastLog="Mettre en Ligne le &Dernier Fichier Journal"
158
-Basic.MainMenu.Help.CheckForUpdates="Rechercher des Mises à Jour"
159
+Basic.MainMenu.Help.Logs.ShowLogs="Afficher les &fichiers de log"
160
+Basic.MainMenu.Help.Logs.UploadCurrentLog="Mettre en ligne le fichier journal &actuel"
161
+Basic.MainMenu.Help.Logs.UploadLastLog="Mettre en ligne le &dernier fichier journal"
162
+Basic.MainMenu.Help.CheckForUpdates="Rechercher des mises à jour"
163
164
-Basic.Settings.ProgramRestart="Le programme doit être redémarré pour que ces paramètres prennent effet."
165
+Basic.Settings.ProgramRestart="Le programme doit être redémarré pour que les paramètres prennent effet."
166
Basic.Settings.ConfirmTitle="Valider les modifications"
167
-Basic.Settings.Confirm="Vous avez des modifications non enregistrées. Voulez-vous les enregistrer ?"
168
+Basic.Settings.Confirm="Vous avez des modifications non enregistrées. Voulez-vous les enregistrer ?"
169
170
Basic.Settings.General="Général"
171
-Basic.Settings.General.Language="Langue:"
172
+Basic.Settings.General.Language="Langue :"
173
174
Basic.Settings.Stream="Diffuser"
175
-Basic.Settings.Stream.StreamType="Type de Diffusion"
176
+Basic.Settings.Stream.StreamType="Type de diffusion"
177
178
Basic.Settings.Output="Sortie"
179
-Basic.Settings.Output.Mode="Mode de Sortie"
180
-Basic.Settings.Output.Mode.Simple="Simple (Diffusion et/ou Enregistrement)"
181
-Basic.Settings.Output.Mode.Advanced="Avancés (type de sortie personnalisée)"
182
-Basic.Settings.Output.Simple.SavePath="Chemin d'Enregistrement FLV"
183
-Basic.Settings.Output.VideoBitrate="Débit Vidéo"
184
+Basic.Settings.Output.Encoder="Encodeur"
185
+Basic.Settings.Output.SelectDirectory="Sélectionnez le répertoire d'enregistrement"
186
+Basic.Settings.Output.SelectFile="Sélectionnez le fichier cible"
187
+Basic.Settings.Output.Mode="Mode de sortie"
188
+Basic.Settings.Output.Mode.Simple="Simple"
189
+Basic.Settings.Output.Mode.Adv="Avancé"
190
+Basic.Settings.Output.Mode.FFmpeg="Sortie FFmpeg"
191
+Basic.Settings.Output.Simple.SavePath="Chemin de l'enregistrement FLV"
192
+Basic.Settings.Output.VideoBitrate="Débit vidéo"
193
Basic.Settings.Output.AudioBitrate="Débit audio"
194
Basic.Settings.Output.Reconnect="Reconnecter Automatiquement"
195
-Basic.Settings.Output.RetryDelay="Délais avant Tentative de Reconnexion (secondes)"
196
-Basic.Settings.Output.MaxRetries="Nombres de Tentatives Maximum"
197
+Basic.Settings.Output.RetryDelay="Délai avant la tentative de reconnexion (en secondes)"
198
+Basic.Settings.Output.MaxRetries="Nombres de tentatives maximales"
199
Basic.Settings.Output.Advanced="Activer les paramètres avancés d'encodage"
200
-Basic.Settings.Output.X264Preset="Préréglages x264"
201
-Basic.Settings.Output.CustomX264Settings="Paramètres personnalisés x 264"
202
+Basic.Settings.Output.EncoderPreset="Préréglage de l'encodeur (élevé = charge CPU plus faible)"
203
+Basic.Settings.Output.CustomEncoderSettings="Paramètres personnalisés de l'encodeur"
204
Basic.Settings.Output.UseCBR="Utiliser un débit constant"
205
+Basic.Settings.Output.UseBufferSize="Utiliser une taille de buffer personnalisée"
206
+
207
+Basic.Settings.Output.Adv.Rescale="Mise à l'échelle"
208
+Basic.Settings.Output.Adv.AudioTrack="Piste audio"
209
+Basic.Settings.Output.Adv.Streaming="Streaming"
210
+Basic.Settings.Output.Adv.ApplyServiceSettings="Imposer les paramètres d'encodage du service de streaming"
211
+Basic.Settings.Output.Adv.Audio.Track1="Piste 1"
212
+Basic.Settings.Output.Adv.Audio.Track2="Piste 2"
213
+Basic.Settings.Output.Adv.Audio.Track3="Piste 3"
214
+Basic.Settings.Output.Adv.Audio.Track4="Piste 4"
215
+
216
+Basic.Settings.Output.Adv.Recording="Enregistrement"
217
+Basic.Settings.Output.Adv.Recording.Type="Type "
218
+Basic.Settings.Output.Adv.Recording.Type.Standard="Standard"
219
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Sortie personnalisée (FFmpeg)"
220
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Utiliser l'encodeur de flux)"
221
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Formats d'enregistrement courants"
222
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Tous les fichiers"
223
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Chemin d'accès ou URL"
224
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Encodeur vidéo (vide = par défaut)"
225
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Paramètres de l'encodeur vidéo (le cas échéant)"
226
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Encodeur audio (blanc = par défaut)"
227
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Paramètres de l'encodeur audio (le cas échéant)"
228
229
Basic.Settings.Video="Vidéo"
230
-Basic.Settings.Video.Adapter="Périphérique vidéo:"
231
-Basic.Settings.Video.BaseResolution="Résolution de base:"
232
-Basic.Settings.Video.ScaledResolution="Échelle de Résolution:"
233
-Basic.Settings.Video.DownscaleFilter="Filtre de Réduction d’échelle:"
234
+Basic.Settings.Video.Adapter="Périphérique vidéo :"
235
+Basic.Settings.Video.BaseResolution="Résolution de base :"
236
+Basic.Settings.Video.ScaledResolution="Échelle de la résolution :"
237
+Basic.Settings.Video.DownscaleFilter="Filtrage de la mise à l'échelle :"
238
Basic.Settings.Video.DisableAeroWindows="Désactiver Aero (Windows uniquement)"
239
-Basic.Settings.Video.FPS="FPS:"
240
+Basic.Settings.Video.FPS="FPS :"
241
Basic.Settings.Video.FPSCommon="Valeur de FPS Communes"
242
Basic.Settings.Video.FPSInteger="Valeur de FPS Intégrales"
243
Basic.Settings.Video.FPSFraction="Valeurs de FPS Fractionelles"
244
Basic.Settings.Video.Numerator="Numérateur :"
245
Basic.Settings.Video.Denominator="Dénominateur :"
246
-Basic.Settings.Video.Renderer="Rendu:"
247
+Basic.Settings.Video.Renderer="Rendu :"
248
Basic.Settings.Video.InvalidResolution="Valeurs non valide de la résolution. Doivent être [largeur] x [hauteur] (c'est-à-dire 1920 x 1080)"
249
Basic.Settings.Video.CurrentlyActive="La Sortie Vidéo est actuellement Active. Veuillez éteindre toutes les sorties avant de modifier vos paramètres vidéo."
250
251
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinéaire (plus rapide, mais flou en cas de mise à l'échelle)"
252
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubique (redimensionnement affiné, 16 échantillons)"
253
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (redimensionnement affiné, 32 échantillons)"
254
+
255
Basic.Settings.Audio="Audio"
256
Basic.Settings.Audio.SampleRate="Fréquence d'echantillonnage"
257
Basic.Settings.Audio.Channels="Chaînes"
258
259
Basic.Settings.Audio.AuxDevice2="Périphérique Audio Micro/Auxiliaire 2"
260
Basic.Settings.Audio.AuxDevice3="Périphérique Audio Micro/Auxiliaire 3"
261
262
+Basic.Settings.Advanced="Avancé"
263
+Basic.Settings.Advanced.Audio.BufferingTime="Temps de mise en mémoire tampon audio"
264
+Basic.Settings.Advanced.Video.ColorFormat="Format de couleur"
265
+Basic.Settings.Advanced.Video.ColorSpace="Espace de couleur YUV"
266
+Basic.Settings.Advanced.Video.ColorRange="Gamme de couleurs YUV"
267
+Basic.Settings.Advanced.Video.ColorRange.Partial="Partielle"
268
+Basic.Settings.Advanced.Video.ColorRange.Full="Complète"
269
+
270
+Basic.AdvAudio="Propriétés audio avancées"
271
+Basic.AdvAudio.Name="Nom"
272
+Basic.AdvAudio.Volume="Volume (%)"
273
+Basic.AdvAudio.Mono="Passer en Mono"
274
+Basic.AdvAudio.Panning="Panoramique polyphonique"
275
+Basic.AdvAudio.SyncOffset="Décalage de synchronisation (ms)"
276
+Basic.AdvAudio.AudioTracks="Pistes"
277
+
278
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/gl-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/gl-ES.ini
Changed
123
1
2
OK="Aceptar"
3
Apply="Aplicar"
4
Cancel="Cancelar"
5
+Save="Gardar"
6
+Discard="Descartar"
7
Yes="Si"
8
No="Non"
9
Add="Engadir"
10
11
MoveUp="Subir"
12
MoveDown="Baixar"
13
Settings="Axustes"
14
+Name="Nome"
15
Exit="Saír"
16
Mixer="Mesturador"
17
Browse="Explorar"
18
19
NoNameEntered.Title="Por favor, insire un nome válido"
20
NoNameEntered.Text="Non podes empregar nomes baleiros."
21
22
+ConfirmExit.Title="Saír de OBS?"
23
+ConfirmExit.Text="OBS está activo neste momento. Tes a certeza de que desexas saír?"
24
+
25
ConfirmRemove.Title="Confirmar a eliminación"
26
ConfirmRemove.Text="Tes a certeza de querer eliminar '$1'?"
27
28
29
Basic.PropertiesWindow.AutoSelectFormat="%1 (non compatible; autoseleccionar: %2)"
30
Basic.PropertiesWindow.SelectColor="Seleccionar cor"
31
Basic.PropertiesWindow.SelectFont="Seleccionar fonte"
32
+Basic.PropertiesWindow.ConfirmTitle="Axustes cambiados"
33
+Basic.PropertiesWindow.Confirm="Hai cambios sen gardar. Queres conservalos?"
34
35
Basic.InteractionWindow="Interactuando con '%1'"
36
37
38
Basic.MainMenu.Edit.Order.MoveDown="Baixar"
39
Basic.MainMenu.Edit.Order.MoveToTop="Levar para a cima"
40
Basic.MainMenu.Edit.Order.MoveToBottom="Levar para abaixo"
41
+Basic.MainMenu.Edit.AdvAudio="Propiedades de audio &avanzadas"
42
43
Basic.MainMenu.Help="&Axuda"
44
Basic.MainMenu.Help.Logs="&Ficheiros de rexistro"
45
46
Basic.Settings.Stream.StreamType="Tipo de retransmisión"
47
48
Basic.Settings.Output="Saída"
49
+Basic.Settings.Output.Encoder="Codificador"
50
+Basic.Settings.Output.SelectDirectory="Seleccionar directorio de gravación"
51
+Basic.Settings.Output.SelectFile="Seleccionar ficheiro de gravación"
52
Basic.Settings.Output.Mode="Modo de saída"
53
-Basic.Settings.Output.Mode.Simple="Simple (retransmisión e/ou gravación)"
54
-Basic.Settings.Output.Mode.Advanced="Avanzado (saída personalizada)"
55
+Basic.Settings.Output.Mode.Simple="Sinxelo"
56
+Basic.Settings.Output.Mode.Adv="Avanzado"
57
+Basic.Settings.Output.Mode.FFmpeg="Saída de FFmpeg"
58
Basic.Settings.Output.Simple.SavePath="Camiño de gravación FLV"
59
Basic.Settings.Output.VideoBitrate="Velocidade de bits de vídeo"
60
Basic.Settings.Output.AudioBitrate="Velocidade de bits de audio"
61
62
Basic.Settings.Output.RetryDelay="Retardo da nova tentativa (segundos)"
63
Basic.Settings.Output.MaxRetries="Número máximo de tentativas"
64
Basic.Settings.Output.Advanced="Activar a configuración do codificador avanzada"
65
-Basic.Settings.Output.X264Preset="Predefinido x264"
66
-Basic.Settings.Output.CustomX264Settings="Configuración personalizada x264"
67
+Basic.Settings.Output.CustomEncoderSettings="Axustes do codificador personalizados"
68
Basic.Settings.Output.UseCBR="Utilizar unha velocidade de bits constante"
69
+Basic.Settings.Output.UseBufferSize="Utilizar tamaño do búfer personalizado"
70
+
71
+Basic.Settings.Output.Adv.Rescale="Cambiar a escala de saída"
72
+Basic.Settings.Output.Adv.AudioTrack="Pista de audio"
73
+Basic.Settings.Output.Adv.Streaming="En tempo real"
74
+Basic.Settings.Output.Adv.Audio.Track1="Pista 1"
75
+Basic.Settings.Output.Adv.Audio.Track2="Pista 2"
76
+Basic.Settings.Output.Adv.Audio.Track3="Pista 3"
77
+Basic.Settings.Output.Adv.Audio.Track4="Pista 4"
78
+
79
+Basic.Settings.Output.Adv.Recording="Gravando"
80
+Basic.Settings.Output.Adv.Recording.Type="Tipo"
81
+Basic.Settings.Output.Adv.Recording.Type.Standard="Estándar"
82
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Saída personalizada (FFmpeg)"
83
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Formatos comúns de gravación"
84
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Todos os ficheiros"
85
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Camiño do ficheiro ou URL"
86
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Codificador de vídeo (en branco = por defecto)"
87
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Axustes do codificador de vídeo (se existe)"
88
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Codificador de audio (en branco = por defecto)"
89
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Axustes do codificador de audio (se existe)"
90
91
Basic.Settings.Video="Vídeo"
92
Basic.Settings.Video.Adapter="Adaptador de vídeo:"
93
94
Basic.Settings.Video.InvalidResolution="Valor da resolución non válido. Debe ser [width] x [height] (por exemplo, 1920 x 1080)"
95
Basic.Settings.Video.CurrentlyActive="A saída de vídeo está actualmente activa. Por favor, apaga calquera saída para cambiar a configuración de vídeo."
96
97
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (máis rápido, pero borroso de se escalar a imaxe)"
98
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bicúbico (escalamento fino, 16 mostras)"
99
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (escalamento fino, 32 mostras)"
100
+
101
Basic.Settings.Audio="Audio"
102
Basic.Settings.Audio.SampleRate="Intervalo da mostra"
103
Basic.Settings.Audio.Channels="Canles"
104
105
Basic.Settings.Audio.AuxDevice2="Dispositivo de audio mic./auxiliar 2"
106
Basic.Settings.Audio.AuxDevice3="Dispositivo de audio mic./auxiliar 3"
107
108
+Basic.Settings.Advanced="Avanzado"
109
+Basic.Settings.Advanced.Audio.BufferingTime="Tempo do búfer de audio"
110
+Basic.Settings.Advanced.Video.ColorFormat="Formato da cor"
111
+Basic.Settings.Advanced.Video.ColorSpace="Espazo de cor YUV"
112
+Basic.Settings.Advanced.Video.ColorRange="Gama de cor YUV"
113
+Basic.Settings.Advanced.Video.ColorRange.Partial="Parcial"
114
+
115
+Basic.AdvAudio="Propiedades de audio avanzadas"
116
+Basic.AdvAudio.Name="Nome"
117
+Basic.AdvAudio.Volume="Volume (%)"
118
+Basic.AdvAudio.Mono="Remesturar a mono"
119
+Basic.AdvAudio.Panning="Panorámica"
120
+Basic.AdvAudio.SyncOffset="Sincronización Offset (ms)"
121
+Basic.AdvAudio.AudioTracks="Pistas"
122
+
123
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/hr-HR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/hr-HR.ini
Changed
110
1
2
MoveUp="Pomeri gore"
3
MoveDown="Pomeri dole"
4
Settings="Podešavanja"
5
+Name="Ime"
6
Exit="Izlaz"
7
Mixer="Mikseta"
8
Browse="Pretraži"
9
10
NoNameEntered.Title="Molim unesite ispravno ime"
11
NoNameEntered.Text="Ne možete izostaviti ime."
12
13
+ConfirmExit.Title="Napustiti OBS?"
14
+ConfirmExit.Text="OBS je trenutno aktivan. Da li ste sigurni da želite izaći?"
15
+
16
ConfirmRemove.Title="Potvrdi izbacivanje"
17
ConfirmRemove.Text="Da li ste sigurni da želite izbaciti '$1'?"
18
19
20
Basic.PropertiesWindow.AutoSelectFormat="%1 (nije podržano; automatski odabrano: %2)"
21
Basic.PropertiesWindow.SelectColor="Izaberi boju"
22
Basic.PropertiesWindow.SelectFont="Izaberi font"
23
+Basic.PropertiesWindow.ConfirmTitle="Podešavanja promenjena"
24
+Basic.PropertiesWindow.Confirm="Postoje podešavanja koja nisu sačuvana. Da li želite da ih sačuvate?"
25
26
Basic.InteractionWindow="Interakcija sa '%1'"
27
28
29
Basic.MainMenu.Edit.Order.MoveDown="Pomeri &dole"
30
Basic.MainMenu.Edit.Order.MoveToTop="Pomeri na vrh (&T)"
31
Basic.MainMenu.Edit.Order.MoveToBottom="Pomeri na dno (&B)"
32
+Basic.MainMenu.Edit.AdvAudio="N&apredna podešavanja zvuka"
33
34
Basic.MainMenu.Help="Pomoć (&H)"
35
Basic.MainMenu.Help.Logs="&Log datoteke"
36
37
Basic.Settings.Stream.StreamType="Vrsta strima"
38
39
Basic.Settings.Output="Izlaz"
40
+Basic.Settings.Output.Encoder="Enkoder"
41
+Basic.Settings.Output.SelectDirectory="Odaberi direktorijum za snimanje"
42
+Basic.Settings.Output.SelectFile="Odaberi datoteku za snimanje"
43
Basic.Settings.Output.Mode="Režim izlaza"
44
-Basic.Settings.Output.Mode.Simple="Jednostavno (stream i/ili snimanje)"
45
-Basic.Settings.Output.Mode.Advanced="Napredno (specifičan tip izlaza)"
46
+Basic.Settings.Output.Mode.Simple="Jednostavno"
47
+Basic.Settings.Output.Mode.Adv="Napredno"
48
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg izlaz"
49
Basic.Settings.Output.Simple.SavePath="Putanja snimka za FLV"
50
Basic.Settings.Output.VideoBitrate="Protok videa"
51
Basic.Settings.Output.AudioBitrate="Protok zvuka"
52
53
Basic.Settings.Output.RetryDelay="Pauza pre ponovnog pokušaja (sekunde)"
54
Basic.Settings.Output.MaxRetries="Maksimalan broj ponovnih pokušaja"
55
Basic.Settings.Output.Advanced="Omogući napredna podešavanja kompresora"
56
-Basic.Settings.Output.X264Preset="x264 šablon"
57
-Basic.Settings.Output.CustomX264Settings="Specifična x264 podešavanja"
58
+Basic.Settings.Output.EncoderPreset="Šablon enkodera (veće = manje CPU)"
59
+Basic.Settings.Output.CustomEncoderSettings="Prilagođena enkoder podešavanja"
60
Basic.Settings.Output.UseCBR="Koristi konstantan protok"
61
+Basic.Settings.Output.UseBufferSize="Koristi specifičnu veličinu bafera"
62
+
63
+Basic.Settings.Output.Adv.Rescale="Skaliraj izlaz"
64
+Basic.Settings.Output.Adv.AudioTrack="Zvučni izvor"
65
+Basic.Settings.Output.Adv.Streaming="Strimovanje"
66
+Basic.Settings.Output.Adv.Audio.Track1="Izvor 1"
67
+Basic.Settings.Output.Adv.Audio.Track2="Izvor 2"
68
+Basic.Settings.Output.Adv.Audio.Track3="Izvor 3"
69
+Basic.Settings.Output.Adv.Audio.Track4="Izvor 4"
70
+
71
+Basic.Settings.Output.Adv.Recording="Snimanje"
72
+Basic.Settings.Output.Adv.Recording.Type="Vrsta"
73
+Basic.Settings.Output.Adv.Recording.Type.Standard="Uobičajeni"
74
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Prilagođeni izlaz (FFmpeg)"
75
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Koristi strim enkoder)"
76
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Uobičajeni formati snimaka"
77
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Sve datoteke"
78
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Putanja datoteke ili URL"
79
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Video enkoder (prazno=podrazumevani)"
80
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Podešavanja video enkodera (ako postoje)"
81
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Zvučni enkoder (prazno=podrazumevani)"
82
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Podešavanja zvučnog enkodera (ako postoje)"
83
84
Basic.Settings.Video="Video"
85
Basic.Settings.Video.Adapter="Video adapter:"
86
87
Basic.Settings.Video.InvalidResolution="Neispravna vrednost rezolucije. Mora biti [width]x[height] (npr. 1920x1080)"
88
Basic.Settings.Video.CurrentlyActive="Video izlaz je trenutno aktivan. Molim isključite sve izlaze da promenite video podešavanja."
89
90
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (najbrže, ali mutno pri skaliranju)"
91
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (oštrije skaliranje, 16 uzoraka)"
92
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (oštrije skaliranje, 32 uzorka)"
93
+
94
Basic.Settings.Audio="Zvuk"
95
Basic.Settings.Audio.SampleRate="Protok"
96
Basic.Settings.Audio.Channels="Kanali"
97
98
Basic.Settings.Audio.AuxDevice2="Mikrofon/Ulaz 2"
99
Basic.Settings.Audio.AuxDevice3="Mikrofon/Ulaz 3"
100
101
+
102
+Basic.AdvAudio="Napredna podešavanja zvuka"
103
+Basic.AdvAudio.Name="Ime"
104
+Basic.AdvAudio.Volume="Glasnoća (%)"
105
+Basic.AdvAudio.Mono="Spoji u mono"
106
+Basic.AdvAudio.Panning="Pomeranje"
107
+Basic.AdvAudio.SyncOffset="Razlika u sinhronizaciji (ms)"
108
+Basic.AdvAudio.AudioTracks="Izvori"
109
+
110
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/hu-HU.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/hu-HU.ini
Changed
110
1
2
MoveUp="Mozgatás Fel"
3
MoveDown="Mozgatás Le"
4
Settings="Beállítások"
5
+Name="Név"
6
Exit="Kilépés"
7
Mixer="Keverő"
8
Browse="Tallózás"
9
10
NoNameEntered.Title="Kérem adjon meg egy érvényes nevet"
11
NoNameEntered.Text="Üres nevek nem használhatóak."
12
13
+ConfirmExit.Title="Kilép a programból?"
14
+ConfirmExit.Text="Az OBS jelenleg aktív. Biztosan ki szeretne lépni?"
15
+
16
ConfirmRemove.Title="Eltávolítás Megerősítése"
17
ConfirmRemove.Text="\"$1\" eltávolítására készül, biztos benne?"
18
19
20
Basic.PropertiesWindow.AutoSelectFormat="%1 (nem támogatott; autokiválasztás: %2)"
21
Basic.PropertiesWindow.SelectColor="Szín Kiválasztása"
22
Basic.PropertiesWindow.SelectFont="Betűtípus kiválasztása"
23
+Basic.PropertiesWindow.ConfirmTitle="Beállítások Módosultak"
24
+Basic.PropertiesWindow.Confirm="Változtatásai nincsenek elmentve. Szeretné megtartani őket?"
25
26
Basic.InteractionWindow="Egymásra hatnak \"%1\"-el"
27
28
29
Basic.MainMenu.Edit.Order.MoveDown="Mozgatás &Le"
30
Basic.MainMenu.Edit.Order.MoveToTop="Mozgatás a &Tetejére"
31
Basic.MainMenu.Edit.Order.MoveToBottom="Mozgatás az &Aljára"
32
+Basic.MainMenu.Edit.AdvAudio="&Speciális Audio Tulajdonságok"
33
34
Basic.MainMenu.Help="&Segítség"
35
Basic.MainMenu.Help.Logs="&Naplófájlok"
36
37
Basic.Settings.Stream.StreamType="Stream típusa"
38
39
Basic.Settings.Output="Kimenet"
40
+Basic.Settings.Output.Encoder="Kódoló"
41
+Basic.Settings.Output.SelectDirectory="Felvételi Könyvtár Kiválasztása"
42
+Basic.Settings.Output.SelectFile="Felvétel Fájljának Kiválasztása"
43
Basic.Settings.Output.Mode="Kimeneti Mód"
44
-Basic.Settings.Output.Mode.Simple="Egyszerű (Stream és/vagy felvétel)"
45
-Basic.Settings.Output.Mode.Advanced="Speciális (Egyéni kimeneti típus)"
46
+Basic.Settings.Output.Mode.Simple="Egyszerű"
47
+Basic.Settings.Output.Mode.Adv="Haladó"
48
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg Kimenet"
49
Basic.Settings.Output.Simple.SavePath="FLV felvétel elérési útja"
50
Basic.Settings.Output.VideoBitrate="Videó Bitráta"
51
Basic.Settings.Output.AudioBitrate="Audio Bitráta"
52
53
Basic.Settings.Output.RetryDelay="Újrapróbálkozás Késleltetése (másodperc)"
54
Basic.Settings.Output.MaxRetries="Újrapróbálkozások Maximális Száma"
55
Basic.Settings.Output.Advanced="Speciális Kódoló beállítások engedélyezése"
56
-Basic.Settings.Output.X264Preset="x264 készlet"
57
-Basic.Settings.Output.CustomX264Settings="Egyedi x264 Beállítások"
58
+Basic.Settings.Output.EncoderPreset="Kódoló Készlet (magasabb = kevesebb CPU igény)"
59
+Basic.Settings.Output.CustomEncoderSettings="Egyéni Kódolási Beállítások"
60
Basic.Settings.Output.UseCBR="Konstans bitráta használata"
61
+Basic.Settings.Output.UseBufferSize="Egyéni pufferméret használata"
62
+
63
+Basic.Settings.Output.Adv.Rescale="Kimenet Átméretezése"
64
+Basic.Settings.Output.Adv.AudioTrack="Hangsáv"
65
+Basic.Settings.Output.Adv.Streaming="Streamelés"
66
+Basic.Settings.Output.Adv.Audio.Track1="Sáv 1"
67
+Basic.Settings.Output.Adv.Audio.Track2="Sáv 2"
68
+Basic.Settings.Output.Adv.Audio.Track3="Sáv 3"
69
+Basic.Settings.Output.Adv.Audio.Track4="Sáv 4"
70
+
71
+Basic.Settings.Output.Adv.Recording="Rögzítés"
72
+Basic.Settings.Output.Adv.Recording.Type="Típus"
73
+Basic.Settings.Output.Adv.Recording.Type.Standard="Szabvány"
74
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Egyéni Kimenet (FFmpeg)"
75
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Stream kódoló használata)"
76
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Általános felvételi formátumok"
77
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Minden fájl"
78
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Fájl elérési útja vagy URL"
79
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Videó Kódoló (üres = alapértelmezett)"
80
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Videó Kódoló Beállítások (ha van)"
81
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Audio Kódoló (üres = alapértelmezett)"
82
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Audio Kódoló Beállítások (ha van)"
83
84
Basic.Settings.Video="Videó"
85
Basic.Settings.Video.Adapter="Videó Adapter:"
86
87
Basic.Settings.Video.InvalidResolution="Érvénytelen felbontás érték. [szélesség] x [magasság]-nak kell lennie (pl.: 1920 x 1080)"
88
Basic.Settings.Video.CurrentlyActive="Video kimenet jelenleg aktív. Kérem, kapcsoljon ki minden kimeneti forrást a video beállítások módosításához."
89
90
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilineáris (leggyorsabb, homályos lehet méretezésnél)"
91
+Basic.Settings.Video.DownscaleFilter.Bicubic="Kettős köbös (élesített méretezés, 16 minta)"
92
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (élesített méretezés, 32 minta)"
93
+
94
Basic.Settings.Audio="Hang"
95
Basic.Settings.Audio.SampleRate="Mintavételezés"
96
Basic.Settings.Audio.Channels="Csatornák"
97
98
Basic.Settings.Audio.AuxDevice2="Mikrofon/Aux Audio eszköz 2"
99
Basic.Settings.Audio.AuxDevice3="Mikrofon/Aux Audio eszköz 3"
100
101
+
102
+Basic.AdvAudio="Speciális Audio Tulajdonságok"
103
+Basic.AdvAudio.Name="Név"
104
+Basic.AdvAudio.Volume="Hangerő (%)"
105
+Basic.AdvAudio.Mono="Monora lekeverés"
106
+Basic.AdvAudio.Panning="Keverő"
107
+Basic.AdvAudio.SyncOffset="Szinkron eltolás (ms)"
108
+Basic.AdvAudio.AudioTracks="Sávok"
109
+
110
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/it-IT.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/it-IT.ini
Changed
45
1
2
NoNameEntered.Title="Inserisci un nome valido"
3
NoNameEntered.Text="Non è possibile utilizzare nomi vuoti."
4
5
+
6
ConfirmRemove.Title="Conferma la rimozione"
7
ConfirmRemove.Text="Sei sicuro di voler rimuovere '$1'?"
8
9
10
11
Basic.Settings.Output="Output"
12
Basic.Settings.Output.Mode="Modalità di output"
13
-Basic.Settings.Output.Mode.Simple="Semplice (trasmetti e/o registra)"
14
-Basic.Settings.Output.Mode.Advanced="Avanzata (tipo di output personalizzato)"
15
Basic.Settings.Output.Simple.SavePath="Percorso di salvataggio per file FLV"
16
Basic.Settings.Output.VideoBitrate="Bitrate video"
17
Basic.Settings.Output.AudioBitrate="Bitrate Audio"
18
19
Basic.Settings.Output.RetryDelay="Ritardo dei tentativi (secondi)"
20
Basic.Settings.Output.MaxRetries="Tentativi massimi"
21
Basic.Settings.Output.Advanced="Abilita le impostazioni avanzate di codifica"
22
-Basic.Settings.Output.X264Preset="x264 Preset"
23
-Basic.Settings.Output.CustomX264Settings="Impostazioni personalizzate x264"
24
Basic.Settings.Output.UseCBR="Usa Bitrate costante"
25
26
+
27
+
28
Basic.Settings.Video="Video"
29
Basic.Settings.Video.Adapter="Adattatore video:"
30
Basic.Settings.Video.BaseResolution="Risoluzione di base:"
31
32
Basic.Settings.Video.InvalidResolution="Valore di risoluzione invalido. Deve essere [larghezza]x[altezza] (es. 1920x1080)"
33
Basic.Settings.Video.CurrentlyActive="L'output video è attualmente attivo. Spegni qualunque output per cambiare le impostazioni."
34
35
+
36
Basic.Settings.Audio="Audio"
37
Basic.Settings.Audio.SampleRate="Ratio di campionamento"
38
Basic.Settings.Audio.Channels="Canali"
39
40
Basic.Settings.Audio.AuxDevice2="Dispositivo audio mic/ausiliario 2"
41
Basic.Settings.Audio.AuxDevice3="Dispositivo audio mic/ausiliario 3"
42
43
+
44
+
45
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/ja-JP.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/ja-JP.ini
Changed
115
1
2
MoveUp="上へ移動"
3
MoveDown="下へ移動"
4
Settings="設定"
5
+Name="名称"
6
Exit="終了"
7
Mixer="ミキサー"
8
-Browse="ブラウズ"
9
+Browse="参照"
10
Mono="モノラル"
11
Stereo="ステレオ"
12
DroppedFrames="ドロップしたフレーム %1 (%2%)"
13
14
NoNameEntered.Title="有効な名前を入力してください"
15
NoNameEntered.Text="空の名前を使用することはできません。"
16
17
+ConfirmExit.Title="OBSを終了しますか?"
18
+ConfirmExit.Text="OBS は現在アクティブです。終了してもよろしいですか?"
19
+
20
ConfirmRemove.Title="削除の確認"
21
ConfirmRemove.Text="'$1' を削除してもよろしいですか?"
22
23
24
Basic.PropertiesWindow.AutoSelectFormat="%1 (サポートされていない; 自動選択: %2)"
25
Basic.PropertiesWindow.SelectColor="色を選択"
26
Basic.PropertiesWindow.SelectFont="フォントを選択"
27
+Basic.PropertiesWindow.ConfirmTitle="設定の変更"
28
+Basic.PropertiesWindow.Confirm="保存されていない変更があります。それらを維持しますか?"
29
30
Basic.InteractionWindow="'%1' との相互作用"
31
32
33
Basic.MainMenu.Edit.Order.MoveDown="下に移動(&D)"
34
Basic.MainMenu.Edit.Order.MoveToTop="最上部に移動(&T)"
35
Basic.MainMenu.Edit.Order.MoveToBottom="最下部に移動(&B)"
36
+Basic.MainMenu.Edit.AdvAudio="オーディオの詳細プロパティ"
37
38
Basic.MainMenu.Help="ヘルプ(&H)"
39
Basic.MainMenu.Help.Logs="ログファイル(&L)"
40
41
Basic.Settings.Stream.StreamType="配信種別"
42
43
Basic.Settings.Output="出力"
44
+Basic.Settings.Output.Encoder="エンコーダー"
45
+Basic.Settings.Output.SelectDirectory="録画ディレクトリを選択"
46
+Basic.Settings.Output.SelectFile="録画ファイルを選択"
47
Basic.Settings.Output.Mode="出力モード"
48
-Basic.Settings.Output.Mode.Simple="基本 (配信 / 録画)"
49
-Basic.Settings.Output.Mode.Advanced="上級 (カスタム出力タイプ)"
50
+Basic.Settings.Output.Mode.Simple="基本"
51
+Basic.Settings.Output.Mode.Adv="詳細"
52
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg の出力"
53
Basic.Settings.Output.Simple.SavePath="FLV 録画ファイルパス"
54
Basic.Settings.Output.VideoBitrate="映像ビット レート"
55
Basic.Settings.Output.AudioBitrate="音声ビットレート"
56
57
Basic.Settings.Output.RetryDelay="再試行の遅延 (秒)"
58
Basic.Settings.Output.MaxRetries="最大再試行回数"
59
Basic.Settings.Output.Advanced="高度なエンコーダーの設定を有効にする"
60
-Basic.Settings.Output.X264Preset="x264 プリセット"
61
-Basic.Settings.Output.CustomX264Settings="x264 のカスタム設定"
62
+Basic.Settings.Output.EncoderPreset="エンコーダープリセット (高い = CPU使用低い)"
63
+Basic.Settings.Output.CustomEncoderSettings="エンコーダーのカスタム設定"
64
Basic.Settings.Output.UseCBR="固定ビットレートを使用する"
65
+Basic.Settings.Output.UseBufferSize="特定バッファサイズを使用"
66
+
67
+Basic.Settings.Output.Adv.Rescale="出力をリスケールする"
68
+Basic.Settings.Output.Adv.AudioTrack="オーディオ トラック"
69
+Basic.Settings.Output.Adv.Streaming="配信"
70
+Basic.Settings.Output.Adv.ApplyServiceSettings="ストリーミングサービスのエンコーダ設定を適用する"
71
+Basic.Settings.Output.Adv.Audio.Track1="トラック 1"
72
+Basic.Settings.Output.Adv.Audio.Track2="トラック 2"
73
+Basic.Settings.Output.Adv.Audio.Track3="トラック 3"
74
+Basic.Settings.Output.Adv.Audio.Track4="トラック 4"
75
+
76
+Basic.Settings.Output.Adv.Recording="録画"
77
+Basic.Settings.Output.Adv.Recording.Type="種別"
78
+Basic.Settings.Output.Adv.Recording.Type.Standard="標準"
79
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="カスタム出力 (FFmpeg)"
80
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(ストリームエンコーダーを使用)"
81
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="共通の録画フォーマット"
82
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="すべてのファイル"
83
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="ファイルパス または URL"
84
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="ビデオエンコーダー (空白 = デフォルト)"
85
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="ビデオエンコーダー設定 (ある場合)"
86
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="オーディオエンコーダー (空白 = デフォルト)"
87
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="オーディオエンコーダー設定 (ある場合)"
88
89
Basic.Settings.Video="映像"
90
Basic.Settings.Video.Adapter="ビデオアダプター:"
91
92
Basic.Settings.Video.InvalidResolution="解像度の値が不正です。[幅]x[高さ] (例 1920x1080)にしてください"
93
Basic.Settings.Video.CurrentlyActive="映像出力中です。映像設定を変更するには出力を停止してください。"
94
95
+Basic.Settings.Video.DownscaleFilter.Bilinear="バイリニア(スケーリングする場合ぼやけているが最速)"
96
+Basic.Settings.Video.DownscaleFilter.Bicubic="バイキュービック(先鋭化スケーリング、16 のサンプル)"
97
+Basic.Settings.Video.DownscaleFilter.Lanczos="ランチョス(先鋭化スケーリング、32 のサンプル)"
98
+
99
Basic.Settings.Audio="音声"
100
Basic.Settings.Audio.SampleRate="サンプリングレート"
101
Basic.Settings.Audio.Channels="チャンネル"
102
103
Basic.Settings.Audio.AuxDevice2="マイク音声デバイス 2"
104
Basic.Settings.Audio.AuxDevice3="マイク音声デバイス 3"
105
106
+
107
+Basic.AdvAudio="オーディオの詳細プロパティ"
108
+Basic.AdvAudio.Name="名称"
109
+Basic.AdvAudio.Volume="音量 (%)"
110
+Basic.AdvAudio.Mono="モノラルにダウンミックス"
111
+Basic.AdvAudio.Panning="パンニング"
112
+Basic.AdvAudio.SyncOffset="同期オフセット (ミリ秒)"
113
+Basic.AdvAudio.AudioTracks="トラック"
114
+
115
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/ko-KR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/ko-KR.ini
Changed
120
1
2
OK="확인"
3
Apply="적용"
4
Cancel="취소"
5
+Save="저장"
6
+Discard="저장 안함"
7
Yes="예"
8
No="아니오"
9
Add="추가"
10
11
MoveUp="위로 올리기"
12
MoveDown="아래로 내리기"
13
Settings="설정"
14
+Name="이름"
15
Exit="끝내기"
16
Mixer="믹서"
17
Browse="찾아보기"
18
19
NoNameEntered.Title="유효한 이름을 입력하십시오"
20
NoNameEntered.Text="이름을 반드시 지정해야 합니다."
21
22
+ConfirmExit.Title="OBS를 종료합니까?"
23
+ConfirmExit.Text="OBS가 현재 작동 중입니다. 정말로 종료할까요?"
24
+
25
ConfirmRemove.Title="제거 확인"
26
ConfirmRemove.Text="'$1'을 정말로 제거하시겠습니까?"
27
28
29
Basic.PropertiesWindow.AutoSelectFormat="%1 (미지원; 자동 선택: %2)"
30
Basic.PropertiesWindow.SelectColor="색상 지정"
31
Basic.PropertiesWindow.SelectFont="글꼴 선택"
32
+Basic.PropertiesWindow.ConfirmTitle="설정이 변경됨"
33
+Basic.PropertiesWindow.Confirm="아직 저장하지 않은 변경 사항이 있습니다. 변경을 유지하겠습니까?"
34
35
Basic.InteractionWindow="'%1' 과 상호 작용"
36
37
38
Basic.MainMenu.Edit.Order.MoveDown="아래로 내리기(&D)"
39
Basic.MainMenu.Edit.Order.MoveToTop="가장 위로 올리기(&T)"
40
Basic.MainMenu.Edit.Order.MoveToBottom="가장 아래로 내리기(&B)"
41
+Basic.MainMenu.Edit.AdvAudio="오디오 고급 설정(&A)"
42
43
Basic.MainMenu.Help="도움말(&H)"
44
Basic.MainMenu.Help.Logs="기록 파일(&L)"
45
46
Basic.Settings.Stream.StreamType="방송 형식"
47
48
Basic.Settings.Output="출력"
49
+Basic.Settings.Output.Encoder="인코더"
50
+Basic.Settings.Output.SelectDirectory="녹화 경로 선택"
51
+Basic.Settings.Output.SelectFile="녹화 파일 선택"
52
Basic.Settings.Output.Mode="출력 모드"
53
-Basic.Settings.Output.Mode.Simple="간단 (방송 그리고/또는 녹화)"
54
-Basic.Settings.Output.Mode.Advanced="고급 (사용자 정의 출력 형식)"
55
+Basic.Settings.Output.Mode.Simple="단순"
56
+Basic.Settings.Output.Mode.Adv="고급"
57
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg 출력"
58
Basic.Settings.Output.Simple.SavePath="FLV 녹화 경로"
59
Basic.Settings.Output.VideoBitrate="비디오 비트레이트"
60
Basic.Settings.Output.AudioBitrate="오디오 비트레이트"
61
62
Basic.Settings.Output.RetryDelay="재접속 간격 (초 단위)"
63
Basic.Settings.Output.MaxRetries="최대 재시도 횟수"
64
Basic.Settings.Output.Advanced="고급 인코더 설정 활성화"
65
-Basic.Settings.Output.X264Preset="x264 사전설정"
66
-Basic.Settings.Output.CustomX264Settings="사용자 임의 x264 설정"
67
+Basic.Settings.Output.EncoderPreset="인코더 사전설정 (높음 = 적은 CPU 부담)"
68
+Basic.Settings.Output.CustomEncoderSettings="사용자 임의 인코더 설정"
69
Basic.Settings.Output.UseCBR="고정 비트레이트 사용"
70
+Basic.Settings.Output.UseBufferSize="사용자 임의 버퍼 크기 설정"
71
+
72
+Basic.Settings.Output.Adv.Rescale="출력 배율 재조정"
73
+Basic.Settings.Output.Adv.AudioTrack="오디오 트랙"
74
+Basic.Settings.Output.Adv.Streaming="방송"
75
+Basic.Settings.Output.Adv.ApplyServiceSettings="방송 서비스 인코더 설정 강제 적용"
76
+Basic.Settings.Output.Adv.Audio.Track1="트랙 1"
77
+Basic.Settings.Output.Adv.Audio.Track2="트랙 2"
78
+Basic.Settings.Output.Adv.Audio.Track3="트랙 3"
79
+Basic.Settings.Output.Adv.Audio.Track4="트랙 4"
80
+
81
+Basic.Settings.Output.Adv.Recording="녹화"
82
+Basic.Settings.Output.Adv.Recording.Type="형식"
83
+Basic.Settings.Output.Adv.Recording.Type.Standard="표준"
84
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="임의 출력 (FFmpeg)"
85
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(스트림 인코더 사용)"
86
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="표준 녹화 형식"
87
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="모든 파일"
88
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="파일 경로 또는 URL"
89
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="비디오 인코더 (공백 = 기본값)"
90
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="비디오 인코더 설정 (지원되는 경우)"
91
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="오디오 인코더 (공백 = 기본값)"
92
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="오디오 인코더 설정 (지원되는 경우)"
93
94
Basic.Settings.Video="비디오"
95
Basic.Settings.Video.Adapter="비디오 어댑터:"
96
97
Basic.Settings.Video.InvalidResolution="잘못된 값이 입력되었습니다. 반드시 [폭]x[높이]의 형식이어야 합니다. (예 1920x1080)"
98
Basic.Settings.Video.CurrentlyActive="비디오가 현재 출력되고 있습니다. 비디오 설정을 변경하려면 관련 작업을 중단해야 합니다."
99
100
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (가장 빠르지만 크기가 변경 시 영상이 흐려짐 )"
101
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (영상 크기 변경을 좀 더 날카롭게 처리, 16 샘플)"
102
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (영상 크기 변경을 좀 더 날카롭게 처리, 32 샘플)"
103
+
104
Basic.Settings.Audio="오디오"
105
Basic.Settings.Audio.SampleRate="샘플 레이트"
106
Basic.Settings.Audio.Channels="채널"
107
108
Basic.Settings.Audio.AuxDevice2="마이크/보조 오디오 장치 2"
109
Basic.Settings.Audio.AuxDevice3="마이크/보조 오디오 장치 3"
110
111
+
112
+Basic.AdvAudio="오디오 고급 설정"
113
+Basic.AdvAudio.Name="이름"
114
+Basic.AdvAudio.Volume="볼륨 (%)"
115
+Basic.AdvAudio.Mono="모노로 강제 송출"
116
+Basic.AdvAudio.Panning="패닝"
117
+Basic.AdvAudio.SyncOffset="싱크 오프셋 (ms)"
118
+Basic.AdvAudio.AudioTracks="트랙"
119
+
120
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/nb-NO.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/nb-NO.ini
Changed
127
1
2
OK="OK"
3
Apply="Bruk"
4
Cancel="Avbryt"
5
+Save="Lagre"
6
+Discard="Forkast"
7
Yes="Ja"
8
No="Nei"
9
Add="Legg til"
10
11
MoveUp="Flytt opp"
12
MoveDown="Flytt ned"
13
Settings="Innstillinger"
14
+Name="Navn"
15
Exit="Avslutt"
16
Mixer="Mikser"
17
Browse="Bla gjennom"
18
19
NoNameEntered.Title="Vennligst oppgi et gyldig navn"
20
NoNameEntered.Text="Du kan ikke bruke et tomt navn."
21
22
+ConfirmExit.Title="Avslutt OBS?"
23
+ConfirmExit.Text="OBS er aktivt, er du sikker på at du vil avslutte?"
24
+
25
ConfirmRemove.Title="Bekreft Fjerning"
26
ConfirmRemove.Text="Er du sikker på at du vil fjerne '$1'?"
27
28
29
Basic.PropertiesWindow.AutoSelectFormat="%1 (ikke støttet; auto-velg: %2)"
30
Basic.PropertiesWindow.SelectColor="Velg farge"
31
Basic.PropertiesWindow.SelectFont="Velg skrifttype"
32
+Basic.PropertiesWindow.ConfirmTitle="Innstillingene er endret"
33
+Basic.PropertiesWindow.Confirm="Det er ulagra endringer. Vil du beholde dem?"
34
35
Basic.InteractionWindow="Kommuniserer med «%1»"
36
37
38
Basic.MainMenu.Edit.Order.MoveDown="Flytt &ned"
39
Basic.MainMenu.Edit.Order.MoveToTop="Legg på &toppen"
40
Basic.MainMenu.Edit.Order.MoveToBottom="Legg på &bunnen"
41
+Basic.MainMenu.Edit.AdvAudio="&Avanserte lydinstillinger"
42
43
Basic.MainMenu.Help="&Hjelp"
44
Basic.MainMenu.Help.Logs="&Loggfiler"
45
46
Basic.Settings.Stream.StreamType="Strømmetype"
47
48
Basic.Settings.Output="Innspilling"
49
+Basic.Settings.Output.Encoder="Koder"
50
+Basic.Settings.Output.SelectDirectory="Velg opptaksmappe"
51
+Basic.Settings.Output.SelectFile="Velg opptaksfil"
52
Basic.Settings.Output.Mode="Innspillingsmodus"
53
-Basic.Settings.Output.Mode.Simple="Lett (Strøm og/eller ta opp)"
54
-Basic.Settings.Output.Mode.Advanced="Avansert (Tilpasset inspillingstyper)"
55
+Basic.Settings.Output.Mode.Simple="Enkel"
56
+Basic.Settings.Output.Mode.Adv="Avansert"
57
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg produkt"
58
Basic.Settings.Output.Simple.SavePath="FLV Opptaksbane"
59
Basic.Settings.Output.VideoBitrate="Bildeoverføringshastighet"
60
Basic.Settings.Output.AudioBitrate="Lydoverføringshastighet"
61
62
Basic.Settings.Output.RetryDelay="Opphold mellom tilkoblingsforsøk (sekunder)"
63
Basic.Settings.Output.MaxRetries="Høyst antall tilkoblingsforsøk"
64
Basic.Settings.Output.Advanced="Aktiver Avanserte Koderinstillinger"
65
-Basic.Settings.Output.X264Preset="x264-forhåndsinnstilling"
66
-Basic.Settings.Output.CustomX264Settings="Egendefinerte x264 innstillinger"
67
+Basic.Settings.Output.EncoderPreset="Koderforhåndsinstilling (raskere gir mindre prosessorbelastning)"
68
+Basic.Settings.Output.CustomEncoderSettings="Egendefinert koderinstilling"
69
Basic.Settings.Output.UseCBR="Bruk Konstant Bitrate"
70
+Basic.Settings.Output.UseBufferSize="Bruk egendefinert bufferstørrelse"
71
+
72
+Basic.Settings.Output.Adv.Rescale="Reskaler produkt"
73
+Basic.Settings.Output.Adv.AudioTrack="Lydspor"
74
+Basic.Settings.Output.Adv.Streaming="Strømming"
75
+Basic.Settings.Output.Adv.ApplyServiceSettings="Bruk strømmetjenerens koderinstillinger"
76
+Basic.Settings.Output.Adv.Audio.Track1="Spor 1"
77
+Basic.Settings.Output.Adv.Audio.Track2="Spor 2"
78
+Basic.Settings.Output.Adv.Audio.Track3="Spor 3"
79
+Basic.Settings.Output.Adv.Audio.Track4="Spor 4"
80
+
81
+Basic.Settings.Output.Adv.Recording="Opptak"
82
+Basic.Settings.Output.Adv.Recording.Type="Type"
83
+Basic.Settings.Output.Adv.Recording.Type.Standard="Standard"
84
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Egendefinert FFmpeg produkt"
85
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Bruk strømkoder)"
86
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Vanlige opptaksformater"
87
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Alle filer"
88
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Filbane eller URL"
89
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Videokoder (standard hvis uangitt)"
90
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Videokoderinstillinger (hvis noen)"
91
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Lydkoder (standard hvis uangitt)"
92
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Lydkoderinstillinger (hvis noen)"
93
94
Basic.Settings.Video="Bilde"
95
Basic.Settings.Video.Adapter="Bildeadapter:"
96
97
Basic.Settings.Video.InvalidResolution="Ugyldig oppløsningsverdi. Må være [bredde]x[høyde] (f.eks. 1920x1080)"
98
Basic.Settings.Video.CurrentlyActive="Bildeinnspilling er aktiv. Vennligst skru av alle innspillinger for å endre bildeinstillingene"
99
100
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilineær (raskest, men uskarp ved skalering)"
101
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bikubisk (skjerpet skalering, 16 prøver)"
102
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (skjerpet skalering, 32 prøver)"
103
+
104
Basic.Settings.Audio="Lyd"
105
Basic.Settings.Audio.SampleRate="Samplingsfrekvens"
106
Basic.Settings.Audio.Channels="Kanaler"
107
108
Basic.Settings.Audio.AuxDevice2="Mikrofon/Aux 2"
109
Basic.Settings.Audio.AuxDevice3="Mikrofon/Aux 3"
110
111
+Basic.Settings.Advanced="Avansert"
112
+Basic.Settings.Advanced.Audio.BufferingTime="Lydbuffertid"
113
+Basic.Settings.Advanced.Video.ColorFormat="Fargeformat"
114
+Basic.Settings.Advanced.Video.ColorSpace="YUV fargerom"
115
+Basic.Settings.Advanced.Video.ColorRange="YUV fargespekter"
116
+Basic.Settings.Advanced.Video.ColorRange.Partial="Delvis"
117
+Basic.Settings.Advanced.Video.ColorRange.Full="Full"
118
+
119
+Basic.AdvAudio="Avanserte lydinstillinger"
120
+Basic.AdvAudio.Name="Navn"
121
+Basic.AdvAudio.Volume="Volum (%)"
122
+Basic.AdvAudio.Mono="Nedmiks til mono"
123
+Basic.AdvAudio.Panning="Panorering"
124
+Basic.AdvAudio.SyncOffset="Synkronerings forskyvning (ms)"
125
+Basic.AdvAudio.AudioTracks="Spor"
126
+
127
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/nl-NL.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/nl-NL.ini
Changed
111
1
2
MoveUp="Omhoog Schuiven"
3
MoveDown="Omlaag Schuiven"
4
Settings="Instellingen"
5
+Name="Naam"
6
Exit="Afsluiten"
7
Mixer="Mixer"
8
Browse="Bladeren"
9
10
NoNameEntered.Title="Voer a.u.b. een geldige naam in"
11
NoNameEntered.Text="Je kunt geen lege namen gebruiken."
12
13
+ConfirmExit.Title="OBS Afsluiten?"
14
+ConfirmExit.Text="OBS is momenteel actief. Weet je zeker dat je af wil sluiten?"
15
+
16
ConfirmRemove.Title="Bevestig het verwijderen"
17
ConfirmRemove.Text="Weet je zeker dat je '$1' wil verwijderen?"
18
19
20
Basic.PropertiesWindow.AutoSelectFormat="%1 (niet ondersteund; automatisch geselecteerd: %2)"
21
Basic.PropertiesWindow.SelectColor="Selecteer kleur"
22
Basic.PropertiesWindow.SelectFont="Selecteer lettertype"
23
+Basic.PropertiesWindow.ConfirmTitle="Instellingen Aangepast"
24
+Basic.PropertiesWindow.Confirm="Er zijn onopgeslagen aanpassingen. Wil je deze bewaren?"
25
26
Basic.InteractionWindow="Interactie met '%1'"
27
28
29
Basic.MainMenu.Edit.Order.MoveDown="Omlaag Schuiven (&D)"
30
Basic.MainMenu.Edit.Order.MoveToTop="Naar Boven Schuiven (&T)"
31
Basic.MainMenu.Edit.Order.MoveToBottom="Naar Onderen Schuiven (&B)"
32
+Basic.MainMenu.Edit.AdvAudio="Geavanceerde &Audioinstellingen"
33
34
Basic.MainMenu.Help="&Help"
35
Basic.MainMenu.Help.Logs="&Logbestanden"
36
37
Basic.Settings.Stream.StreamType="Stream Type"
38
39
Basic.Settings.Output="Uitvoer"
40
+Basic.Settings.Output.Encoder="Encoder"
41
+Basic.Settings.Output.SelectDirectory="Selecteer Opnamemap"
42
+Basic.Settings.Output.SelectFile="Selecteer Opnamebestand"
43
Basic.Settings.Output.Mode="Uitvoermodus"
44
-Basic.Settings.Output.Mode.Simple="Eenvoudig (Streamen en/of opnemen)"
45
-Basic.Settings.Output.Mode.Advanced="Geavanceerd (Aangepast uitvoertype)"
46
+Basic.Settings.Output.Mode.Simple="Simpel"
47
+Basic.Settings.Output.Mode.Adv="Geavanceerd"
48
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg-uitvoer"
49
Basic.Settings.Output.Simple.SavePath="FLV-opname pad"
50
Basic.Settings.Output.VideoBitrate="Video Bitrate"
51
Basic.Settings.Output.AudioBitrate="Audio Bitrate"
52
53
Basic.Settings.Output.RetryDelay="Opnieuw proberen na (seconden)"
54
Basic.Settings.Output.MaxRetries="Maximaal aantal pogingen"
55
Basic.Settings.Output.Advanced="Geavanceerde Encoderinsellingen Inschakelen"
56
-Basic.Settings.Output.X264Preset="x264 Preset"
57
-Basic.Settings.Output.CustomX264Settings="Aangepaste x264-instellingen"
58
+Basic.Settings.Output.EncoderPreset="Encoderinstelling (hoger = minder CPU)"
59
+Basic.Settings.Output.CustomEncoderSettings="Aangepaste encoderinstellingen"
60
Basic.Settings.Output.UseCBR="Gebruik Constante Bitrate"
61
+Basic.Settings.Output.UseBufferSize="Aangepaste buffergrootte gebruiken"
62
+
63
+Basic.Settings.Output.Adv.Rescale="Uitvoer Schalen"
64
+Basic.Settings.Output.Adv.AudioTrack="Geluidsspoor"
65
+Basic.Settings.Output.Adv.Streaming="Streamen"
66
+Basic.Settings.Output.Adv.ApplyServiceSettings="Forceer encoderinstellingen van de streaming dienst"
67
+Basic.Settings.Output.Adv.Audio.Track1="Spoor 1"
68
+Basic.Settings.Output.Adv.Audio.Track2="Spoor 2"
69
+Basic.Settings.Output.Adv.Audio.Track3="Spoor 3"
70
+Basic.Settings.Output.Adv.Audio.Track4="Spoor 4"
71
+
72
+Basic.Settings.Output.Adv.Recording="Opnemen"
73
+Basic.Settings.Output.Adv.Recording.Type="Type"
74
+Basic.Settings.Output.Adv.Recording.Type.Standard="Standaard"
75
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Aangepaste Uitvoer (FFmpeg)"
76
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Gebruik stream encoder)"
77
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Gebruikelijke opnameformaten"
78
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Alle Bestanden"
79
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Bestandspad of URL"
80
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Video Encoder (leeg = standaard)"
81
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Video Encoderinstellingen (indien gewenst)"
82
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Audio Encoder (leeg = standaard)"
83
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Audio Encoderinstellingen (indien gewenst)"
84
85
Basic.Settings.Video="Video"
86
Basic.Settings.Video.Adapter="Videoadapter:"
87
88
Basic.Settings.Video.InvalidResolution="Ongeldige resolutiewaarde. Moet [breedte] x [hoogte] zijn (bijv. 1920 x 1080)"
89
Basic.Settings.Video.CurrentlyActive="Video-uitvoer is momenteel actief. Schakel a.u.b. alle uitvoeren uit om video-instellingen aan te passen."
90
91
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (Snelste, maar wazig bij schalen)"
92
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (Scherper schalen, 16 samples)"
93
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Scherper schalen, 32 samples)"
94
+
95
Basic.Settings.Audio="Audio"
96
Basic.Settings.Audio.SampleRate="Sample Rate"
97
Basic.Settings.Audio.Channels="Kanalen"
98
99
Basic.Settings.Audio.AuxDevice2="Mic/Aux Audioapparaat 2"
100
Basic.Settings.Audio.AuxDevice3="Mic/Aux Audioapparaat 3"
101
102
+
103
+Basic.AdvAudio="Geavanceerde Audioinstellingen"
104
+Basic.AdvAudio.Name="Naam"
105
+Basic.AdvAudio.Volume="Volume (%)"
106
+Basic.AdvAudio.Mono="Downmixen naar Mono"
107
+Basic.AdvAudio.Panning="Pannen"
108
+Basic.AdvAudio.SyncOffset="Sync Offset (ms)"
109
+Basic.AdvAudio.AudioTracks="Sporen"
110
+
111
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/pl-PL.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/pl-PL.ini
Changed
41
1
2
NoNameEntered.Title="Proszę wprowadzić prawidłową nazwę"
3
NoNameEntered.Text="Nazwa nie może być pusta."
4
5
+
6
ConfirmRemove.Title="Potwierdź usunięcie"
7
ConfirmRemove.Text="Czy na pewno chcesz usunąć '$1'?"
8
9
10
11
Basic.Settings.Output="Wyjście"
12
Basic.Settings.Output.Mode="Tryb wyjścia"
13
-Basic.Settings.Output.Mode.Simple="Prosty (streamowanie i/lub zapis lokalny)"
14
-Basic.Settings.Output.Mode.Advanced="Zaawansowany (niestandardowy typ wyjścia)"
15
Basic.Settings.Output.Simple.SavePath="Ścieżka pliku FLV z nagraniem"
16
Basic.Settings.Output.VideoBitrate="Bitrate obrazu"
17
Basic.Settings.Output.AudioBitrate="Bitrate dźwięku"
18
Basic.Settings.Output.Reconnect="Ponowne łączenie"
19
Basic.Settings.Output.RetryDelay="Ponów połączenie (w sekundach)"
20
Basic.Settings.Output.MaxRetries="Maksymalna liczba ponownych prób"
21
-Basic.Settings.Output.CustomX264Settings="Własne ustawienia x264"
22
+
23
+
24
25
Basic.Settings.Video="Obraz"
26
Basic.Settings.Video.Adapter="Karta graficzna:"
27
28
Basic.Settings.Video.InvalidResolution="Nieprawidłowa rozdzielczość. Wartość powinna mieć format [szerokość]x[wysokość] (np. 1920x1080)"
29
Basic.Settings.Video.CurrentlyActive="Wyjście wideo jest aktywne. Należy wyłączyć wszelkie wyjścia, aby zmienić ustawienia wideo."
30
31
+
32
Basic.Settings.Audio="Dźwięk"
33
Basic.Settings.Audio.SampleRate="Częstotliwość próbkowania"
34
Basic.Settings.Audio.Channels="Kanały"
35
36
Basic.Settings.Audio.AuxDevice2="Mikrofon/dodatkowe urządzenie audio 2"
37
Basic.Settings.Audio.AuxDevice3="Mikrofon/dodatkowe urządzenie audio 3"
38
39
+
40
+
41
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/pt-BR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/pt-BR.ini
Changed
41
1
2
NoNameEntered.Title="Por favor digite um nome válido"
3
NoNameEntered.Text="Você não pode usar nomes vazios."
4
5
+
6
ConfirmRemove.Title="Confirmar a Remoção"
7
ConfirmRemove.Text="Tem certeza que deseja remover '$1'?"
8
9
10
11
Basic.Settings.Output="Saída"
12
Basic.Settings.Output.Mode="Modo de Saída"
13
-Basic.Settings.Output.Mode.Simple="Simples (Stream e/ou gravação)"
14
-Basic.Settings.Output.Mode.Advanced="Avançado (Definições manuais)"
15
Basic.Settings.Output.Simple.SavePath="Caminho de Gravação FLV"
16
Basic.Settings.Output.VideoBitrate="Taxa de Bits do Vídeo"
17
Basic.Settings.Output.AudioBitrate="Taxa de Bits do Áudio"
18
Basic.Settings.Output.Reconnect="Reconectar automaticamente"
19
Basic.Settings.Output.RetryDelay="Espera para reconectar-se (segundos)"
20
Basic.Settings.Output.MaxRetries="Número Máximo de Tentativas"
21
-Basic.Settings.Output.CustomX264Settings="Configurações personalizadas do x264"
22
+
23
+
24
25
Basic.Settings.Video="Vídeo"
26
Basic.Settings.Video.Adapter="Adaptador de Vídeo:"
27
28
Basic.Settings.Video.InvalidResolution="Resolução Inválida, Obrigatório ser [largura]x[altura] (ex. 1920x1080)"
29
Basic.Settings.Video.CurrentlyActive="Saída de vídeo está atualmente ativa. Por favor desligue quaisquer saídas para alterar as configurações de vídeo."
30
31
+
32
Basic.Settings.Audio="Áudio"
33
Basic.Settings.Audio.SampleRate="Taxa de Amostragem"
34
Basic.Settings.Audio.Channels="Canais"
35
36
Basic.Settings.Audio.AuxDevice2="Dispositivo de áudio/microfone auxiliar 2"
37
Basic.Settings.Audio.AuxDevice3="Dispositivo de áudio/microfone auxiliar 3"
38
39
+
40
+
41
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/pt-PT.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/pt-PT.ini
Changed
41
1
2
NameExists.Text="O nome já encontra-se em utilização."
3
4
5
+
6
ConfirmRemove.Title="Comfirmar Remover"
7
ConfirmRemove.Text="Tem a certeza que quer remover '$1'?"
8
9
10
11
Basic.Settings.Output="Saída Output"
12
Basic.Settings.Output.Mode="Modo de Saída"
13
-Basic.Settings.Output.Mode.Simple="Simples (Stream e/ou gravação)"
14
-Basic.Settings.Output.Mode.Advanced="Avançado (Definições manuais)"
15
Basic.Settings.Output.Simple.SavePath="Caminho de Gravação FLV"
16
Basic.Settings.Output.VideoBitrate="Bitrate de Vídeo"
17
Basic.Settings.Output.AudioBitrate="Bitrate de Áudio"
18
19
Basic.Settings.Output.RetryDelay="Atraso de Tentatica de Religação (segundos)"
20
Basic.Settings.Output.MaxRetries="Número Máximo de Tentativas de Religação"
21
22
+
23
+
24
Basic.Settings.Video="Vídeo"
25
Basic.Settings.Video.Adapter="Adaptador de Vídeo:"
26
Basic.Settings.Video.BaseResolution="Resolução de Captura:"
27
28
Basic.Settings.Video.InvalidResolution="Resolução Inválida, Tem de ser [largura]x[altura] (ex. 1920x1080)"
29
Basic.Settings.Video.CurrentlyActive="A Saída de Vídeo encontra-se activa. Por favor desligue a saída de vídeo para mudar as definições de vídeo."
30
31
+
32
Basic.Settings.Audio="Áudio"
33
Basic.Settings.Audio.SampleRate="Frequência de Samplagem"
34
Basic.Settings.Audio.Channels="Canias"
35
36
Basic.Settings.Audio.AuxDevice2="Mic/Auxiliary Audio Device 2"
37
Basic.Settings.Audio.AuxDevice3="Mic/Auxiliary Audio Device 3"
38
39
+
40
+
41
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/ro-RO.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/ro-RO.ini
Changed
71
1
2
NoNameEntered.Title="Va rugăm introduceţi un nume valid"
3
NoNameEntered.Text="Nu puteți utiliza un nume gol."
4
5
+
6
ConfirmRemove.Title="Confirmă Ştergere"
7
ConfirmRemove.Text="Sigur eliminaţi '$1'?"
8
9
10
Basic.PropertiesWindow.AutoSelectFormat="%1 (neacceptat; Selectare automată: %2)"
11
Basic.PropertiesWindow.SelectColor="Selectaţi culoarea"
12
Basic.PropertiesWindow.SelectFont="Selectează Fontul"
13
+Basic.PropertiesWindow.ConfirmTitle="Setări Schimbate"
14
+Basic.PropertiesWindow.Confirm="Există modificări nesalvate. Vrei să le păstrezi?"
15
16
Basic.InteractionWindow="Interacționează cu '%1'"
17
18
19
Basic.MainMenu.Edit.Order.MoveDown="Mută &Jos"
20
Basic.MainMenu.Edit.Order.MoveToTop="Mută &Prima"
21
Basic.MainMenu.Edit.Order.MoveToBottom="Mută &Ultima"
22
+Basic.MainMenu.Edit.AdvAudio="&Proprietăţi Audio Avansate"
23
24
Basic.MainMenu.Help="&Ajutor"
25
Basic.MainMenu.Help.Logs="&Fişierele jurnal"
26
27
28
Basic.Settings.Output="Ieşire"
29
Basic.Settings.Output.Mode="Modul de ieşire"
30
-Basic.Settings.Output.Mode.Simple="Simplu (Stream si/sau înregistrare)"
31
-Basic.Settings.Output.Mode.Advanced="Avansat (tip de ieşire personalizat)"
32
Basic.Settings.Output.Simple.SavePath="Calea de înregistrare FLV"
33
Basic.Settings.Output.VideoBitrate="Video Bitrate"
34
Basic.Settings.Output.AudioBitrate="Audio Bitrate"
35
36
Basic.Settings.Output.RetryDelay="Intârziere reincercare (secunde)"
37
Basic.Settings.Output.MaxRetries="Maxim de reîncercări"
38
Basic.Settings.Output.Advanced="Activează Setări Codare Avansate"
39
-Basic.Settings.Output.X264Preset="Presetul x264"
40
-Basic.Settings.Output.CustomX264Settings="Setări x264 Personalizate"
41
Basic.Settings.Output.UseCBR="Utilizează Bitrate Constant"
42
43
+
44
+
45
Basic.Settings.Video="Video"
46
Basic.Settings.Video.Adapter="Adaptor video:"
47
Basic.Settings.Video.BaseResolution="Rezoluţia de bază:"
48
49
Basic.Settings.Video.InvalidResolution="Valoare rezoluţie invalidă. Trebuie să fie [latime]x[înălţime] (de exemplu, 1920x1080)"
50
Basic.Settings.Video.CurrentlyActive="Ieşirea video este în prezent activă. Vă rugăm să opriţi orice ieşiri pentru a schimba setările video."
51
52
+Basic.Settings.Video.DownscaleFilter.Bilinear="Biliniar (mai rapid, dar neclar la scalare)"
53
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (Scalare ascutita, 16 mostre)"
54
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Scalare ascutita, 32 de mostre)"
55
+
56
Basic.Settings.Audio="Audio"
57
Basic.Settings.Audio.SampleRate="Rata de eşantionare"
58
Basic.Settings.Audio.Channels="Canale"
59
60
Basic.Settings.Audio.AuxDevice2="Dispozitiv Audio microfon/auxiliar 2"
61
Basic.Settings.Audio.AuxDevice3="Dispozitiv Audio microfon/auxiliar 3"
62
63
+
64
+Basic.AdvAudio="Proprietăţi Audio Avansate"
65
+Basic.AdvAudio.Name="Nume"
66
+Basic.AdvAudio.Volume="Volum (%)"
67
+Basic.AdvAudio.Mono="Transformă in Mono"
68
+Basic.AdvAudio.Panning="Panning"
69
+Basic.AdvAudio.SyncOffset="Compensare Sincronizare (ms)"
70
+
71
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/ru-RU.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/ru-RU.ini
Changed
127
1
2
OK="OK"
3
Apply="Применить"
4
Cancel="Отмена"
5
+Save="Сохранить"
6
+Discard="Отклонить"
7
Yes="Да"
8
No="Нет"
9
Add="Добавить"
10
11
MoveUp="Выше"
12
MoveDown="Ниже"
13
Settings="Настройки"
14
+Name="Название"
15
Exit="Выход"
16
Mixer="Микшер"
17
Browse="Обзор"
18
19
NoNameEntered.Title="Пожалуйста, укажите действительное имя"
20
NoNameEntered.Text="Вы не можете использовать пустые имена."
21
22
+ConfirmExit.Title="Выйти из OBS?"
23
+ConfirmExit.Text="OBS сейчас активен. Вы уверены, что хотите выйти?"
24
+
25
ConfirmRemove.Title="Подтвердить удаление"
26
ConfirmRemove.Text="Вы уверены, что хотите удалить '$1'?"
27
28
29
Basic.PropertiesWindow.AutoSelectFormat="%1 (неподдерживаемый; Автовыбор: %2)"
30
Basic.PropertiesWindow.SelectColor="Выбрать цвет"
31
Basic.PropertiesWindow.SelectFont="Выбрать шрифт"
32
+Basic.PropertiesWindow.ConfirmTitle="Настройки изменены"
33
+Basic.PropertiesWindow.Confirm="Имеются несохранённые изменения. Желаете сохранить их?"
34
35
Basic.InteractionWindow="Взаимодействие с '%1'"
36
37
38
Basic.MainMenu.Edit.Order.MoveDown="Переместить &Ниже"
39
Basic.MainMenu.Edit.Order.MoveToTop="Переместить &Наверх"
40
Basic.MainMenu.Edit.Order.MoveToBottom="Переместить &Вниз"
41
+Basic.MainMenu.Edit.AdvAudio="&Расширенные свойства аудио"
42
43
Basic.MainMenu.Help="&Справка"
44
Basic.MainMenu.Help.Logs="&Log файлы"
45
46
Basic.Settings.Stream.StreamType="Тип вещания"
47
48
Basic.Settings.Output="Вывод"
49
+Basic.Settings.Output.Encoder="Кодировщик"
50
+Basic.Settings.Output.SelectDirectory="Выбрать каталог записи"
51
+Basic.Settings.Output.SelectFile="Выбрать файл записи"
52
Basic.Settings.Output.Mode="Режим вывода"
53
-Basic.Settings.Output.Mode.Simple="Простой (Прямая трансляция и/или запись)"
54
-Basic.Settings.Output.Mode.Advanced="Расширенный (Настраиваемый тип вывода)"
55
+Basic.Settings.Output.Mode.Simple="Простой"
56
+Basic.Settings.Output.Mode.Adv="Расширенные"
57
+Basic.Settings.Output.Mode.FFmpeg="Вывод FFmpeg"
58
Basic.Settings.Output.Simple.SavePath="Путь для записи FLV"
59
Basic.Settings.Output.VideoBitrate="Битрейт видео"
60
Basic.Settings.Output.AudioBitrate="Битрейт аудио"
61
62
Basic.Settings.Output.RetryDelay="Задержка между повторными попытками (с)"
63
Basic.Settings.Output.MaxRetries="Максимальное количество повторов"
64
Basic.Settings.Output.Advanced="Включить дополнительные настройки кодировщика"
65
-Basic.Settings.Output.X264Preset="Пресет x264"
66
-Basic.Settings.Output.CustomX264Settings="Пользовательские настройки x264"
67
+Basic.Settings.Output.EncoderPreset="Предустановки кодировщика (выше = меньше ЦП)"
68
+Basic.Settings.Output.CustomEncoderSettings="Пользовательские настройки кодировщика"
69
Basic.Settings.Output.UseCBR="Использовать постоянный битрейт"
70
+Basic.Settings.Output.UseBufferSize="Использовать пользовательский размер буфера"
71
+
72
+Basic.Settings.Output.Adv.Rescale="Перемасштабировать вывод"
73
+Basic.Settings.Output.Adv.AudioTrack="Звуковая дорожка"
74
+Basic.Settings.Output.Adv.Streaming="Потоковое вещание"
75
+Basic.Settings.Output.Adv.ApplyServiceSettings="Принудительно использовать настройки кодировщика потоковой службы"
76
+Basic.Settings.Output.Adv.Audio.Track1="Дорожка 1"
77
+Basic.Settings.Output.Adv.Audio.Track2="Дорожка 2"
78
+Basic.Settings.Output.Adv.Audio.Track3="Дорожка 3"
79
+Basic.Settings.Output.Adv.Audio.Track4="Дорожка 4"
80
+
81
+Basic.Settings.Output.Adv.Recording="Запись"
82
+Basic.Settings.Output.Adv.Recording.Type="Тип"
83
+Basic.Settings.Output.Adv.Recording.Type.Standard="Обычный"
84
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Пользовательский вывод (FFmpeg)"
85
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Использовать кодировщик потока)"
86
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Общие форматы записи"
87
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Все файлы"
88
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Путь к файлу или URL-адрес"
89
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Кодировщик видео (пусто = по умолчанию)"
90
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Настройки кодировщика видео (если есть)"
91
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Кодировщик аудио (пусто = по умолчанию)"
92
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Настройки кодировщика аудио (если есть)"
93
94
Basic.Settings.Video="Видео"
95
Basic.Settings.Video.Adapter="Видеоадаптер:"
96
97
Basic.Settings.Video.InvalidResolution="Неверное разрешение. Должно быть [Ширина]x[Высота] (т.е. 1920x1080)"
98
Basic.Settings.Video.CurrentlyActive="Видео выход в данный момент активен. Пожалуйста, отключите все выходы, чтобы изменить настройки видео."
99
100
+Basic.Settings.Video.DownscaleFilter.Bilinear="Билинейный (Быстрый, но размытый при масштабировании)"
101
+Basic.Settings.Video.DownscaleFilter.Bicubic="Бикубический (Чёткое масштабирование, 16 значений)"
102
+Basic.Settings.Video.DownscaleFilter.Lanczos="Метод Ланцоша (Чёткое масштабирование, 32 значения)"
103
+
104
Basic.Settings.Audio="Аудио"
105
Basic.Settings.Audio.SampleRate="Частота дискретизации"
106
Basic.Settings.Audio.Channels="Каналы"
107
108
Basic.Settings.Audio.AuxDevice2="Mic/Auxiliary Аудиоустройство 2"
109
Basic.Settings.Audio.AuxDevice3="Mic/Auxiliary Аудиоустройство 3"
110
111
+Basic.Settings.Advanced="Расширенные"
112
+Basic.Settings.Advanced.Audio.BufferingTime="Время буферизации аудио"
113
+Basic.Settings.Advanced.Video.ColorFormat="Цветовой формат"
114
+Basic.Settings.Advanced.Video.ColorSpace="Цветовое пространство YUV"
115
+Basic.Settings.Advanced.Video.ColorRange="Цветовой диапазон YUV"
116
+Basic.Settings.Advanced.Video.ColorRange.Partial="Частичный"
117
+Basic.Settings.Advanced.Video.ColorRange.Full="Полный"
118
+
119
+Basic.AdvAudio="Расширенные свойства аудио"
120
+Basic.AdvAudio.Name="Название"
121
+Basic.AdvAudio.Volume="Громкость (%)"
122
+Basic.AdvAudio.Mono="Объединение в один канал"
123
+Basic.AdvAudio.Panning="Панорамирование"
124
+Basic.AdvAudio.SyncOffset="Смещение синхронизации (мс)"
125
+Basic.AdvAudio.AudioTracks="Дорожки"
126
+
127
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/sk-SK.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/sk-SK.ini
Changed
41
1
2
NoNameEntered.Title="Prosím, zadajte platný názov"
3
NoNameEntered.Text="Nemôžete použiť prázdne názvy."
4
5
+
6
ConfirmRemove.Title="Potvrdenie odobratia"
7
ConfirmRemove.Text="Naozaj si prajete odobrať '$1'?"
8
9
10
11
Basic.Settings.Output="Výstup"
12
Basic.Settings.Output.Mode="Režim výstupu"
13
-Basic.Settings.Output.Mode.Simple="Jednoduchý (Stream a/alebo nahrávanie)"
14
-Basic.Settings.Output.Mode.Advanced="Pokročilý (Vlastný typ výstupu)"
15
Basic.Settings.Output.Simple.SavePath="Cesta k FLV nahrávkam"
16
Basic.Settings.Output.VideoBitrate="Bitrate videa"
17
Basic.Settings.Output.AudioBitrate="Bitrate zvuku"
18
19
Basic.Settings.Output.RetryDelay="Čas medzi pokusmi (sekundy)"
20
Basic.Settings.Output.MaxRetries="Maximálny počet pokusov"
21
Basic.Settings.Output.Advanced="Povoliť pokročilé nastavenia enkodéra"
22
-Basic.Settings.Output.CustomX264Settings="Vlastné x264 nastavenia"
23
Basic.Settings.Output.UseCBR="Použiť konštantný bitrate"
24
25
+
26
+
27
Basic.Settings.Video="Video"
28
Basic.Settings.Video.Adapter="Video adaptér:"
29
Basic.Settings.Video.BaseResolution="Základné rozlíšenie:"
30
31
Basic.Settings.Video.InvalidResolution="Neplatné rozlíšenie. Správne je [šírka]x[výška] (napr. 1920x1080)"
32
Basic.Settings.Video.CurrentlyActive="Výstup videa je práve aktívny. Prosím, vypnite všetky výstupy na zmenu nastavení videa."
33
34
+
35
Basic.Settings.Audio="Zvuk"
36
Basic.Settings.Audio.SampleRate="Vzorkovacia frekvencia"
37
Basic.Settings.Audio.Channels="Kanály"
38
39
+
40
+
41
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/sl-SI.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/sl-SI.ini
Changed
45
1
2
NoNameEntered.Title="Prosim vnesite veljavno ime"
3
NoNameEntered.Text="Praznega imena ne morete uporabiti."
4
5
+
6
ConfirmRemove.Title="Potrdite odstranitev"
7
ConfirmRemove.Text="Ali ste prepričani, da želite odstraniti '$ 1'?"
8
9
10
11
Basic.Settings.Output="Izhodišče"
12
Basic.Settings.Output.Mode="Vrsta izhodišča"
13
-Basic.Settings.Output.Mode.Simple="Enostavno (Oddajanje in/ali Snemanje)"
14
-Basic.Settings.Output.Mode.Advanced="Napredno (vrsta izhoda po želji)"
15
Basic.Settings.Output.Simple.SavePath="FLV pot snemanja"
16
Basic.Settings.Output.VideoBitrate="Bitrate Videa"
17
Basic.Settings.Output.AudioBitrate="Bitrate zvoka"
18
19
Basic.Settings.Output.RetryDelay="Premor med ponovnim poskusom (sekund)"
20
Basic.Settings.Output.MaxRetries="Število ponovnih poskusov"
21
Basic.Settings.Output.Advanced="Omogoči napredne nastavitve kodiranja"
22
-Basic.Settings.Output.X264Preset="x264 prednastavitev"
23
-Basic.Settings.Output.CustomX264Settings="Nastavitve po meri x264"
24
Basic.Settings.Output.UseCBR="Uporabi konstantni Bitrate"
25
26
+
27
+
28
Basic.Settings.Video="Video"
29
Basic.Settings.Video.Adapter="Grafična kartica:"
30
Basic.Settings.Video.BaseResolution="Osnovna ločljivost:"
31
32
Basic.Settings.Video.InvalidResolution="Neveljavna vrednost ločljivost. Biti mora [širina] x [višina] (npr. 1920x1080)"
33
Basic.Settings.Video.CurrentlyActive="Video izhod je trenutno aktiven. Prosimo, izklopite kakšen koli izhod za spreminjanje nastavitev."
34
35
+
36
Basic.Settings.Audio="Zvok"
37
Basic.Settings.Audio.SampleRate="Sample Rate"
38
Basic.Settings.Audio.Channels="Kanali"
39
40
Basic.Settings.Audio.AuxDevice2="Mic / Dodatne Zvočne Naprave 2"
41
Basic.Settings.Audio.AuxDevice3="Mic / Dodatne Zvočne Naprave 3"
42
43
+
44
+
45
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/sr-CS.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/sr-CS.ini
Changed
110
1
2
MoveUp="Pomeri gore"
3
MoveDown="Pomeri dole"
4
Settings="Podešavanja"
5
+Name="Ime"
6
Exit="Izlaz"
7
Mixer="Mikseta"
8
Browse="Pretraži"
9
10
NoNameEntered.Title="Molim unesite ispravno ime"
11
NoNameEntered.Text="Ne možete izostaviti ime."
12
13
+ConfirmExit.Title="Napustiti OBS?"
14
+ConfirmExit.Text="OBS je trenutno aktivan. Da li ste sigurni da želite izaći?"
15
+
16
ConfirmRemove.Title="Potvrdi izbacivanje"
17
ConfirmRemove.Text="Da li ste sigurni da želite izbaciti '$1'?"
18
19
20
Basic.PropertiesWindow.AutoSelectFormat="%1 (nije podržano; automatski odabrano: %2)"
21
Basic.PropertiesWindow.SelectColor="Izaberi boju"
22
Basic.PropertiesWindow.SelectFont="Izaberi font"
23
+Basic.PropertiesWindow.ConfirmTitle="Podešavanja promenjena"
24
+Basic.PropertiesWindow.Confirm="Postoje podešavanja koja nisu sačuvana. Da li želite da ih sačuvate?"
25
26
Basic.InteractionWindow="Interakcija sa '%1'"
27
28
29
Basic.MainMenu.Edit.Order.MoveDown="Pomeri &dole"
30
Basic.MainMenu.Edit.Order.MoveToTop="Pomeri na vrh (&T)"
31
Basic.MainMenu.Edit.Order.MoveToBottom="Pomeri na dno (&B)"
32
+Basic.MainMenu.Edit.AdvAudio="N&apredna podešavanja zvuka"
33
34
Basic.MainMenu.Help="Pomoć (&H)"
35
Basic.MainMenu.Help.Logs="&Log datoteke"
36
37
Basic.Settings.Stream.StreamType="Vrsta strima"
38
39
Basic.Settings.Output="Izlaz"
40
+Basic.Settings.Output.Encoder="Enkoder"
41
+Basic.Settings.Output.SelectDirectory="Odaberi direktorijum za snimanje"
42
+Basic.Settings.Output.SelectFile="Odaberi datoteku za snimanje"
43
Basic.Settings.Output.Mode="Režim izlaza"
44
-Basic.Settings.Output.Mode.Simple="Jednostavno (stream i/ili snimanje)"
45
-Basic.Settings.Output.Mode.Advanced="Napredno (specifičan tip izlaza)"
46
+Basic.Settings.Output.Mode.Simple="Jednostavno"
47
+Basic.Settings.Output.Mode.Adv="Napredno"
48
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg izlaz"
49
Basic.Settings.Output.Simple.SavePath="Putanja snimka za FLV"
50
Basic.Settings.Output.VideoBitrate="Protok videa"
51
Basic.Settings.Output.AudioBitrate="Protok zvuka"
52
53
Basic.Settings.Output.RetryDelay="Pauza pre ponovnog pokušaja (sekunde)"
54
Basic.Settings.Output.MaxRetries="Maksimalan broj ponovnih pokušaja"
55
Basic.Settings.Output.Advanced="Omogući napredna podešavanja kompresora"
56
-Basic.Settings.Output.X264Preset="x264 šablon"
57
-Basic.Settings.Output.CustomX264Settings="Specifična x264 podešavanja"
58
+Basic.Settings.Output.EncoderPreset="Šablon enkodera (veće = manje CPU)"
59
+Basic.Settings.Output.CustomEncoderSettings="Prilagođena enkoder podešavanja"
60
Basic.Settings.Output.UseCBR="Koristi konstantan protok"
61
+Basic.Settings.Output.UseBufferSize="Koristi specifičnu veličinu bafera"
62
+
63
+Basic.Settings.Output.Adv.Rescale="Skaliraj izlaz"
64
+Basic.Settings.Output.Adv.AudioTrack="Zvučni izvor"
65
+Basic.Settings.Output.Adv.Streaming="Strimovanje"
66
+Basic.Settings.Output.Adv.Audio.Track1="Izvor 1"
67
+Basic.Settings.Output.Adv.Audio.Track2="Izvor 2"
68
+Basic.Settings.Output.Adv.Audio.Track3="Izvor 3"
69
+Basic.Settings.Output.Adv.Audio.Track4="Izvor 4"
70
+
71
+Basic.Settings.Output.Adv.Recording="Snimanje"
72
+Basic.Settings.Output.Adv.Recording.Type="Vrsta"
73
+Basic.Settings.Output.Adv.Recording.Type.Standard="Uobičajeni"
74
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Prilagođeni izlaz (FFmpeg)"
75
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Koristi strim enkoder)"
76
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Uobičajeni formati snimaka"
77
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Sve datoteke"
78
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Putanja datoteke ili URL"
79
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Video enkoder (prazno=podrazumevani)"
80
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Podešavanja video enkodera (ako postoje)"
81
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Zvučni enkoder (prazno=podrazumevani)"
82
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Podešavanja zvučnog enkodera (ako postoje)"
83
84
Basic.Settings.Video="Video"
85
Basic.Settings.Video.Adapter="Video adapter:"
86
87
Basic.Settings.Video.InvalidResolution="Neispravna vrednost rezolucije. Mora biti [width]x[height] (npr. 1920x1080)"
88
Basic.Settings.Video.CurrentlyActive="Video izlaz je trenutno aktivan. Molim isključite sve izlaze da promenite video podešavanja."
89
90
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (najbrže, ali mutno pri skaliranju)"
91
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (oštrije skaliranje, 16 uzoraka)"
92
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (oštrije skaliranje, 32 uzorka)"
93
+
94
Basic.Settings.Audio="Zvuk"
95
Basic.Settings.Audio.SampleRate="Protok"
96
Basic.Settings.Audio.Channels="Kanali"
97
98
Basic.Settings.Audio.AuxDevice2="Mikrofon/Ulaz 2"
99
Basic.Settings.Audio.AuxDevice3="Mikrofon/Ulaz 3"
100
101
+
102
+Basic.AdvAudio="Napredna podešavanja zvuka"
103
+Basic.AdvAudio.Name="Ime"
104
+Basic.AdvAudio.Volume="Glasnoća (%)"
105
+Basic.AdvAudio.Mono="Spoji u mono"
106
+Basic.AdvAudio.Panning="Pomeranje"
107
+Basic.AdvAudio.SyncOffset="Razlika u sinhronizaciji (ms)"
108
+Basic.AdvAudio.AudioTracks="Izvori"
109
+
110
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/sr-SP.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/sr-SP.ini
Changed
110
1
2
MoveUp="Помери горе"
3
MoveDown="Помери доле"
4
Settings="Подешавања"
5
+Name="Име"
6
Exit="Излаз"
7
Mixer="Миксета"
8
Browse="Претражи"
9
10
NoNameEntered.Title="Молим унесите исправно име"
11
NoNameEntered.Text="Не можете изоставити име."
12
13
+ConfirmExit.Title="Напустити OBS?"
14
+ConfirmExit.Text="OBS је тренутно активан. Да ли сте сигурни да желите изаћи?"
15
+
16
ConfirmRemove.Title="Потврди избацивање"
17
ConfirmRemove.Text="Да ли сте сигурни да желите избацити '$1'?"
18
19
20
Basic.PropertiesWindow.AutoSelectFormat="%1 (није подржано; аутоматски одабрано: %2)"
21
Basic.PropertiesWindow.SelectColor="Изабери боју"
22
Basic.PropertiesWindow.SelectFont="Изабери фонт"
23
+Basic.PropertiesWindow.ConfirmTitle="Подешавања промењена"
24
+Basic.PropertiesWindow.Confirm="Постоје подешавања која нису сачувана. Да ли желите да их сачувате?"
25
26
Basic.InteractionWindow="Интеракција са '%1'"
27
28
29
Basic.MainMenu.Edit.Order.MoveDown="Помери доле (&D)"
30
Basic.MainMenu.Edit.Order.MoveToTop="Помери на врх (&T)"
31
Basic.MainMenu.Edit.Order.MoveToBottom="Помери на дно (&B)"
32
+Basic.MainMenu.Edit.AdvAudio="Н&апредна подешавања звука"
33
34
Basic.MainMenu.Help="Помоћ (&H)"
35
Basic.MainMenu.Help.Logs="Лог датотеке (&L)"
36
37
Basic.Settings.Stream.StreamType="Врста стрима"
38
39
Basic.Settings.Output="Излаз"
40
+Basic.Settings.Output.Encoder="Енкодер"
41
+Basic.Settings.Output.SelectDirectory="Одабери директоријум за снимање"
42
+Basic.Settings.Output.SelectFile="Одабери датотеку за снимање"
43
Basic.Settings.Output.Mode="Режим излаза"
44
-Basic.Settings.Output.Mode.Simple="Једноставно (стрим и/или снимање)"
45
-Basic.Settings.Output.Mode.Advanced="Напредно (специфичан тип излаза)"
46
+Basic.Settings.Output.Mode.Simple="Једноставно"
47
+Basic.Settings.Output.Mode.Adv="Напредно"
48
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg излаз"
49
Basic.Settings.Output.Simple.SavePath="Путања снимка за FLV"
50
Basic.Settings.Output.VideoBitrate="Проток видеа"
51
Basic.Settings.Output.AudioBitrate="Проток звука"
52
53
Basic.Settings.Output.RetryDelay="Пауза пре поновног покушаја (секунде)"
54
Basic.Settings.Output.MaxRetries="Максималан број поновних покушаја"
55
Basic.Settings.Output.Advanced="Омогући напредна подешавања компресора"
56
-Basic.Settings.Output.X264Preset="x264 шаблон"
57
-Basic.Settings.Output.CustomX264Settings="Специфична x264 подешавања"
58
+Basic.Settings.Output.EncoderPreset="Шаблон енкодера (веће = мање CPU-а)"
59
+Basic.Settings.Output.CustomEncoderSettings="Прилагођена енкодер подешавања"
60
Basic.Settings.Output.UseCBR="Користи константан проток"
61
+Basic.Settings.Output.UseBufferSize="Користи специфичну величину бафера"
62
+
63
+Basic.Settings.Output.Adv.Rescale="Скалирај излаз"
64
+Basic.Settings.Output.Adv.AudioTrack="Звучни извор"
65
+Basic.Settings.Output.Adv.Streaming="Стримовање"
66
+Basic.Settings.Output.Adv.Audio.Track1="Извор 1"
67
+Basic.Settings.Output.Adv.Audio.Track2="Извор 2"
68
+Basic.Settings.Output.Adv.Audio.Track3="Извор 3"
69
+Basic.Settings.Output.Adv.Audio.Track4="Извор 4"
70
+
71
+Basic.Settings.Output.Adv.Recording="Снимање"
72
+Basic.Settings.Output.Adv.Recording.Type="Врста"
73
+Basic.Settings.Output.Adv.Recording.Type.Standard="Уобичајени"
74
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Прилагођени излаз (FFmpeg)"
75
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Користи стрим енкодер)"
76
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Уобичајени формати снимака"
77
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Све датотеке"
78
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Путања датотеке или URL"
79
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Видео енкодер (празно=подразумевани)"
80
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Подешавања видео енкодера (ако постоје)"
81
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Звучни енкодер (празно=подразумевани)"
82
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Подешавања звучног енкодера (ако постоје)"
83
84
Basic.Settings.Video="Видео"
85
Basic.Settings.Video.Adapter="Видео адаптер:"
86
87
Basic.Settings.Video.InvalidResolution="Неисправна вредност резолуције. Мора бити [width]x[height] (нпр. 1920x1080)"
88
Basic.Settings.Video.CurrentlyActive="Видео излаз је тренутно активан. Молим искључите све излазе да промените видео подешавања."
89
90
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinear (најбрже, али мутно при скалирању)"
91
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bicubic (оштрије скалирање, 16 узорака)"
92
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (оштрије скалирање, 32 узорка)"
93
+
94
Basic.Settings.Audio="Звук"
95
Basic.Settings.Audio.SampleRate="Проток"
96
Basic.Settings.Audio.Channels="Канали"
97
98
Basic.Settings.Audio.AuxDevice2="Микрофон/Улаз 2"
99
Basic.Settings.Audio.AuxDevice3="Микрофон/Улаз 3"
100
101
+
102
+Basic.AdvAudio="Напредна подешавања звука"
103
+Basic.AdvAudio.Name="Име"
104
+Basic.AdvAudio.Volume="Гласноћа (%)"
105
+Basic.AdvAudio.Mono="Споји у моно"
106
+Basic.AdvAudio.Panning="Померање"
107
+Basic.AdvAudio.SyncOffset="Разлика у синхронизацији (ms)"
108
+Basic.AdvAudio.AudioTracks="Извори"
109
+
110
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/sv-SE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/sv-SE.ini
Changed
120
1
2
OK="OK"
3
Apply="Bekräfta"
4
Cancel="Avbryt"
5
+Save="Spara"
6
+Discard="Radera"
7
Yes="Ja"
8
No="Nej"
9
Add="Lägg till"
10
11
MoveUp="Flytta upp"
12
MoveDown="Flytta ned"
13
Settings="Inställningar"
14
+Name="Namn"
15
Exit="Avsluta"
16
Mixer="Mixer"
17
Browse="Bläddra"
18
19
NoNameEntered.Title="Vänligen ange ett giltigt namn"
20
NoNameEntered.Text="Du måste ange ett namn."
21
22
+ConfirmExit.Title="Avsluta OBS?"
23
+ConfirmExit.Text="OBS är aktivt just nu. Är du säker på att du vill avsluta?"
24
+
25
ConfirmRemove.Title="Bekräfta borttagning"
26
ConfirmRemove.Text="Vill du verkligen ta bort '$1'?"
27
28
29
Basic.PropertiesWindow.AutoSelectFormat="%1 (stöds inte, Välj automatiskt: %2)"
30
Basic.PropertiesWindow.SelectColor="Välj färg"
31
Basic.PropertiesWindow.SelectFont="Välj typsnitt"
32
+Basic.PropertiesWindow.ConfirmTitle="Inställningarna har ändrats"
33
+Basic.PropertiesWindow.Confirm="Det finns osparade ändringar. Vill du behålla dem?"
34
35
Basic.InteractionWindow="Interagerar med '%1'"
36
37
38
Basic.MainMenu.Edit.Order.MoveDown="Flytta &ned"
39
Basic.MainMenu.Edit.Order.MoveToTop="Lägg &överst"
40
Basic.MainMenu.Edit.Order.MoveToBottom="Lägg unders&t"
41
+Basic.MainMenu.Edit.AdvAudio="&Avancerade ljudinställningar"
42
43
Basic.MainMenu.Help="&Hjälp"
44
Basic.MainMenu.Help.Logs="&Loggfiler"
45
46
Basic.Settings.Stream.StreamType="Streamtyp"
47
48
Basic.Settings.Output="Utmatning"
49
+Basic.Settings.Output.Encoder="Kodare"
50
+Basic.Settings.Output.SelectDirectory="Välj inspelningsplats"
51
+Basic.Settings.Output.SelectFile="Välj inspelningsfil"
52
Basic.Settings.Output.Mode="Utmatningsläge"
53
-Basic.Settings.Output.Mode.Simple="Enkelt (streama och/eller spela in)"
54
-Basic.Settings.Output.Mode.Advanced="Avancerat (anpassad utmatningstyp)"
55
+Basic.Settings.Output.Mode.Simple="Simpel"
56
+Basic.Settings.Output.Mode.Adv="Avancerat"
57
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg-utmatning"
58
Basic.Settings.Output.Simple.SavePath="Sökväg till FLV-inspelningsfil"
59
Basic.Settings.Output.VideoBitrate="Bithastighet för video"
60
Basic.Settings.Output.AudioBitrate="Bithastighet för ljud"
61
62
Basic.Settings.Output.RetryDelay="Återanslutningsfördröjning (sek)"
63
Basic.Settings.Output.MaxRetries="Maximalt antal försök"
64
Basic.Settings.Output.Advanced="Aktivera avancerade kodarinställningar"
65
-Basic.Settings.Output.X264Preset="x264-förinställning"
66
-Basic.Settings.Output.CustomX264Settings="Anpassade x264 inställningar"
67
+Basic.Settings.Output.EncoderPreset="Kodarförinställning (högre = mindre CPU)"
68
+Basic.Settings.Output.CustomEncoderSettings="Inställningar för anpassade kodare"
69
Basic.Settings.Output.UseCBR="Använd konstant bithastighet"
70
+Basic.Settings.Output.UseBufferSize="Använd anpassad buffertstorlek"
71
+
72
+Basic.Settings.Output.Adv.Rescale="Skala om utmatning"
73
+Basic.Settings.Output.Adv.AudioTrack="Ljudspår"
74
+Basic.Settings.Output.Adv.Streaming="Strömning"
75
+Basic.Settings.Output.Adv.ApplyServiceSettings="Tillämpa strömningstjänstens kodarinställningar"
76
+Basic.Settings.Output.Adv.Audio.Track1="Spår 1"
77
+Basic.Settings.Output.Adv.Audio.Track2="Spår 2"
78
+Basic.Settings.Output.Adv.Audio.Track3="Spår 3"
79
+Basic.Settings.Output.Adv.Audio.Track4="Spår 4"
80
+
81
+Basic.Settings.Output.Adv.Recording="Inspelning"
82
+Basic.Settings.Output.Adv.Recording.Type="Typ"
83
+Basic.Settings.Output.Adv.Recording.Type.Standard="Standard"
84
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="Anpassad utmatning (FFmpeg)"
85
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(Använd strömkodare)"
86
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="Vanliga inspelningsformat"
87
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="Alla Filer"
88
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="Sökväg eller webbadress"
89
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="Videokodare (tomt = standard)"
90
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="Videokodar-inställningar (om något)"
91
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="Ljudkodare (tomt = standard)"
92
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="Ljudkodar-inställningar (om något)"
93
94
Basic.Settings.Video="Video"
95
Basic.Settings.Video.Adapter="Grafikkort:"
96
97
Basic.Settings.Video.InvalidResolution="Ogiltig upplösning. Måste anges som [bredd]x[höjd] (t.ex 1920x1080)"
98
Basic.Settings.Video.CurrentlyActive="Videoutmatning är aktiv. Stoppa alla utmatningar för att kunna ändra videoinställningar."
99
100
+Basic.Settings.Video.DownscaleFilter.Bilinear="Bilinjär (snabbast, men suddigt om skalad)"
101
+Basic.Settings.Video.DownscaleFilter.Bicubic="Bikubisk (Vässd skalning, 16 prover)"
102
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos (Vässd skalning, 32 prover)"
103
+
104
Basic.Settings.Audio="Ljud"
105
Basic.Settings.Audio.SampleRate="Samplingsfrekvens"
106
Basic.Settings.Audio.Channels="Kanaler"
107
108
Basic.Settings.Audio.AuxDevice2="Mikrofon/extra ljudenhet 2"
109
Basic.Settings.Audio.AuxDevice3="Mikrofon/extra ljudenhet 3"
110
111
+
112
+Basic.AdvAudio="Avancerade ljudinställningar"
113
+Basic.AdvAudio.Name="Namn"
114
+Basic.AdvAudio.Volume="Volym (%)"
115
+Basic.AdvAudio.Mono="Downmixa till Mono"
116
+Basic.AdvAudio.Panning="Panorering"
117
+Basic.AdvAudio.SyncOffset="Sync Offset (ms)"
118
+Basic.AdvAudio.AudioTracks="Spår"
119
+
120
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/th-TH.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/th-TH.ini
Changed
71
1
2
3
Language="ไทย"
4
+Region="ประเทศไทย"
5
6
OK="ตกลง"
7
Apply="นำไปใช้"
8
9
MoveUp="เลื่อนขึ้น"
10
MoveDown="เลื่อนลง"
11
Settings="ตั้งค่า"
12
+Exit="ออก"
13
Browse="เปิดหา"
14
Mono="โมโน"
15
Stereo="สเตอริโอ"
16
17
18
19
+
20
ConfirmRemove.Title="ยืนยันการลบ"
21
ConfirmRemove.Text="คุณแน่ใจแล้วหรือที่จะลบ '$1'?"
22
23
+Output.ConnectFail.Title="ไม่สามารถเชื่อมต่อได้"
24
Output.ConnectFail.ConnectFailed="ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์"
25
Output.ConnectFail.Disconnected="ถูกตัดออกจากเซิร์ฟเวอร์"
26
27
28
29
Basic.Main.DefaultSceneName.Text="ฉาก %1"
30
31
+Basic.SourceSelect.CreateNew="สร้างใหม่"
32
33
34
35
36
Basic.TransformWindow.Position="ตำแหน่ง"
37
Basic.TransformWindow.Size="ขนาด"
38
39
+Basic.TransformWindow.Alignment.TopLeft="ด้านบนซ้าย"
40
+Basic.TransformWindow.Alignment.TopCenter="ด้านบนกลาง"
41
+Basic.TransformWindow.Alignment.TopRight="ด้านบนขวา"
42
+Basic.TransformWindow.Alignment.BottomLeft="ด้านล่างซ้าย"
43
44
45
46
47
Basic.Main.StopRecording="หยุดบันทึก"
48
Basic.Main.StopStreaming="หยุดสตรีมมิ่ง"
49
50
+Basic.MainMenu.File.Exit="อ&อก"
51
52
53
Basic.MainMenu.Help.CheckForUpdates="ตรวจสอบการอัพเดต"
54
55
Basic.Settings.Stream="สตรีม"
56
Basic.Settings.Stream.StreamType="รูปแบบการสตรีม"
57
58
-Basic.Settings.Output.Mode.Simple="อย่างง่าย (สตรีม และ/หรือ บันทึก)"
59
+
60
+
61
62
Basic.Settings.Video="วีดีโอ"
63
Basic.Settings.Video.DisableAeroWindows="ปิดการใช้งาน Aero (เฉพาะ Windows เท่านั้น)"
64
Basic.Settings.Video.FPS="FPS:"
65
66
+
67
Basic.Settings.Audio="เสียง"
68
69
+
70
+
71
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/tr-TR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/tr-TR.ini
Changed
44
1
2
NoNameEntered.Title="Lütfen geçerli bir ad girin"
3
NoNameEntered.Text="İsim boş olamaz."
4
5
+
6
ConfirmRemove.Title="Kaldırmayı Onayla"
7
ConfirmRemove.Text="'$1''i kaldırmak istediğinizden emin misiniz?"
8
9
10
11
Basic.Settings.Output="Çıkış"
12
Basic.Settings.Output.Mode="Çıkış modu"
13
-Basic.Settings.Output.Mode.Simple="Basit (Yayın ve/veya kayıt)"
14
-Basic.Settings.Output.Mode.Advanced="Gelişmiş (Özel çıkış tipi)"
15
Basic.Settings.Output.Simple.SavePath="FLV Kayıt Dizini"
16
Basic.Settings.Output.VideoBitrate="Video Bithızı"
17
Basic.Settings.Output.AudioBitrate="Ses Bithızı"
18
Basic.Settings.Output.Reconnect="Otomatik Yeniden Bağlan"
19
Basic.Settings.Output.RetryDelay="Yeniden Deneme Gecikmesi (saniye)"
20
Basic.Settings.Output.MaxRetries="En fazla yeniden deneme sayısı"
21
-Basic.Settings.Output.X264Preset="x264 Hazır Ayarı"
22
-Basic.Settings.Output.CustomX264Settings="Özel x264 Ayarı"
23
Basic.Settings.Output.UseCBR="Sabit Bit Hızı Kullanın"
24
25
+
26
+
27
Basic.Settings.Video="Video"
28
Basic.Settings.Video.Adapter="Video Bağdaştırıcısi:"
29
Basic.Settings.Video.BaseResolution="Temel Çözünürlük:"
30
31
Basic.Settings.Video.InvalidResolution="Geçersiz çözünürlük değeri. [Genişlik]x[Yükseklik] şeklinde olmalıdır. (örnek 1920x1080)"
32
Basic.Settings.Video.CurrentlyActive="Video çıkışı şu anda etkin durumda. Video ayarlarını değiştirmek için lütfen bütün çıkışları kapalı duruma getirin."
33
34
+
35
Basic.Settings.Audio="Ses"
36
Basic.Settings.Audio.SampleRate="Örnekleme Sıklığı"
37
Basic.Settings.Audio.Channels="Kanallar"
38
39
Basic.Settings.Audio.AuxDevice2="Mic/yardımcı ses aygıtı 2"
40
Basic.Settings.Audio.AuxDevice3="Mic/yardımcı ses aygıtı 3"
41
42
+
43
+
44
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/uk-UA.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/uk-UA.ini
Changed
18
1
2
3
4
5
+
6
LicenseAgreement.Exit="Вихід"
7
8
9
10
11
12
13
+
14
+
15
+
16
+
17
+
18
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/zh-CN.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/zh-CN.ini
Changed
183
1
2
OK="确定"
3
Apply="应用"
4
Cancel="取消"
5
+Save="保存"
6
+Discard="舍弃"
7
Yes="是"
8
No="否"
9
Add="添加"
10
11
MoveUp="上移"
12
MoveDown="下移"
13
Settings="设置"
14
+Name="名称"
15
Exit="退出"
16
Mixer="混音器"
17
Browse="浏览"
18
19
NameExists.Title="名称已存在"
20
NameExists.Text="该名称已被使用"
21
22
+NoNameEntered.Title="请输入一个有效的名称"
23
NoNameEntered.Text="您不能使用空白名称。"
24
25
+ConfirmExit.Title="退出OBS?"
26
+ConfirmExit.Text="OBS当前是活跃的. 你确定要退出吗?"
27
+
28
ConfirmRemove.Title="确认移除"
29
ConfirmRemove.Text="确实要删除 '$1' 吗?"
30
31
Output.ConnectFail.Title="连接失败"
32
Output.ConnectFail.BadPath="无效的路径或URL。请检查您的设置以确认它们是有效的。"
33
Output.ConnectFail.ConnectFailed="无法连接到服务器"
34
+Output.ConnectFail.InvalidStream="无法访问指定的通道或流密钥. 这可能是因为 密钥/通道 是无效的, 活着因为服务认为你已经登录了."
35
Output.ConnectFail.Error="试图连接到服务器时出现意外的错误。详细信息记录在日志文件中。"
36
Output.ConnectFail.Disconnected="已从服务器断开。"
37
38
39
LicenseAgreement.IAgree="我同意"
40
LicenseAgreement.Exit="退出"
41
42
+Remux.SourceFile="OBS 录像"
43
+Remux.TargetFile="目标文件"
44
+Remux.Remux="重新封装"
45
+Remux.RecordingPattern="OBS 录像(*.flv)"
46
+Remux.FinishedTitle="转封装完成"
47
+Remux.Finished="录像已经转封装"
48
+Remux.FinishedError="录像已经转封装, 但是文件可能不完整."
49
+Remux.SelectRecording="选择OBS录像 ..."
50
+Remux.SelectTarget="选择目标文件 ..."
51
+Remux.FileExistsTitle="目标文件已存在"
52
+Remux.FileExists="目标文件存在,你想要替换它吗?"
53
+Remux.ExitUnfinishedTitle="转封装在进行中"
54
+Remux.ExitUnfinished="转封装没有完成, 现在停止可能使目标文件不可用.\n你确定要停止转封装吗?"
55
56
UpdateAvailable="版本升级"
57
UpdateAvailable.Text="新的版本 %1.%2.%3 已可用。<a href='%4'> 点击这里下载</a>"
58
59
Basic.SourceSelect.AddExisting="添加现有"
60
61
Basic.PropertiesWindow="属性 '%1'"
62
+Basic.PropertiesWindow.AutoSelectFormat="%1 (不支持; 自动选择: %2)"
63
Basic.PropertiesWindow.SelectColor="选择颜色"
64
+Basic.PropertiesWindow.SelectFont="选择字体"
65
+Basic.PropertiesWindow.ConfirmTitle="设置已更改"
66
+Basic.PropertiesWindow.Confirm="有未保存的更改. 你想要保存他们吗?"
67
68
+Basic.InteractionWindow="与'%1'交互"
69
70
Basic.StatusBar.Reconnecting="已断开连接,正在重连(尝试 %1)"
71
Basic.StatusBar.ReconnectSuccessful="重连成功"
72
73
Basic.MainMenu.File="& 文件"
74
Basic.MainMenu.File.Export="& 导出"
75
Basic.MainMenu.File.Import="& 导入"
76
+Basic.MainMenu.File.ShowRecordings="显示 & 录像"
77
+Basic.MainMenu.File.Remux="转&封装 录像"
78
Basic.MainMenu.File.Settings="& 设置"
79
Basic.MainMenu.File.Exit="退出(&X)"
80
81
82
Basic.MainMenu.Edit.Order.MoveDown="下移"
83
Basic.MainMenu.Edit.Order.MoveToTop="移至顶部"
84
Basic.MainMenu.Edit.Order.MoveToBottom="移至底部"
85
+Basic.MainMenu.Edit.AdvAudio="&高级音频属性"
86
87
Basic.MainMenu.Help="& 帮助"
88
Basic.MainMenu.Help.Logs="& 日志文件"
89
+Basic.MainMenu.Help.Logs.ShowLogs="& 显示日志文件"
90
Basic.MainMenu.Help.Logs.UploadCurrentLog="& 上传当前日志文件"
91
Basic.MainMenu.Help.Logs.UploadLastLog="& 上传最后一个日志文件"
92
Basic.MainMenu.Help.CheckForUpdates="检查升级"
93
94
Basic.Settings.Stream.StreamType="串流类型"
95
96
Basic.Settings.Output="输出"
97
+Basic.Settings.Output.Encoder="编码器"
98
+Basic.Settings.Output.SelectDirectory="选择录像目录"
99
+Basic.Settings.Output.SelectFile="选择录像文件"
100
Basic.Settings.Output.Mode="输出模式"
101
-Basic.Settings.Output.Mode.Simple="简单 (串流和录制)"
102
-Basic.Settings.Output.Mode.Advanced="高级 (自定义输出类型)"
103
+Basic.Settings.Output.Mode.Simple="简单"
104
+Basic.Settings.Output.Mode.Adv="高级"
105
+Basic.Settings.Output.Mode.FFmpeg="FFmpeg 输出"
106
Basic.Settings.Output.Simple.SavePath="FLV 录制路径"
107
Basic.Settings.Output.VideoBitrate="视频比特率"
108
Basic.Settings.Output.AudioBitrate="音频比特率"
109
Basic.Settings.Output.Reconnect="自动重连"
110
Basic.Settings.Output.RetryDelay="重试延迟时间 (秒)"
111
Basic.Settings.Output.MaxRetries="最大重试次数"
112
+Basic.Settings.Output.Advanced="启用高级编码器设置"
113
+Basic.Settings.Output.EncoderPreset="编码器预设 (更高 = 较少的CPU占用)"
114
+Basic.Settings.Output.CustomEncoderSettings="自定义编码器设置"
115
+Basic.Settings.Output.UseCBR="使用恒定比特率"
116
+Basic.Settings.Output.UseBufferSize="使用自定义缓存大小"
117
+
118
+Basic.Settings.Output.Adv.Rescale="重新缩放输出"
119
+Basic.Settings.Output.Adv.AudioTrack="音轨"
120
+Basic.Settings.Output.Adv.Streaming="流"
121
+Basic.Settings.Output.Adv.ApplyServiceSettings="强制流服务编码器设置"
122
+Basic.Settings.Output.Adv.Audio.Track1="轨道 1"
123
+Basic.Settings.Output.Adv.Audio.Track2="轨道 2"
124
+Basic.Settings.Output.Adv.Audio.Track3="轨道 3"
125
+Basic.Settings.Output.Adv.Audio.Track4="轨道 4"
126
+
127
+Basic.Settings.Output.Adv.Recording="录像"
128
+Basic.Settings.Output.Adv.Recording.Type="类型"
129
+Basic.Settings.Output.Adv.Recording.Type.Standard="标准"
130
+Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput="自定义输出 (FFmpeg)"
131
+Basic.Settings.Output.Adv.Recording.UseStreamEncoder="(使用流编码器)"
132
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common="常见的录像格式"
133
+Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All="所有文件"
134
+Basic.Settings.Output.Adv.FFmpeg.SavePathURL="文件路径或 URL"
135
+Basic.Settings.Output.Adv.FFmpeg.VEncoder="视频编码器 (空白 = 默认值)"
136
+Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings="视频编码器设置 (如果有)"
137
+Basic.Settings.Output.Adv.FFmpeg.AEncoder="音频编码器 (空白 = 默认值)"
138
+Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings="视频编码器设置 (如果有)"
139
140
Basic.Settings.Video="视频"
141
Basic.Settings.Video.Adapter="视频适配器:"
142
Basic.Settings.Video.BaseResolution="基本分辨率:"
143
+Basic.Settings.Video.ScaledResolution="缩放分辨率"
144
+Basic.Settings.Video.DownscaleFilter="缩放过滤器"
145
Basic.Settings.Video.DisableAeroWindows="禁用 Aero (仅限 Windows)"
146
Basic.Settings.Video.FPS="每秒帧数:"
147
Basic.Settings.Video.FPSCommon="常见的 FPS 值"
148
Basic.Settings.Video.FPSInteger="整数 FPS 值"
149
+Basic.Settings.Video.FPSFraction="分数帧率值"
150
Basic.Settings.Video.Numerator="分子:"
151
Basic.Settings.Video.Denominator="分母:"
152
Basic.Settings.Video.Renderer="渲染器:"
153
Basic.Settings.Video.InvalidResolution="无效的分辨率值。必须是 [宽]x[高] (如 1920 x 1080)"
154
Basic.Settings.Video.CurrentlyActive="视频输出处于活动状态。请关闭任何输出以更改视频设置。"
155
156
+Basic.Settings.Video.DownscaleFilter.Bilinear="双直线法(最快, 但如果缩放会模糊)"
157
+Basic.Settings.Video.DownscaleFilter.Bicubic="两次立方(削尖缩放, 16 个样本)"
158
+Basic.Settings.Video.DownscaleFilter.Lanczos="Lanczos(削尖缩放, 32个样本)"
159
+
160
Basic.Settings.Audio="音频"
161
Basic.Settings.Audio.SampleRate="采样率"
162
Basic.Settings.Audio.Channels="声道"
163
164
Basic.Settings.Audio.AuxDevice2="麦克风/辅助音频设备 2"
165
Basic.Settings.Audio.AuxDevice3="麦克风/辅助音频设备 3"
166
167
+Basic.Settings.Advanced="高级"
168
+Basic.Settings.Advanced.Audio.BufferingTime="音频缓冲时间"
169
+Basic.Settings.Advanced.Video.ColorFormat="颜色格式"
170
+Basic.Settings.Advanced.Video.ColorSpace="YUV 颜色空间"
171
+Basic.Settings.Advanced.Video.ColorRange="YUV 颜色范围"
172
+Basic.Settings.Advanced.Video.ColorRange.Partial="局部"
173
+Basic.Settings.Advanced.Video.ColorRange.Full="全部"
174
+
175
+Basic.AdvAudio="高级音频属性"
176
+Basic.AdvAudio.Name="名称"
177
+Basic.AdvAudio.Volume="卷 (%)"
178
+Basic.AdvAudio.Mono="下降混合为单声道"
179
+Basic.AdvAudio.Panning="平移"
180
+Basic.AdvAudio.SyncOffset="同步偏移 (毫秒)"
181
+Basic.AdvAudio.AudioTracks="轨道"
182
+
183
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/data/locale/zh-TW.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/data/locale/zh-TW.ini
Changed
43
1
2
NoNameEntered.Title="請輸入有效的名稱"
3
NoNameEntered.Text="您使用的名稱不能為空。"
4
5
+
6
ConfirmRemove.Title="確認刪除?"
7
ConfirmRemove.Text="您確定要刪除「$1」?"
8
9
10
11
Basic.Settings.Output="輸出"
12
Basic.Settings.Output.Mode="輸出模式"
13
-Basic.Settings.Output.Mode.Simple="簡易(串流/錄製)"
14
-Basic.Settings.Output.Mode.Advanced="進階(自訂輸出模式)"
15
Basic.Settings.Output.Simple.SavePath="錄製 FLV 路徑"
16
Basic.Settings.Output.VideoBitrate="影像頻率(kbit/s)"
17
Basic.Settings.Output.AudioBitrate="音效頻率(kbit/s)"
18
19
Basic.Settings.Output.RetryDelay="重試間隔(秒)"
20
Basic.Settings.Output.MaxRetries="最大嘗試次數"
21
Basic.Settings.Output.Advanced="啓用進階編碼器設定"
22
-Basic.Settings.Output.X264Preset="x264 預設"
23
-Basic.Settings.Output.CustomX264Settings="自訂 x264 設定"
24
+
25
+
26
27
Basic.Settings.Video="影像"
28
Basic.Settings.Video.Adapter="顯示卡:"
29
30
Basic.Settings.Video.InvalidResolution="無效的解析度。 必須表達為 [寬]x[高] (例如:1920x1080)"
31
Basic.Settings.Video.CurrentlyActive="目前影像輸出進行中。 請先停止輸出以便修改影像設定。"
32
33
+
34
Basic.Settings.Audio="音效"
35
Basic.Settings.Audio.SampleRate="取樣頻率"
36
Basic.Settings.Audio.Channels="通道數"
37
38
Basic.Settings.Audio.AuxDevice2="麥克風/輸入音效 2"
39
Basic.Settings.Audio.AuxDevice3="麥克風/輸入音效 3"
40
41
+
42
+
43
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/forms/OBSBasic.ui -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/forms/OBSBasic.ui
Changed
364
1
2
<iconset resource="obs.qrc">
3
<normaloff>:/res/images/obs.png</normaloff>:/res/images/obs.png</iconset>
4
</property>
5
+ <property name="styleSheet">
6
+ <string notr="true"/>
7
+ </property>
8
<widget class="QWidget" name="centralwidget">
9
<layout class="QVBoxLayout" name="verticalLayout">
10
<item>
11
12
<property name="maximumSize">
13
<size>
14
<width>16777215</width>
15
- <height>154</height>
16
+ <height>165</height>
17
</size>
18
</property>
19
- <layout class="QHBoxLayout" name="horizontalLayout_2">
20
+ <layout class="QGridLayout" name="gridLayout">
21
<property name="leftMargin">
22
<number>0</number>
23
</property>
24
25
<property name="bottomMargin">
26
<number>0</number>
27
</property>
28
- <item>
29
+ <property name="verticalSpacing">
30
+ <number>2</number>
31
+ </property>
32
+ <item row="0" column="2">
33
+ <widget class="QWidget" name="widget_6" native="true">
34
+ <property name="sizePolicy">
35
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
36
+ <horstretch>0</horstretch>
37
+ <verstretch>0</verstretch>
38
+ </sizepolicy>
39
+ </property>
40
+ <layout class="QHBoxLayout" name="horizontalLayout">
41
+ <property name="spacing">
42
+ <number>4</number>
43
+ </property>
44
+ <property name="leftMargin">
45
+ <number>0</number>
46
+ </property>
47
+ <property name="topMargin">
48
+ <number>0</number>
49
+ </property>
50
+ <property name="rightMargin">
51
+ <number>0</number>
52
+ </property>
53
+ <property name="bottomMargin">
54
+ <number>0</number>
55
+ </property>
56
+ <item>
57
+ <widget class="QLabel" name="label_3">
58
+ <property name="sizePolicy">
59
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
60
+ <horstretch>0</horstretch>
61
+ <verstretch>0</verstretch>
62
+ </sizepolicy>
63
+ </property>
64
+ <property name="text">
65
+ <string>Mixer</string>
66
+ </property>
67
+ </widget>
68
+ </item>
69
+ <item>
70
+ <widget class="QPushButton" name="advAudioProps">
71
+ <property name="sizePolicy">
72
+ <sizepolicy hsizetype="Maximum" vsizetype="Maximum">
73
+ <horstretch>0</horstretch>
74
+ <verstretch>0</verstretch>
75
+ </sizepolicy>
76
+ </property>
77
+ <property name="maximumSize">
78
+ <size>
79
+ <width>22</width>
80
+ <height>22</height>
81
+ </size>
82
+ </property>
83
+ <property name="text">
84
+ <string notr="true"/>
85
+ </property>
86
+ <property name="icon">
87
+ <iconset resource="obs.qrc">
88
+ <normaloff>:/res/images/configuration21_16.png</normaloff>:/res/images/configuration21_16.png</iconset>
89
+ </property>
90
+ <property name="flat">
91
+ <bool>true</bool>
92
+ </property>
93
+ </widget>
94
+ </item>
95
+ </layout>
96
+ </widget>
97
+ </item>
98
+ <item row="1" column="2">
99
+ <widget class="QWidget" name="widget_4" native="true">
100
+ <layout class="QVBoxLayout" name="verticalLayout_9">
101
+ <property name="leftMargin">
102
+ <number>0</number>
103
+ </property>
104
+ <property name="topMargin">
105
+ <number>0</number>
106
+ </property>
107
+ <property name="rightMargin">
108
+ <number>0</number>
109
+ </property>
110
+ <property name="bottomMargin">
111
+ <number>0</number>
112
+ </property>
113
+ <item>
114
+ <widget class="QFrame" name="frame_4">
115
+ <property name="sizePolicy">
116
+ <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
117
+ <horstretch>0</horstretch>
118
+ <verstretch>0</verstretch>
119
+ </sizepolicy>
120
+ </property>
121
+ <property name="frameShape">
122
+ <enum>QFrame::StyledPanel</enum>
123
+ </property>
124
+ <property name="frameShadow">
125
+ <enum>QFrame::Raised</enum>
126
+ </property>
127
+ <layout class="QVBoxLayout" name="verticalLayout_7">
128
+ <property name="spacing">
129
+ <number>0</number>
130
+ </property>
131
+ <property name="leftMargin">
132
+ <number>0</number>
133
+ </property>
134
+ <property name="topMargin">
135
+ <number>0</number>
136
+ </property>
137
+ <property name="rightMargin">
138
+ <number>0</number>
139
+ </property>
140
+ <property name="bottomMargin">
141
+ <number>0</number>
142
+ </property>
143
+ <item>
144
+ <widget class="VScrollArea" name="scrollArea">
145
+ <property name="verticalScrollBarPolicy">
146
+ <enum>Qt::ScrollBarAlwaysOn</enum>
147
+ </property>
148
+ <property name="horizontalScrollBarPolicy">
149
+ <enum>Qt::ScrollBarAlwaysOff</enum>
150
+ </property>
151
+ <property name="widgetResizable">
152
+ <bool>true</bool>
153
+ </property>
154
+ <widget class="QWidget" name="volumeWidgets">
155
+ <property name="geometry">
156
+ <rect>
157
+ <x>0</x>
158
+ <y>0</y>
159
+ <width>231</width>
160
+ <height>16</height>
161
+ </rect>
162
+ </property>
163
+ <property name="sizePolicy">
164
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
165
+ <horstretch>0</horstretch>
166
+ <verstretch>0</verstretch>
167
+ </sizepolicy>
168
+ </property>
169
+ <layout class="QVBoxLayout" name="verticalLayout_6">
170
+ <property name="spacing">
171
+ <number>0</number>
172
+ </property>
173
+ <property name="leftMargin">
174
+ <number>0</number>
175
+ </property>
176
+ <property name="topMargin">
177
+ <number>0</number>
178
+ </property>
179
+ <property name="rightMargin">
180
+ <number>0</number>
181
+ </property>
182
+ <property name="bottomMargin">
183
+ <number>0</number>
184
+ </property>
185
+ </layout>
186
+ </widget>
187
+ </widget>
188
+ </item>
189
+ </layout>
190
+ </widget>
191
+ </item>
192
+ </layout>
193
+ </widget>
194
+ </item>
195
+ <item row="1" column="0">
196
<widget class="QWidget" name="widget_5" native="true">
197
<property name="sizePolicy">
198
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
199
200
<number>0</number>
201
</property>
202
<item>
203
- <widget class="QLabel" name="label">
204
- <property name="text">
205
- <string>Basic.Main.Scenes</string>
206
- </property>
207
- </widget>
208
- </item>
209
- <item>
210
<widget class="QFrame" name="frame_2">
211
<property name="sizePolicy">
212
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
213
214
</layout>
215
</widget>
216
</item>
217
- <item>
218
+ <item row="1" column="1">
219
<widget class="QWidget" name="widget_3" native="true">
220
<property name="sizePolicy">
221
<sizepolicy hsizetype="Maximum" vsizetype="Preferred">
222
223
<number>0</number>
224
</property>
225
<item>
226
- <widget class="QLabel" name="label_2">
227
- <property name="text">
228
- <string>Basic.Main.Sources</string>
229
- </property>
230
- </widget>
231
- </item>
232
- <item>
233
<widget class="QFrame" name="frame_3">
234
<property name="sizePolicy">
235
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
236
237
</layout>
238
</widget>
239
</item>
240
- <item>
241
- <widget class="QWidget" name="widget_4" native="true">
242
- <layout class="QVBoxLayout" name="verticalLayout_9">
243
- <property name="leftMargin">
244
- <number>0</number>
245
- </property>
246
- <property name="topMargin">
247
- <number>0</number>
248
- </property>
249
- <property name="rightMargin">
250
- <number>0</number>
251
- </property>
252
- <property name="bottomMargin">
253
- <number>0</number>
254
- </property>
255
- <item>
256
- <widget class="QLabel" name="label_3">
257
- <property name="text">
258
- <string>Mixer</string>
259
- </property>
260
- </widget>
261
- </item>
262
- <item>
263
- <widget class="VScrollArea" name="scrollArea">
264
- <property name="verticalScrollBarPolicy">
265
- <enum>Qt::ScrollBarAlwaysOn</enum>
266
- </property>
267
- <property name="horizontalScrollBarPolicy">
268
- <enum>Qt::ScrollBarAlwaysOff</enum>
269
- </property>
270
- <property name="widgetResizable">
271
- <bool>true</bool>
272
- </property>
273
- <widget class="QWidget" name="volumeWidgets">
274
- <property name="geometry">
275
- <rect>
276
- <x>0</x>
277
- <y>0</y>
278
- <width>216</width>
279
- <height>16</height>
280
- </rect>
281
- </property>
282
- <property name="sizePolicy">
283
- <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
284
- <horstretch>0</horstretch>
285
- <verstretch>0</verstretch>
286
- </sizepolicy>
287
- </property>
288
- <layout class="QVBoxLayout" name="verticalLayout_6">
289
- <property name="spacing">
290
- <number>0</number>
291
- </property>
292
- <property name="leftMargin">
293
- <number>0</number>
294
- </property>
295
- <property name="topMargin">
296
- <number>0</number>
297
- </property>
298
- <property name="rightMargin">
299
- <number>0</number>
300
- </property>
301
- <property name="bottomMargin">
302
- <number>0</number>
303
- </property>
304
- </layout>
305
- </widget>
306
- </widget>
307
- </item>
308
- </layout>
309
- </widget>
310
- </item>
311
- <item alignment="Qt::AlignTop">
312
+ <item row="1" column="3" alignment="Qt::AlignTop">
313
<widget class="QWidget" name="widget_2" native="true">
314
<property name="sizePolicy">
315
<sizepolicy hsizetype="Maximum" vsizetype="Minimum">
316
317
</layout>
318
</widget>
319
</item>
320
+ <item row="0" column="1">
321
+ <widget class="QLabel" name="label_2">
322
+ <property name="text">
323
+ <string>Basic.Main.Sources</string>
324
+ </property>
325
+ </widget>
326
+ </item>
327
+ <item row="0" column="0">
328
+ <widget class="QLabel" name="label">
329
+ <property name="text">
330
+ <string>Basic.Main.Scenes</string>
331
+ </property>
332
+ </widget>
333
+ </item>
334
</layout>
335
</widget>
336
</item>
337
338
<x>0</x>
339
<y>0</y>
340
<width>927</width>
341
- <height>26</height>
342
+ <height>21</height>
343
</rect>
344
</property>
345
<widget class="QMenu" name="menu_File">
346
347
</property>
348
</action>
349
<action name="action_Open">
350
+ <property name="enabled">
351
+ <bool>false</bool>
352
+ </property>
353
<property name="text">
354
<string>Basic.MainMenu.File.Export</string>
355
</property>
356
</action>
357
<action name="action_Save">
358
+ <property name="enabled">
359
+ <bool>false</bool>
360
+ </property>
361
<property name="text">
362
<string>Basic.MainMenu.File.Import</string>
363
</property>
364
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/forms/OBSBasicSettings.ui -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/forms/OBSBasicSettings.ui
Changed
1848
1
2
<normaloff>:/settings/images/settings/video-display-3.png</normaloff>:/settings/images/settings/video-display-3.png</iconset>
3
</property>
4
</item>
5
+ <item>
6
+ <property name="text">
7
+ <string>Basic.Settings.Advanced</string>
8
+ </property>
9
+ <property name="icon">
10
+ <iconset resource="obs.qrc">
11
+ <normaloff>:/settings/images/settings/advanced.png</normaloff>:/settings/images/settings/advanced.png</iconset>
12
+ </property>
13
+ </item>
14
</widget>
15
</item>
16
<item>
17
18
</property>
19
</spacer>
20
</item>
21
- <item row="1" column="1">
22
- <widget class="QComboBox" name="language"/>
23
- </item>
24
<item row="1" column="0">
25
<widget class="QLabel" name="label">
26
<property name="minimumSize">
27
28
</property>
29
</widget>
30
</item>
31
+ <item row="1" column="1">
32
+ <widget class="QComboBox" name="language"/>
33
+ </item>
34
</layout>
35
</widget>
36
<widget class="QWidget" name="streamPage">
37
38
<item row="0" column="1">
39
<widget class="QComboBox" name="outputMode">
40
<property name="enabled">
41
- <bool>false</bool>
42
+ <bool>true</bool>
43
</property>
44
<property name="sizePolicy">
45
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
46
47
</item>
48
<item>
49
<property name="text">
50
- <string>Basic.Settings.Output.Mode.Custom</string>
51
+ <string>Basic.Settings.Output.Mode.Adv</string>
52
</property>
53
</item>
54
</widget>
55
56
</property>
57
</widget>
58
</item>
59
+ <item row="4" column="0">
60
+ <widget class="QLabel" name="label_17">
61
+ <property name="text">
62
+ <string>Basic.Settings.Output.RetryDelay</string>
63
+ </property>
64
+ </widget>
65
+ </item>
66
<item row="4" column="1">
67
<widget class="QSpinBox" name="simpleOutRetryDelay">
68
<property name="maximum">
69
70
</property>
71
</widget>
72
</item>
73
+ <item row="5" column="0">
74
+ <widget class="QLabel" name="label_22">
75
+ <property name="text">
76
+ <string>Basic.Settings.Output.MaxRetries</string>
77
+ </property>
78
+ </widget>
79
+ </item>
80
<item row="5" column="1">
81
<widget class="QSpinBox" name="simpleOutMaxRetries">
82
<property name="minimum">
83
84
</property>
85
</widget>
86
</item>
87
- <item row="4" column="0">
88
- <widget class="QLabel" name="label_17">
89
- <property name="text">
90
- <string>Basic.Settings.Output.RetryDelay</string>
91
- </property>
92
- </widget>
93
- </item>
94
- <item row="5" column="0">
95
- <widget class="QLabel" name="label_22">
96
- <property name="text">
97
- <string>Basic.Settings.Output.MaxRetries</string>
98
- </property>
99
- </widget>
100
- </item>
101
<item row="6" column="1">
102
<widget class="QCheckBox" name="simpleOutAdvanced">
103
<property name="text">
104
105
</property>
106
</widget>
107
</item>
108
- <item row="9" column="1">
109
- <widget class="QLineEdit" name="simpleOutCustomX264"/>
110
- </item>
111
- <item row="9" column="0">
112
- <widget class="QLabel" name="label_23">
113
+ <item row="7" column="1">
114
+ <widget class="QCheckBox" name="simpleOutUseCBR">
115
<property name="text">
116
- <string>Basic.Settings.Output.CustomX264Settings</string>
117
+ <string>Basic.Settings.Output.UseCBR</string>
118
+ </property>
119
+ <property name="checked">
120
+ <bool>true</bool>
121
</property>
122
</widget>
123
</item>
124
125
<bool>true</bool>
126
</property>
127
<property name="text">
128
- <string>Basic.Settings.Output.X264Preset</string>
129
+ <string>Basic.Settings.Output.EncoderPreset</string>
130
</property>
131
</widget>
132
</item>
133
134
</item>
135
</widget>
136
</item>
137
- <item row="7" column="1">
138
- <widget class="QCheckBox" name="simpleOutUseCBR">
139
+ <item row="9" column="0">
140
+ <widget class="QCheckBox" name="simpleOutUseBufsize">
141
+ <property name="sizePolicy">
142
+ <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
143
+ <horstretch>0</horstretch>
144
+ <verstretch>0</verstretch>
145
+ </sizepolicy>
146
+ </property>
147
+ <property name="layoutDirection">
148
+ <enum>Qt::RightToLeft</enum>
149
+ </property>
150
<property name="text">
151
- <string>Basic.Settings.Output.UseCBR</string>
152
+ <string>Basic.Settings.Output.UseBufferSize</string>
153
</property>
154
- <property name="checked">
155
- <bool>true</bool>
156
+ </widget>
157
+ </item>
158
+ <item row="9" column="1">
159
+ <widget class="QSpinBox" name="simpleOutVBufsize">
160
+ <property name="enabled">
161
+ <bool>false</bool>
162
+ </property>
163
+ <property name="minimum">
164
+ <number>0</number>
165
+ </property>
166
+ <property name="maximum">
167
+ <number>1000000</number>
168
+ </property>
169
+ <property name="value">
170
+ <number>2000</number>
171
+ </property>
172
+ </widget>
173
+ </item>
174
+ <item row="10" column="0">
175
+ <widget class="QLabel" name="label_23">
176
+ <property name="text">
177
+ <string>Basic.Settings.Output.CustomEncoderSettings</string>
178
</property>
179
</widget>
180
</item>
181
+ <item row="10" column="1">
182
+ <widget class="QLineEdit" name="simpleOutCustom"/>
183
+ </item>
184
</layout>
185
</widget>
186
</item>
187
188
</item>
189
</layout>
190
</widget>
191
- <widget class="QWidget" name="customOutputsPage"/>
192
+ <widget class="QWidget" name="advOutputsPage">
193
+ <layout class="QVBoxLayout" name="verticalLayout_8">
194
+ <property name="leftMargin">
195
+ <number>0</number>
196
+ </property>
197
+ <property name="topMargin">
198
+ <number>0</number>
199
+ </property>
200
+ <property name="rightMargin">
201
+ <number>0</number>
202
+ </property>
203
+ <property name="bottomMargin">
204
+ <number>0</number>
205
+ </property>
206
+ <item>
207
+ <widget class="QTabWidget" name="advOutTabs">
208
+ <property name="currentIndex">
209
+ <number>0</number>
210
+ </property>
211
+ <property name="usesScrollButtons">
212
+ <bool>true</bool>
213
+ </property>
214
+ <widget class="QWidget" name="advOutputStreamTab">
215
+ <attribute name="title">
216
+ <string>Basic.Settings.Output.Adv.Streaming</string>
217
+ </attribute>
218
+ <layout class="QVBoxLayout" name="verticalLayout_12">
219
+ <property name="leftMargin">
220
+ <number>9</number>
221
+ </property>
222
+ <property name="topMargin">
223
+ <number>0</number>
224
+ </property>
225
+ <property name="rightMargin">
226
+ <number>9</number>
227
+ </property>
228
+ <property name="bottomMargin">
229
+ <number>9</number>
230
+ </property>
231
+ <item alignment="Qt::AlignTop">
232
+ <widget class="QWidget" name="widget_4" native="true">
233
+ <layout class="QVBoxLayout" name="verticalLayout_14">
234
+ <property name="spacing">
235
+ <number>0</number>
236
+ </property>
237
+ <property name="leftMargin">
238
+ <number>0</number>
239
+ </property>
240
+ <property name="topMargin">
241
+ <number>0</number>
242
+ </property>
243
+ <property name="rightMargin">
244
+ <number>0</number>
245
+ </property>
246
+ <property name="bottomMargin">
247
+ <number>0</number>
248
+ </property>
249
+ <item>
250
+ <widget class="QWidget" name="advOutTopContainer" native="true">
251
+ <property name="sizePolicy">
252
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
253
+ <horstretch>0</horstretch>
254
+ <verstretch>0</verstretch>
255
+ </sizepolicy>
256
+ </property>
257
+ <layout class="QFormLayout" name="formLayout_7">
258
+ <property name="fieldGrowthPolicy">
259
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
260
+ </property>
261
+ <property name="labelAlignment">
262
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
263
+ </property>
264
+ <item row="0" column="1">
265
+ <widget class="QCheckBox" name="advOutReconnect">
266
+ <property name="text">
267
+ <string>Basic.Settings.Output.Reconnect</string>
268
+ </property>
269
+ <property name="checked">
270
+ <bool>true</bool>
271
+ </property>
272
+ </widget>
273
+ </item>
274
+ <item row="1" column="0">
275
+ <widget class="QLabel" name="label_27">
276
+ <property name="minimumSize">
277
+ <size>
278
+ <width>170</width>
279
+ <height>0</height>
280
+ </size>
281
+ </property>
282
+ <property name="text">
283
+ <string>Basic.Settings.Output.RetryDelay</string>
284
+ </property>
285
+ <property name="alignment">
286
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
287
+ </property>
288
+ </widget>
289
+ </item>
290
+ <item row="1" column="1">
291
+ <widget class="QSpinBox" name="advOutRetryDelay">
292
+ <property name="maximum">
293
+ <number>30</number>
294
+ </property>
295
+ </widget>
296
+ </item>
297
+ <item row="2" column="0">
298
+ <widget class="QLabel" name="label_26">
299
+ <property name="text">
300
+ <string>Basic.Settings.Output.MaxRetries</string>
301
+ </property>
302
+ </widget>
303
+ </item>
304
+ <item row="2" column="1">
305
+ <widget class="QSpinBox" name="advOutMaxRetries">
306
+ <property name="minimum">
307
+ <number>1</number>
308
+ </property>
309
+ <property name="maximum">
310
+ <number>10000</number>
311
+ </property>
312
+ </widget>
313
+ </item>
314
+ <item row="5" column="0">
315
+ <widget class="QLabel" name="advOutEncLabel">
316
+ <property name="text">
317
+ <string>Basic.Settings.Output.Encoder</string>
318
+ </property>
319
+ </widget>
320
+ </item>
321
+ <item row="5" column="1">
322
+ <widget class="QComboBox" name="advOutEncoder"/>
323
+ </item>
324
+ <item row="7" column="0">
325
+ <widget class="QCheckBox" name="advOutUseRescale">
326
+ <property name="sizePolicy">
327
+ <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
328
+ <horstretch>0</horstretch>
329
+ <verstretch>0</verstretch>
330
+ </sizepolicy>
331
+ </property>
332
+ <property name="layoutDirection">
333
+ <enum>Qt::RightToLeft</enum>
334
+ </property>
335
+ <property name="text">
336
+ <string>Basic.Settings.Output.Adv.Rescale</string>
337
+ </property>
338
+ </widget>
339
+ </item>
340
+ <item row="7" column="1">
341
+ <widget class="QComboBox" name="advOutRescale">
342
+ <property name="enabled">
343
+ <bool>false</bool>
344
+ </property>
345
+ <property name="editable">
346
+ <bool>true</bool>
347
+ </property>
348
+ </widget>
349
+ </item>
350
+ <item row="4" column="0">
351
+ <widget class="QLabel" name="label_28">
352
+ <property name="text">
353
+ <string>Basic.Settings.Output.Adv.AudioTrack</string>
354
+ </property>
355
+ </widget>
356
+ </item>
357
+ <item row="4" column="1">
358
+ <widget class="QWidget" name="widget_8" native="true">
359
+ <property name="sizePolicy">
360
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
361
+ <horstretch>0</horstretch>
362
+ <verstretch>0</verstretch>
363
+ </sizepolicy>
364
+ </property>
365
+ <layout class="QHBoxLayout" name="horizontalLayout_7">
366
+ <property name="leftMargin">
367
+ <number>0</number>
368
+ </property>
369
+ <property name="topMargin">
370
+ <number>0</number>
371
+ </property>
372
+ <property name="rightMargin">
373
+ <number>0</number>
374
+ </property>
375
+ <property name="bottomMargin">
376
+ <number>0</number>
377
+ </property>
378
+ <item>
379
+ <widget class="QRadioButton" name="advOutTrack1">
380
+ <property name="text">
381
+ <string notr="true">1</string>
382
+ </property>
383
+ <property name="checked">
384
+ <bool>true</bool>
385
+ </property>
386
+ </widget>
387
+ </item>
388
+ <item>
389
+ <widget class="QRadioButton" name="advOutTrack2">
390
+ <property name="text">
391
+ <string notr="true">2</string>
392
+ </property>
393
+ </widget>
394
+ </item>
395
+ <item>
396
+ <widget class="QRadioButton" name="advOutTrack3">
397
+ <property name="text">
398
+ <string notr="true">3</string>
399
+ </property>
400
+ </widget>
401
+ </item>
402
+ <item>
403
+ <widget class="QRadioButton" name="advOutTrack4">
404
+ <property name="text">
405
+ <string notr="true">4</string>
406
+ </property>
407
+ </widget>
408
+ </item>
409
+ </layout>
410
+ </widget>
411
+ </item>
412
+ <item row="6" column="1">
413
+ <widget class="QCheckBox" name="advOutApplyService">
414
+ <property name="text">
415
+ <string>Basic.Settings.Output.Adv.ApplyServiceSettings</string>
416
+ </property>
417
+ <property name="checked">
418
+ <bool>true</bool>
419
+ </property>
420
+ </widget>
421
+ </item>
422
+ </layout>
423
+ </widget>
424
+ </item>
425
+ </layout>
426
+ </widget>
427
+ </item>
428
+ </layout>
429
+ </widget>
430
+ <widget class="QWidget" name="advOutputRecordTab">
431
+ <attribute name="title">
432
+ <string>Basic.Settings.Output.Adv.Recording</string>
433
+ </attribute>
434
+ <layout class="QVBoxLayout" name="verticalLayout_11">
435
+ <property name="leftMargin">
436
+ <number>9</number>
437
+ </property>
438
+ <property name="topMargin">
439
+ <number>9</number>
440
+ </property>
441
+ <property name="rightMargin">
442
+ <number>9</number>
443
+ </property>
444
+ <property name="bottomMargin">
445
+ <number>9</number>
446
+ </property>
447
+ <item>
448
+ <widget class="QWidget" name="advOutRecTypeContainer" native="true">
449
+ <layout class="QFormLayout" name="formLayout_9">
450
+ <property name="fieldGrowthPolicy">
451
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
452
+ </property>
453
+ <property name="labelAlignment">
454
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
455
+ </property>
456
+ <property name="topMargin">
457
+ <number>0</number>
458
+ </property>
459
+ <property name="bottomMargin">
460
+ <number>0</number>
461
+ </property>
462
+ <item row="0" column="0">
463
+ <widget class="QLabel" name="label_31">
464
+ <property name="minimumSize">
465
+ <size>
466
+ <width>170</width>
467
+ <height>0</height>
468
+ </size>
469
+ </property>
470
+ <property name="text">
471
+ <string>Basic.Settings.Output.Adv.Recording.Type</string>
472
+ </property>
473
+ <property name="alignment">
474
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
475
+ </property>
476
+ </widget>
477
+ </item>
478
+ <item row="0" column="1">
479
+ <widget class="QComboBox" name="advOutRecType">
480
+ <item>
481
+ <property name="text">
482
+ <string>Basic.Settings.Output.Adv.Recording.Type.Standard</string>
483
+ </property>
484
+ </item>
485
+ <item>
486
+ <property name="text">
487
+ <string>Basic.Settings.Output.Adv.Recording.Type.FFmpegOutput</string>
488
+ </property>
489
+ </item>
490
+ </widget>
491
+ </item>
492
+ </layout>
493
+ </widget>
494
+ </item>
495
+ <item>
496
+ <widget class="Line" name="line_3">
497
+ <property name="orientation">
498
+ <enum>Qt::Horizontal</enum>
499
+ </property>
500
+ </widget>
501
+ </item>
502
+ <item>
503
+ <widget class="QStackedWidget" name="stackedWidget">
504
+ <property name="currentIndex">
505
+ <number>0</number>
506
+ </property>
507
+ <widget class="QWidget" name="advOutRecStandard">
508
+ <layout class="QVBoxLayout" name="verticalLayout_13">
509
+ <property name="leftMargin">
510
+ <number>0</number>
511
+ </property>
512
+ <property name="topMargin">
513
+ <number>0</number>
514
+ </property>
515
+ <property name="rightMargin">
516
+ <number>0</number>
517
+ </property>
518
+ <property name="bottomMargin">
519
+ <number>0</number>
520
+ </property>
521
+ <item alignment="Qt::AlignTop">
522
+ <widget class="QWidget" name="widget_7" native="true">
523
+ <layout class="QVBoxLayout" name="verticalLayout_15">
524
+ <property name="leftMargin">
525
+ <number>0</number>
526
+ </property>
527
+ <property name="topMargin">
528
+ <number>0</number>
529
+ </property>
530
+ <property name="rightMargin">
531
+ <number>0</number>
532
+ </property>
533
+ <property name="bottomMargin">
534
+ <number>0</number>
535
+ </property>
536
+ <item>
537
+ <widget class="QWidget" name="advOutRecTopContainer" native="true">
538
+ <property name="sizePolicy">
539
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
540
+ <horstretch>0</horstretch>
541
+ <verstretch>0</verstretch>
542
+ </sizepolicy>
543
+ </property>
544
+ <layout class="QFormLayout" name="formLayout_16">
545
+ <property name="fieldGrowthPolicy">
546
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
547
+ </property>
548
+ <property name="labelAlignment">
549
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
550
+ </property>
551
+ <property name="topMargin">
552
+ <number>0</number>
553
+ </property>
554
+ <item row="0" column="0">
555
+ <widget class="QLabel" name="label_32">
556
+ <property name="sizePolicy">
557
+ <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
558
+ <horstretch>0</horstretch>
559
+ <verstretch>0</verstretch>
560
+ </sizepolicy>
561
+ </property>
562
+ <property name="minimumSize">
563
+ <size>
564
+ <width>170</width>
565
+ <height>0</height>
566
+ </size>
567
+ </property>
568
+ <property name="text">
569
+ <string>Basic.Settings.Output.Simple.SavePath</string>
570
+ </property>
571
+ <property name="alignment">
572
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
573
+ </property>
574
+ </widget>
575
+ </item>
576
+ <item row="0" column="1">
577
+ <layout class="QHBoxLayout" name="horizontalLayout_6">
578
+ <item>
579
+ <widget class="QLineEdit" name="advOutRecPath">
580
+ <property name="enabled">
581
+ <bool>true</bool>
582
+ </property>
583
+ </widget>
584
+ </item>
585
+ <item>
586
+ <widget class="QPushButton" name="advOutRecPathBrowse">
587
+ <property name="enabled">
588
+ <bool>true</bool>
589
+ </property>
590
+ <property name="text">
591
+ <string>Browse</string>
592
+ </property>
593
+ </widget>
594
+ </item>
595
+ </layout>
596
+ </item>
597
+ <item row="2" column="0">
598
+ <widget class="QLabel" name="advOutRecEncLabel">
599
+ <property name="text">
600
+ <string>Basic.Settings.Output.Encoder</string>
601
+ </property>
602
+ </widget>
603
+ </item>
604
+ <item row="2" column="1">
605
+ <widget class="QComboBox" name="advOutRecEncoder"/>
606
+ </item>
607
+ <item row="3" column="0">
608
+ <widget class="QCheckBox" name="advOutRecUseRescale">
609
+ <property name="sizePolicy">
610
+ <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
611
+ <horstretch>0</horstretch>
612
+ <verstretch>0</verstretch>
613
+ </sizepolicy>
614
+ </property>
615
+ <property name="layoutDirection">
616
+ <enum>Qt::RightToLeft</enum>
617
+ </property>
618
+ <property name="text">
619
+ <string>Basic.Settings.Output.Adv.Rescale</string>
620
+ </property>
621
+ </widget>
622
+ </item>
623
+ <item row="3" column="1">
624
+ <widget class="QWidget" name="advOutRecRescaleContainer" native="true">
625
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
626
+ <property name="leftMargin">
627
+ <number>0</number>
628
+ </property>
629
+ <property name="topMargin">
630
+ <number>0</number>
631
+ </property>
632
+ <property name="rightMargin">
633
+ <number>0</number>
634
+ </property>
635
+ <property name="bottomMargin">
636
+ <number>0</number>
637
+ </property>
638
+ <item>
639
+ <widget class="QComboBox" name="advOutRecRescale">
640
+ <property name="enabled">
641
+ <bool>false</bool>
642
+ </property>
643
+ <property name="editable">
644
+ <bool>true</bool>
645
+ </property>
646
+ </widget>
647
+ </item>
648
+ </layout>
649
+ </widget>
650
+ </item>
651
+ <item row="1" column="0">
652
+ <widget class="QLabel" name="label_29">
653
+ <property name="text">
654
+ <string>Basic.Settings.Output.Adv.AudioTrack</string>
655
+ </property>
656
+ </widget>
657
+ </item>
658
+ <item row="1" column="1">
659
+ <widget class="QWidget" name="widget_9" native="true">
660
+ <property name="sizePolicy">
661
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
662
+ <horstretch>0</horstretch>
663
+ <verstretch>0</verstretch>
664
+ </sizepolicy>
665
+ </property>
666
+ <layout class="QHBoxLayout" name="horizontalLayout_9">
667
+ <property name="leftMargin">
668
+ <number>0</number>
669
+ </property>
670
+ <property name="topMargin">
671
+ <number>0</number>
672
+ </property>
673
+ <property name="rightMargin">
674
+ <number>0</number>
675
+ </property>
676
+ <property name="bottomMargin">
677
+ <number>0</number>
678
+ </property>
679
+ <item>
680
+ <widget class="QRadioButton" name="advOutRecTrack1">
681
+ <property name="text">
682
+ <string notr="true">1</string>
683
+ </property>
684
+ <property name="checked">
685
+ <bool>true</bool>
686
+ </property>
687
+ </widget>
688
+ </item>
689
+ <item>
690
+ <widget class="QRadioButton" name="advOutRecTrack2">
691
+ <property name="text">
692
+ <string notr="true">2</string>
693
+ </property>
694
+ </widget>
695
+ </item>
696
+ <item>
697
+ <widget class="QRadioButton" name="advOutRecTrack3">
698
+ <property name="text">
699
+ <string notr="true">3</string>
700
+ </property>
701
+ </widget>
702
+ </item>
703
+ <item>
704
+ <widget class="QRadioButton" name="advOutRecTrack4">
705
+ <property name="text">
706
+ <string notr="true">4</string>
707
+ </property>
708
+ </widget>
709
+ </item>
710
+ </layout>
711
+ </widget>
712
+ </item>
713
+ </layout>
714
+ </widget>
715
+ </item>
716
+ </layout>
717
+ </widget>
718
+ </item>
719
+ </layout>
720
+ </widget>
721
+ <widget class="QWidget" name="advOutRecFFmpeg">
722
+ <layout class="QFormLayout" name="formLayout_15">
723
+ <property name="fieldGrowthPolicy">
724
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
725
+ </property>
726
+ <property name="labelAlignment">
727
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
728
+ </property>
729
+ <property name="topMargin">
730
+ <number>0</number>
731
+ </property>
732
+ <item row="0" column="0">
733
+ <widget class="QLabel" name="label_36">
734
+ <property name="sizePolicy">
735
+ <sizepolicy hsizetype="Preferred" vsizetype="Expanding">
736
+ <horstretch>0</horstretch>
737
+ <verstretch>0</verstretch>
738
+ </sizepolicy>
739
+ </property>
740
+ <property name="minimumSize">
741
+ <size>
742
+ <width>170</width>
743
+ <height>0</height>
744
+ </size>
745
+ </property>
746
+ <property name="text">
747
+ <string>Basic.Settings.Output.Adv.FFmpeg.SavePathURL</string>
748
+ </property>
749
+ <property name="alignment">
750
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
751
+ </property>
752
+ </widget>
753
+ </item>
754
+ <item row="0" column="1">
755
+ <layout class="QHBoxLayout" name="horizontalLayout_8">
756
+ <item>
757
+ <widget class="QLineEdit" name="advOutFFURL">
758
+ <property name="enabled">
759
+ <bool>true</bool>
760
+ </property>
761
+ </widget>
762
+ </item>
763
+ <item>
764
+ <widget class="QPushButton" name="advOutFFPathBrowse">
765
+ <property name="enabled">
766
+ <bool>true</bool>
767
+ </property>
768
+ <property name="text">
769
+ <string>Browse</string>
770
+ </property>
771
+ </widget>
772
+ </item>
773
+ </layout>
774
+ </item>
775
+ <item row="1" column="0">
776
+ <widget class="QLabel" name="label_40">
777
+ <property name="text">
778
+ <string>Basic.Settings.Output.VideoBitrate</string>
779
+ </property>
780
+ </widget>
781
+ </item>
782
+ <item row="1" column="1">
783
+ <widget class="QSpinBox" name="advOutFFVBitrate">
784
+ <property name="minimum">
785
+ <number>0</number>
786
+ </property>
787
+ <property name="maximum">
788
+ <number>1000000000</number>
789
+ </property>
790
+ <property name="value">
791
+ <number>2500</number>
792
+ </property>
793
+ </widget>
794
+ </item>
795
+ <item row="3" column="0">
796
+ <widget class="QLabel" name="label_37">
797
+ <property name="text">
798
+ <string>Basic.Settings.Output.Adv.FFmpeg.VEncoder</string>
799
+ </property>
800
+ </widget>
801
+ </item>
802
+ <item row="3" column="1">
803
+ <widget class="QLineEdit" name="advOutFFVEncoder"/>
804
+ </item>
805
+ <item row="4" column="0">
806
+ <widget class="QLabel" name="label_38">
807
+ <property name="text">
808
+ <string>Basic.Settings.Output.Adv.FFmpeg.VEncoderSettings</string>
809
+ </property>
810
+ </widget>
811
+ </item>
812
+ <item row="4" column="1">
813
+ <widget class="QLineEdit" name="advOutFFVCfg"/>
814
+ </item>
815
+ <item row="5" column="0">
816
+ <widget class="QLabel" name="label_41">
817
+ <property name="text">
818
+ <string>Basic.Settings.Output.AudioBitrate</string>
819
+ </property>
820
+ </widget>
821
+ </item>
822
+ <item row="5" column="1">
823
+ <widget class="QSpinBox" name="advOutFFABitrate">
824
+ <property name="minimum">
825
+ <number>32</number>
826
+ </property>
827
+ <property name="maximum">
828
+ <number>4096</number>
829
+ </property>
830
+ <property name="singleStep">
831
+ <number>16</number>
832
+ </property>
833
+ <property name="value">
834
+ <number>128</number>
835
+ </property>
836
+ </widget>
837
+ </item>
838
+ <item row="6" column="0">
839
+ <widget class="QLabel" name="label_47">
840
+ <property name="text">
841
+ <string>Basic.Settings.Output.Adv.AudioTrack</string>
842
+ </property>
843
+ </widget>
844
+ </item>
845
+ <item row="7" column="0">
846
+ <widget class="QLabel" name="label_39">
847
+ <property name="text">
848
+ <string>Basic.Settings.Output.Adv.FFmpeg.AEncoder</string>
849
+ </property>
850
+ </widget>
851
+ </item>
852
+ <item row="7" column="1">
853
+ <widget class="QLineEdit" name="advOutFFAEncoder"/>
854
+ </item>
855
+ <item row="8" column="0">
856
+ <widget class="QLabel" name="label_46">
857
+ <property name="text">
858
+ <string>Basic.Settings.Output.Adv.FFmpeg.AEncoderSettings</string>
859
+ </property>
860
+ </widget>
861
+ </item>
862
+ <item row="8" column="1">
863
+ <widget class="QLineEdit" name="advOutFFACfg"/>
864
+ </item>
865
+ <item row="2" column="0">
866
+ <widget class="QCheckBox" name="advOutFFUseRescale">
867
+ <property name="sizePolicy">
868
+ <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
869
+ <horstretch>0</horstretch>
870
+ <verstretch>0</verstretch>
871
+ </sizepolicy>
872
+ </property>
873
+ <property name="layoutDirection">
874
+ <enum>Qt::RightToLeft</enum>
875
+ </property>
876
+ <property name="text">
877
+ <string>Basic.Settings.Output.Adv.Rescale</string>
878
+ </property>
879
+ </widget>
880
+ </item>
881
+ <item row="2" column="1">
882
+ <widget class="QComboBox" name="advOutFFRescale">
883
+ <property name="enabled">
884
+ <bool>false</bool>
885
+ </property>
886
+ <property name="editable">
887
+ <bool>true</bool>
888
+ </property>
889
+ </widget>
890
+ </item>
891
+ <item row="6" column="1">
892
+ <widget class="QWidget" name="widget_10" native="true">
893
+ <property name="sizePolicy">
894
+ <sizepolicy hsizetype="Maximum" vsizetype="Preferred">
895
+ <horstretch>0</horstretch>
896
+ <verstretch>0</verstretch>
897
+ </sizepolicy>
898
+ </property>
899
+ <layout class="QHBoxLayout" name="horizontalLayout_10">
900
+ <property name="leftMargin">
901
+ <number>0</number>
902
+ </property>
903
+ <property name="topMargin">
904
+ <number>0</number>
905
+ </property>
906
+ <property name="rightMargin">
907
+ <number>0</number>
908
+ </property>
909
+ <property name="bottomMargin">
910
+ <number>0</number>
911
+ </property>
912
+ <item>
913
+ <widget class="QRadioButton" name="advOutFFTrack1">
914
+ <property name="text">
915
+ <string notr="true">1</string>
916
+ </property>
917
+ <property name="checked">
918
+ <bool>true</bool>
919
+ </property>
920
+ </widget>
921
+ </item>
922
+ <item>
923
+ <widget class="QRadioButton" name="advOutFFTrack2">
924
+ <property name="text">
925
+ <string notr="true">2</string>
926
+ </property>
927
+ </widget>
928
+ </item>
929
+ <item>
930
+ <widget class="QRadioButton" name="advOutFFTrack3">
931
+ <property name="text">
932
+ <string notr="true">3</string>
933
+ </property>
934
+ </widget>
935
+ </item>
936
+ <item>
937
+ <widget class="QRadioButton" name="advOutFFTrack4">
938
+ <property name="text">
939
+ <string notr="true">4</string>
940
+ </property>
941
+ </widget>
942
+ </item>
943
+ </layout>
944
+ </widget>
945
+ </item>
946
+ </layout>
947
+ </widget>
948
+ </widget>
949
+ </item>
950
+ </layout>
951
+ </widget>
952
+ <widget class="QWidget" name="advOutputAudioTracksTab">
953
+ <attribute name="title">
954
+ <string>Basic.Settings.Audio</string>
955
+ </attribute>
956
+ <layout class="QVBoxLayout" name="verticalLayout_9">
957
+ <property name="leftMargin">
958
+ <number>0</number>
959
+ </property>
960
+ <property name="topMargin">
961
+ <number>0</number>
962
+ </property>
963
+ <property name="rightMargin">
964
+ <number>0</number>
965
+ </property>
966
+ <property name="bottomMargin">
967
+ <number>0</number>
968
+ </property>
969
+ <item alignment="Qt::AlignTop">
970
+ <widget class="QWidget" name="widget_3" native="true">
971
+ <property name="sizePolicy">
972
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
973
+ <horstretch>0</horstretch>
974
+ <verstretch>0</verstretch>
975
+ </sizepolicy>
976
+ </property>
977
+ <layout class="QVBoxLayout" name="verticalLayout_10">
978
+ <item>
979
+ <widget class="QGroupBox" name="groupBox">
980
+ <property name="sizePolicy">
981
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
982
+ <horstretch>0</horstretch>
983
+ <verstretch>0</verstretch>
984
+ </sizepolicy>
985
+ </property>
986
+ <property name="title">
987
+ <string>Basic.Settings.Output.Adv.Audio.Track1</string>
988
+ </property>
989
+ <layout class="QFormLayout" name="formLayout_10">
990
+ <property name="fieldGrowthPolicy">
991
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
992
+ </property>
993
+ <property name="labelAlignment">
994
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
995
+ </property>
996
+ <item row="0" column="1">
997
+ <widget class="QComboBox" name="advOutTrack1Bitrate">
998
+ <property name="currentIndex">
999
+ <number>4</number>
1000
+ </property>
1001
+ <item>
1002
+ <property name="text">
1003
+ <string>32</string>
1004
+ </property>
1005
+ </item>
1006
+ <item>
1007
+ <property name="text">
1008
+ <string>64</string>
1009
+ </property>
1010
+ </item>
1011
+ <item>
1012
+ <property name="text">
1013
+ <string>96</string>
1014
+ </property>
1015
+ </item>
1016
+ <item>
1017
+ <property name="text">
1018
+ <string>128</string>
1019
+ </property>
1020
+ </item>
1021
+ <item>
1022
+ <property name="text">
1023
+ <string>160</string>
1024
+ </property>
1025
+ </item>
1026
+ <item>
1027
+ <property name="text">
1028
+ <string>192</string>
1029
+ </property>
1030
+ </item>
1031
+ <item>
1032
+ <property name="text">
1033
+ <string>256</string>
1034
+ </property>
1035
+ </item>
1036
+ <item>
1037
+ <property name="text">
1038
+ <string>320</string>
1039
+ </property>
1040
+ </item>
1041
+ </widget>
1042
+ </item>
1043
+ <item row="0" column="0">
1044
+ <widget class="QLabel" name="label_25">
1045
+ <property name="minimumSize">
1046
+ <size>
1047
+ <width>170</width>
1048
+ <height>0</height>
1049
+ </size>
1050
+ </property>
1051
+ <property name="text">
1052
+ <string>Basic.Settings.Output.AudioBitrate</string>
1053
+ </property>
1054
+ <property name="alignment">
1055
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1056
+ </property>
1057
+ </widget>
1058
+ </item>
1059
+ <item row="1" column="0">
1060
+ <widget class="QLabel" name="label_55">
1061
+ <property name="text">
1062
+ <string>Name</string>
1063
+ </property>
1064
+ </widget>
1065
+ </item>
1066
+ <item row="1" column="1">
1067
+ <widget class="QLineEdit" name="advOutTrack1Name"/>
1068
+ </item>
1069
+ </layout>
1070
+ </widget>
1071
+ </item>
1072
+ <item>
1073
+ <widget class="QGroupBox" name="groupBox_2">
1074
+ <property name="sizePolicy">
1075
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
1076
+ <horstretch>0</horstretch>
1077
+ <verstretch>0</verstretch>
1078
+ </sizepolicy>
1079
+ </property>
1080
+ <property name="title">
1081
+ <string>Basic.Settings.Output.Adv.Audio.Track2</string>
1082
+ </property>
1083
+ <layout class="QFormLayout" name="formLayout_11">
1084
+ <property name="fieldGrowthPolicy">
1085
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
1086
+ </property>
1087
+ <property name="labelAlignment">
1088
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1089
+ </property>
1090
+ <item row="0" column="0">
1091
+ <widget class="QLabel" name="label_49">
1092
+ <property name="minimumSize">
1093
+ <size>
1094
+ <width>170</width>
1095
+ <height>0</height>
1096
+ </size>
1097
+ </property>
1098
+ <property name="text">
1099
+ <string>Basic.Settings.Output.AudioBitrate</string>
1100
+ </property>
1101
+ <property name="alignment">
1102
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1103
+ </property>
1104
+ </widget>
1105
+ </item>
1106
+ <item row="0" column="1">
1107
+ <widget class="QComboBox" name="advOutTrack2Bitrate">
1108
+ <property name="currentIndex">
1109
+ <number>4</number>
1110
+ </property>
1111
+ <item>
1112
+ <property name="text">
1113
+ <string>32</string>
1114
+ </property>
1115
+ </item>
1116
+ <item>
1117
+ <property name="text">
1118
+ <string>64</string>
1119
+ </property>
1120
+ </item>
1121
+ <item>
1122
+ <property name="text">
1123
+ <string>96</string>
1124
+ </property>
1125
+ </item>
1126
+ <item>
1127
+ <property name="text">
1128
+ <string>128</string>
1129
+ </property>
1130
+ </item>
1131
+ <item>
1132
+ <property name="text">
1133
+ <string>160</string>
1134
+ </property>
1135
+ </item>
1136
+ <item>
1137
+ <property name="text">
1138
+ <string>192</string>
1139
+ </property>
1140
+ </item>
1141
+ <item>
1142
+ <property name="text">
1143
+ <string>256</string>
1144
+ </property>
1145
+ </item>
1146
+ <item>
1147
+ <property name="text">
1148
+ <string>320</string>
1149
+ </property>
1150
+ </item>
1151
+ </widget>
1152
+ </item>
1153
+ <item row="1" column="0">
1154
+ <widget class="QLabel" name="label_50">
1155
+ <property name="text">
1156
+ <string>Name</string>
1157
+ </property>
1158
+ </widget>
1159
+ </item>
1160
+ <item row="1" column="1">
1161
+ <widget class="QLineEdit" name="advOutTrack2Name"/>
1162
+ </item>
1163
+ </layout>
1164
+ </widget>
1165
+ </item>
1166
+ <item>
1167
+ <widget class="QGroupBox" name="groupBox_3">
1168
+ <property name="sizePolicy">
1169
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
1170
+ <horstretch>0</horstretch>
1171
+ <verstretch>0</verstretch>
1172
+ </sizepolicy>
1173
+ </property>
1174
+ <property name="title">
1175
+ <string>Basic.Settings.Output.Adv.Audio.Track3</string>
1176
+ </property>
1177
+ <layout class="QFormLayout" name="formLayout_12">
1178
+ <property name="fieldGrowthPolicy">
1179
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
1180
+ </property>
1181
+ <property name="labelAlignment">
1182
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1183
+ </property>
1184
+ <item row="0" column="0">
1185
+ <widget class="QLabel" name="label_51">
1186
+ <property name="minimumSize">
1187
+ <size>
1188
+ <width>170</width>
1189
+ <height>0</height>
1190
+ </size>
1191
+ </property>
1192
+ <property name="text">
1193
+ <string>Basic.Settings.Output.AudioBitrate</string>
1194
+ </property>
1195
+ <property name="alignment">
1196
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1197
+ </property>
1198
+ </widget>
1199
+ </item>
1200
+ <item row="0" column="1">
1201
+ <widget class="QComboBox" name="advOutTrack3Bitrate">
1202
+ <property name="currentIndex">
1203
+ <number>4</number>
1204
+ </property>
1205
+ <item>
1206
+ <property name="text">
1207
+ <string>32</string>
1208
+ </property>
1209
+ </item>
1210
+ <item>
1211
+ <property name="text">
1212
+ <string>64</string>
1213
+ </property>
1214
+ </item>
1215
+ <item>
1216
+ <property name="text">
1217
+ <string>96</string>
1218
+ </property>
1219
+ </item>
1220
+ <item>
1221
+ <property name="text">
1222
+ <string>128</string>
1223
+ </property>
1224
+ </item>
1225
+ <item>
1226
+ <property name="text">
1227
+ <string>160</string>
1228
+ </property>
1229
+ </item>
1230
+ <item>
1231
+ <property name="text">
1232
+ <string>192</string>
1233
+ </property>
1234
+ </item>
1235
+ <item>
1236
+ <property name="text">
1237
+ <string>256</string>
1238
+ </property>
1239
+ </item>
1240
+ <item>
1241
+ <property name="text">
1242
+ <string>320</string>
1243
+ </property>
1244
+ </item>
1245
+ </widget>
1246
+ </item>
1247
+ <item row="1" column="0">
1248
+ <widget class="QLabel" name="label_52">
1249
+ <property name="text">
1250
+ <string>Name</string>
1251
+ </property>
1252
+ </widget>
1253
+ </item>
1254
+ <item row="1" column="1">
1255
+ <widget class="QLineEdit" name="advOutTrack3Name"/>
1256
+ </item>
1257
+ </layout>
1258
+ </widget>
1259
+ </item>
1260
+ <item>
1261
+ <widget class="QGroupBox" name="groupBox_4">
1262
+ <property name="sizePolicy">
1263
+ <sizepolicy hsizetype="Preferred" vsizetype="Maximum">
1264
+ <horstretch>0</horstretch>
1265
+ <verstretch>0</verstretch>
1266
+ </sizepolicy>
1267
+ </property>
1268
+ <property name="title">
1269
+ <string>Basic.Settings.Output.Adv.Audio.Track4</string>
1270
+ </property>
1271
+ <layout class="QFormLayout" name="formLayout_13">
1272
+ <property name="fieldGrowthPolicy">
1273
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
1274
+ </property>
1275
+ <property name="labelAlignment">
1276
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1277
+ </property>
1278
+ <item row="0" column="0">
1279
+ <widget class="QLabel" name="label_53">
1280
+ <property name="minimumSize">
1281
+ <size>
1282
+ <width>170</width>
1283
+ <height>0</height>
1284
+ </size>
1285
+ </property>
1286
+ <property name="text">
1287
+ <string>Basic.Settings.Output.AudioBitrate</string>
1288
+ </property>
1289
+ <property name="alignment">
1290
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1291
+ </property>
1292
+ </widget>
1293
+ </item>
1294
+ <item row="0" column="1">
1295
+ <widget class="QComboBox" name="advOutTrack4Bitrate">
1296
+ <property name="currentIndex">
1297
+ <number>4</number>
1298
+ </property>
1299
+ <item>
1300
+ <property name="text">
1301
+ <string>32</string>
1302
+ </property>
1303
+ </item>
1304
+ <item>
1305
+ <property name="text">
1306
+ <string>64</string>
1307
+ </property>
1308
+ </item>
1309
+ <item>
1310
+ <property name="text">
1311
+ <string>96</string>
1312
+ </property>
1313
+ </item>
1314
+ <item>
1315
+ <property name="text">
1316
+ <string>128</string>
1317
+ </property>
1318
+ </item>
1319
+ <item>
1320
+ <property name="text">
1321
+ <string>160</string>
1322
+ </property>
1323
+ </item>
1324
+ <item>
1325
+ <property name="text">
1326
+ <string>192</string>
1327
+ </property>
1328
+ </item>
1329
+ <item>
1330
+ <property name="text">
1331
+ <string>256</string>
1332
+ </property>
1333
+ </item>
1334
+ <item>
1335
+ <property name="text">
1336
+ <string>320</string>
1337
+ </property>
1338
+ </item>
1339
+ </widget>
1340
+ </item>
1341
+ <item row="1" column="0">
1342
+ <widget class="QLabel" name="label_54">
1343
+ <property name="text">
1344
+ <string>Name</string>
1345
+ </property>
1346
+ </widget>
1347
+ </item>
1348
+ <item row="1" column="1">
1349
+ <widget class="QLineEdit" name="advOutTrack4Name"/>
1350
+ </item>
1351
+ </layout>
1352
+ </widget>
1353
+ </item>
1354
+ </layout>
1355
+ </widget>
1356
+ </item>
1357
+ </layout>
1358
+ </widget>
1359
+ </widget>
1360
+ </item>
1361
+ </layout>
1362
+ </widget>
1363
</widget>
1364
</item>
1365
</layout>
1366
1367
</item>
1368
</layout>
1369
</widget>
1370
+ <widget class="QWidget" name="advancedPage">
1371
+ <layout class="QHBoxLayout" name="horizontalLayout_11">
1372
+ <property name="leftMargin">
1373
+ <number>0</number>
1374
+ </property>
1375
+ <property name="topMargin">
1376
+ <number>0</number>
1377
+ </property>
1378
+ <property name="rightMargin">
1379
+ <number>0</number>
1380
+ </property>
1381
+ <property name="bottomMargin">
1382
+ <number>0</number>
1383
+ </property>
1384
+ <item>
1385
+ <widget class="QScrollArea" name="scrollArea">
1386
+ <property name="frameShape">
1387
+ <enum>QFrame::NoFrame</enum>
1388
+ </property>
1389
+ <property name="frameShadow">
1390
+ <enum>QFrame::Plain</enum>
1391
+ </property>
1392
+ <property name="widgetResizable">
1393
+ <bool>true</bool>
1394
+ </property>
1395
+ <widget class="QWidget" name="scrollAreaWidgetContents">
1396
+ <property name="geometry">
1397
+ <rect>
1398
+ <x>0</x>
1399
+ <y>0</y>
1400
+ <width>609</width>
1401
+ <height>553</height>
1402
+ </rect>
1403
+ </property>
1404
+ <layout class="QVBoxLayout" name="verticalLayout_16">
1405
+ <property name="leftMargin">
1406
+ <number>0</number>
1407
+ </property>
1408
+ <property name="topMargin">
1409
+ <number>0</number>
1410
+ </property>
1411
+ <property name="rightMargin">
1412
+ <number>0</number>
1413
+ </property>
1414
+ <property name="bottomMargin">
1415
+ <number>9</number>
1416
+ </property>
1417
+ <item alignment="Qt::AlignTop">
1418
+ <widget class="QWidget" name="widget_11" native="true">
1419
+ <layout class="QVBoxLayout" name="verticalLayout_17">
1420
+ <item>
1421
+ <widget class="QGroupBox" name="groupBox_6">
1422
+ <property name="title">
1423
+ <string>Basic.Settings.Audio</string>
1424
+ </property>
1425
+ <layout class="QFormLayout" name="formLayout_17">
1426
+ <property name="fieldGrowthPolicy">
1427
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
1428
+ </property>
1429
+ <property name="labelAlignment">
1430
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1431
+ </property>
1432
+ <item row="0" column="0">
1433
+ <widget class="QLabel" name="label_35">
1434
+ <property name="minimumSize">
1435
+ <size>
1436
+ <width>170</width>
1437
+ <height>0</height>
1438
+ </size>
1439
+ </property>
1440
+ <property name="text">
1441
+ <string>Basic.Settings.Advanced.Audio.BufferingTime</string>
1442
+ </property>
1443
+ <property name="alignment">
1444
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1445
+ </property>
1446
+ </widget>
1447
+ </item>
1448
+ <item row="0" column="1">
1449
+ <widget class="QSpinBox" name="audioBufferingTime">
1450
+ <property name="minimum">
1451
+ <number>100</number>
1452
+ </property>
1453
+ <property name="maximum">
1454
+ <number>10000</number>
1455
+ </property>
1456
+ <property name="value">
1457
+ <number>1000</number>
1458
+ </property>
1459
+ </widget>
1460
+ </item>
1461
+ </layout>
1462
+ </widget>
1463
+ </item>
1464
+ <item>
1465
+ <widget class="QGroupBox" name="advancedVideoContainer">
1466
+ <property name="title">
1467
+ <string>Basic.Settings.Video</string>
1468
+ </property>
1469
+ <layout class="QFormLayout" name="formLayout_14">
1470
+ <property name="fieldGrowthPolicy">
1471
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
1472
+ </property>
1473
+ <property name="labelAlignment">
1474
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1475
+ </property>
1476
+ <item row="0" column="0">
1477
+ <widget class="QLabel" name="label_30">
1478
+ <property name="enabled">
1479
+ <bool>false</bool>
1480
+ </property>
1481
+ <property name="minimumSize">
1482
+ <size>
1483
+ <width>170</width>
1484
+ <height>0</height>
1485
+ </size>
1486
+ </property>
1487
+ <property name="text">
1488
+ <string>Basic.Settings.Advanced.Video.ColorFormat</string>
1489
+ </property>
1490
+ <property name="alignment">
1491
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1492
+ </property>
1493
+ </widget>
1494
+ </item>
1495
+ <item row="0" column="1">
1496
+ <widget class="QComboBox" name="colorFormat">
1497
+ <property name="enabled">
1498
+ <bool>false</bool>
1499
+ </property>
1500
+ <item>
1501
+ <property name="text">
1502
+ <string notr="true">NV12</string>
1503
+ </property>
1504
+ </item>
1505
+ <item>
1506
+ <property name="text">
1507
+ <string notr="true">I420</string>
1508
+ </property>
1509
+ </item>
1510
+ <item>
1511
+ <property name="text">
1512
+ <string notr="true">RGB</string>
1513
+ </property>
1514
+ </item>
1515
+ </widget>
1516
+ </item>
1517
+ <item row="2" column="0">
1518
+ <widget class="QLabel" name="label_34">
1519
+ <property name="text">
1520
+ <string>Basic.Settings.Advanced.Video.ColorRange</string>
1521
+ </property>
1522
+ </widget>
1523
+ </item>
1524
+ <item row="2" column="1">
1525
+ <widget class="QComboBox" name="colorRange"/>
1526
+ </item>
1527
+ <item row="1" column="0">
1528
+ <widget class="QLabel" name="label_33">
1529
+ <property name="text">
1530
+ <string>Basic.Settings.Advanced.Video.ColorSpace</string>
1531
+ </property>
1532
+ </widget>
1533
+ </item>
1534
+ <item row="1" column="1">
1535
+ <widget class="QComboBox" name="colorSpace">
1536
+ <item>
1537
+ <property name="text">
1538
+ <string notr="true">709</string>
1539
+ </property>
1540
+ </item>
1541
+ <item>
1542
+ <property name="text">
1543
+ <string notr="true">601</string>
1544
+ </property>
1545
+ </item>
1546
+ </widget>
1547
+ </item>
1548
+ </layout>
1549
+ </widget>
1550
+ </item>
1551
+ <item>
1552
+ <widget class="QLabel" name="advancedMsg">
1553
+ <property name="styleSheet">
1554
+ <string notr="true">color: rgb(255, 0, 4);</string>
1555
+ </property>
1556
+ <property name="text">
1557
+ <string notr="true"/>
1558
+ </property>
1559
+ </widget>
1560
+ </item>
1561
+ </layout>
1562
+ </widget>
1563
+ </item>
1564
+ </layout>
1565
+ </widget>
1566
+ </widget>
1567
+ </item>
1568
+ </layout>
1569
+ </widget>
1570
</widget>
1571
</item>
1572
</layout>
1573
1574
<slot>setCurrentIndex(int)</slot>
1575
<hints>
1576
<hint type="sourcelabel">
1577
- <x>252</x>
1578
+ <x>310</x>
1579
<y>29</y>
1580
</hint>
1581
<hint type="destinationlabel">
1582
- <x>250</x>
1583
- <y>39</y>
1584
+ <x>241</x>
1585
+ <y>34</y>
1586
</hint>
1587
</hints>
1588
</connection>
1589
1590
</connection>
1591
<connection>
1592
<sender>simpleOutReconnect</sender>
1593
- <signal>clicked(bool)</signal>
1594
+ <signal>toggled(bool)</signal>
1595
<receiver>simpleOutRetryDelay</receiver>
1596
<slot>setEnabled(bool)</slot>
1597
<hints>
1598
1599
</connection>
1600
<connection>
1601
<sender>simpleOutReconnect</sender>
1602
- <signal>clicked(bool)</signal>
1603
+ <signal>toggled(bool)</signal>
1604
<receiver>simpleOutMaxRetries</receiver>
1605
<slot>setEnabled(bool)</slot>
1606
<hints>
1607
1608
<connection>
1609
<sender>simpleOutAdvanced</sender>
1610
<signal>toggled(bool)</signal>
1611
- <receiver>simpleOutCustomX264</receiver>
1612
+ <receiver>simpleOutCustom</receiver>
1613
<slot>setVisible(bool)</slot>
1614
<hints>
1615
<hint type="sourcelabel">
1616
1617
</hint>
1618
<hint type="destinationlabel">
1619
<x>750</x>
1620
- <y>321</y>
1621
+ <y>347</y>
1622
</hint>
1623
</hints>
1624
</connection>
1625
1626
</hint>
1627
<hint type="destinationlabel">
1628
<x>367</x>
1629
- <y>321</y>
1630
+ <y>347</y>
1631
</hint>
1632
</hints>
1633
</connection>
1634
1635
</hint>
1636
</hints>
1637
</connection>
1638
+ <connection>
1639
+ <sender>simpleOutUseBufsize</sender>
1640
+ <signal>toggled(bool)</signal>
1641
+ <receiver>simpleOutVBufsize</receiver>
1642
+ <slot>setEnabled(bool)</slot>
1643
+ <hints>
1644
+ <hint type="sourcelabel">
1645
+ <x>318</x>
1646
+ <y>312</y>
1647
+ </hint>
1648
+ <hint type="destinationlabel">
1649
+ <x>473</x>
1650
+ <y>311</y>
1651
+ </hint>
1652
+ </hints>
1653
+ </connection>
1654
+ <connection>
1655
+ <sender>simpleOutAdvanced</sender>
1656
+ <signal>toggled(bool)</signal>
1657
+ <receiver>simpleOutUseBufsize</receiver>
1658
+ <slot>setVisible(bool)</slot>
1659
+ <hints>
1660
+ <hint type="sourcelabel">
1661
+ <x>456</x>
1662
+ <y>241</y>
1663
+ </hint>
1664
+ <hint type="destinationlabel">
1665
+ <x>260</x>
1666
+ <y>315</y>
1667
+ </hint>
1668
+ </hints>
1669
+ </connection>
1670
+ <connection>
1671
+ <sender>simpleOutAdvanced</sender>
1672
+ <signal>toggled(bool)</signal>
1673
+ <receiver>simpleOutVBufsize</receiver>
1674
+ <slot>setVisible(bool)</slot>
1675
+ <hints>
1676
+ <hint type="sourcelabel">
1677
+ <x>525</x>
1678
+ <y>238</y>
1679
+ </hint>
1680
+ <hint type="destinationlabel">
1681
+ <x>519</x>
1682
+ <y>317</y>
1683
+ </hint>
1684
+ </hints>
1685
+ </connection>
1686
+ <connection>
1687
+ <sender>advOutRecType</sender>
1688
+ <signal>currentIndexChanged(int)</signal>
1689
+ <receiver>stackedWidget</receiver>
1690
+ <slot>setCurrentIndex(int)</slot>
1691
+ <hints>
1692
+ <hint type="sourcelabel">
1693
+ <x>259</x>
1694
+ <y>101</y>
1695
+ </hint>
1696
+ <hint type="destinationlabel">
1697
+ <x>243</x>
1698
+ <y>106</y>
1699
+ </hint>
1700
+ </hints>
1701
+ </connection>
1702
+ <connection>
1703
+ <sender>advOutFFUseRescale</sender>
1704
+ <signal>toggled(bool)</signal>
1705
+ <receiver>advOutFFRescale</receiver>
1706
+ <slot>setEnabled(bool)</slot>
1707
+ <hints>
1708
+ <hint type="sourcelabel">
1709
+ <x>259</x>
1710
+ <y>113</y>
1711
+ </hint>
1712
+ <hint type="destinationlabel">
1713
+ <x>230</x>
1714
+ <y>125</y>
1715
+ </hint>
1716
+ </hints>
1717
+ </connection>
1718
+ <connection>
1719
+ <sender>advOutReconnect</sender>
1720
+ <signal>toggled(bool)</signal>
1721
+ <receiver>label_27</receiver>
1722
+ <slot>setEnabled(bool)</slot>
1723
+ <hints>
1724
+ <hint type="sourcelabel">
1725
+ <x>468</x>
1726
+ <y>110</y>
1727
+ </hint>
1728
+ <hint type="destinationlabel">
1729
+ <x>362</x>
1730
+ <y>136</y>
1731
+ </hint>
1732
+ </hints>
1733
+ </connection>
1734
+ <connection>
1735
+ <sender>advOutReconnect</sender>
1736
+ <signal>toggled(bool)</signal>
1737
+ <receiver>advOutRetryDelay</receiver>
1738
+ <slot>setEnabled(bool)</slot>
1739
+ <hints>
1740
+ <hint type="sourcelabel">
1741
+ <x>468</x>
1742
+ <y>110</y>
1743
+ </hint>
1744
+ <hint type="destinationlabel">
1745
+ <x>468</x>
1746
+ <y>136</y>
1747
+ </hint>
1748
+ </hints>
1749
+ </connection>
1750
+ <connection>
1751
+ <sender>advOutReconnect</sender>
1752
+ <signal>toggled(bool)</signal>
1753
+ <receiver>label_26</receiver>
1754
+ <slot>setEnabled(bool)</slot>
1755
+ <hints>
1756
+ <hint type="sourcelabel">
1757
+ <x>468</x>
1758
+ <y>110</y>
1759
+ </hint>
1760
+ <hint type="destinationlabel">
1761
+ <x>299</x>
1762
+ <y>162</y>
1763
+ </hint>
1764
+ </hints>
1765
+ </connection>
1766
+ <connection>
1767
+ <sender>advOutReconnect</sender>
1768
+ <signal>toggled(bool)</signal>
1769
+ <receiver>advOutMaxRetries</receiver>
1770
+ <slot>setEnabled(bool)</slot>
1771
+ <hints>
1772
+ <hint type="sourcelabel">
1773
+ <x>468</x>
1774
+ <y>110</y>
1775
+ </hint>
1776
+ <hint type="destinationlabel">
1777
+ <x>468</x>
1778
+ <y>162</y>
1779
+ </hint>
1780
+ </hints>
1781
+ </connection>
1782
+ <connection>
1783
+ <sender>advOutUseRescale</sender>
1784
+ <signal>toggled(bool)</signal>
1785
+ <receiver>advOutRescale</receiver>
1786
+ <slot>setEnabled(bool)</slot>
1787
+ <hints>
1788
+ <hint type="sourcelabel">
1789
+ <x>270</x>
1790
+ <y>237</y>
1791
+ </hint>
1792
+ <hint type="destinationlabel">
1793
+ <x>437</x>
1794
+ <y>237</y>
1795
+ </hint>
1796
+ </hints>
1797
+ </connection>
1798
+ <connection>
1799
+ <sender>advOutRecUseRescale</sender>
1800
+ <signal>toggled(bool)</signal>
1801
+ <receiver>advOutRecRescale</receiver>
1802
+ <slot>setEnabled(bool)</slot>
1803
+ <hints>
1804
+ <hint type="sourcelabel">
1805
+ <x>259</x>
1806
+ <y>113</y>
1807
+ </hint>
1808
+ <hint type="destinationlabel">
1809
+ <x>230</x>
1810
+ <y>125</y>
1811
+ </hint>
1812
+ </hints>
1813
+ </connection>
1814
+ <connection>
1815
+ <sender>simpleOutReconnect</sender>
1816
+ <signal>toggled(bool)</signal>
1817
+ <receiver>label_17</receiver>
1818
+ <slot>setEnabled(bool)</slot>
1819
+ <hints>
1820
+ <hint type="sourcelabel">
1821
+ <x>444</x>
1822
+ <y>162</y>
1823
+ </hint>
1824
+ <hint type="destinationlabel">
1825
+ <x>298</x>
1826
+ <y>190</y>
1827
+ </hint>
1828
+ </hints>
1829
+ </connection>
1830
+ <connection>
1831
+ <sender>simpleOutReconnect</sender>
1832
+ <signal>toggled(bool)</signal>
1833
+ <receiver>label_22</receiver>
1834
+ <slot>setEnabled(bool)</slot>
1835
+ <hints>
1836
+ <hint type="sourcelabel">
1837
+ <x>475</x>
1838
+ <y>161</y>
1839
+ </hint>
1840
+ <hint type="destinationlabel">
1841
+ <x>350</x>
1842
+ <y>218</y>
1843
+ </hint>
1844
+ </hints>
1845
+ </connection>
1846
</connections>
1847
</ui>
1848
obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/forms/images/configuration21_16.png
Added
obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/forms/images/settings/advanced.png
Added
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/forms/obs.qrc -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/forms/obs.qrc
Changed
16
1
2
<RCC>
3
<qresource prefix="res">
4
+ <file>images/configuration21_16.png</file>
5
<file>images/list_remove.png</file>
6
<file>images/add.png</file>
7
<file>images/down.png</file>
8
9
<file>images/obs.png</file>
10
</qresource>
11
<qresource prefix="settings">
12
+ <file>images/settings/advanced.png</file>
13
<file>images/settings/network.png</file>
14
<file>images/settings/video-display-3.png</file>
15
<file>images/settings/decibel_audio_player.png</file>
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/obs-app.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/obs-app.cpp
Changed
94
1
2
3
static bool MakeUserDirs()
4
{
5
- BPtr<char> path;
6
+ char path[512];
7
8
- path = os_get_config_path("obs-studio");
9
+ if (os_get_config_path(path, sizeof(path), "obs-studio") <= 0)
10
+ return false;
11
if (!do_mkdir(path))
12
return false;
13
14
- path = os_get_config_path("obs-studio/basic");
15
+ if (os_get_config_path(path, sizeof(path), "obs-studio/basic") <= 0)
16
+ return false;
17
if (!do_mkdir(path))
18
return false;
19
20
- path = os_get_config_path("obs-studio/logs");
21
+ if (os_get_config_path(path, sizeof(path), "obs-studio/logs") <= 0)
22
+ return false;
23
if (!do_mkdir(path))
24
return false;
25
26
27
28
bool OBSApp::InitGlobalConfig()
29
{
30
- BPtr<char> path(os_get_config_path("obs-studio/global.ini"));
31
+ char path[512];
32
+
33
+ int len = os_get_config_path(path, sizeof(path),
34
+ "obs-studio/global.ini");
35
+ if (len <= 0) {
36
+ return false;
37
+ }
38
39
int errorcode = globalConfig.Open(path, CONFIG_OPEN_ALWAYS);
40
if (errorcode != CONFIG_SUCCESS) {
41
42
43
static void delete_oldest_log(void)
44
{
45
- BPtr<char> logDir(os_get_config_path("obs-studio/logs"));
46
+ BPtr<char> logDir(os_get_config_path_ptr("obs-studio/logs"));
47
string oldestLog;
48
uint64_t oldest_ts = (uint64_t)-1;
49
struct os_dirent *entry;
50
51
52
static void get_last_log(void)
53
{
54
- BPtr<char> logDir(os_get_config_path("obs-studio/logs"));
55
+ BPtr<char> logDir(os_get_config_path_ptr("obs-studio/logs"));
56
struct os_dirent *entry;
57
os_dir_t *dir = os_opendir(logDir);
58
uint64_t highest_ts = 0;
59
60
currentLogFile = GenerateTimeDateFilename("txt");
61
dst << "obs-studio/logs/" << currentLogFile.c_str();
62
63
- BPtr<char> path(os_get_config_path(dst.str().c_str()));
64
+ BPtr<char> path(os_get_config_path_ptr(dst.str().c_str()));
65
logFile.open(path,
66
ios_base::in | ios_base::out | ios_base::trunc);
67
68
69
static void load_debug_privilege(void)
70
{
71
const DWORD flags = TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY;
72
- bool success = false;
73
TOKEN_PRIVILEGES tp;
74
HANDLE token;
75
LUID val;
76
77
tp.Privileges[0].Luid = val;
78
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
79
80
- success = !!AdjustTokenPrivileges(token, false, &tp,
81
+ AdjustTokenPrivileges(token, false, &tp,
82
sizeof(tp), NULL, NULL);
83
}
84
85
86
87
int main(int argc, char *argv[])
88
{
89
-#ifndef WIN32
90
+#ifndef _WIN32
91
signal(SIGPIPE, SIG_IGN);
92
#endif
93
94
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/properties-view.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/properties-view.cpp
Changed
120
1
2
#include <QFormLayout>
3
+#include <QScrollBar>
4
#include <QLabel>
5
#include <QCheckBox>
6
#include <QFont>
7
8
9
void OBSPropertiesView::ReloadProperties()
10
{
11
- properties.reset(reloadCallback(obj));
12
+ if (obj) {
13
+ properties.reset(reloadCallback(obj));
14
+ } else {
15
+ properties.reset(reloadCallback((void*)type.c_str()));
16
+ obs_properties_apply_settings(properties.get(), settings);
17
+ }
18
+
19
RefreshProperties();
20
}
21
22
void OBSPropertiesView::RefreshProperties()
23
{
24
+ int h, v;
25
+ GetScrollPos(h, v);
26
+
27
children.clear();
28
if (widget)
29
widget->deleteLater();
30
31
32
setWidgetResizable(true);
33
setWidget(widget);
34
+ SetScrollPos(h, v);
35
setSizePolicy(mainPolicy);
36
37
lastFocused.clear();
38
39
}
40
}
41
42
+void OBSPropertiesView::SetScrollPos(int h, int v)
43
+{
44
+ QScrollBar *scroll = horizontalScrollBar();
45
+ if (scroll)
46
+ scroll->setValue(h);
47
+
48
+ scroll = verticalScrollBar();
49
+ if (scroll)
50
+ scroll->setValue(v);
51
+}
52
+
53
+void OBSPropertiesView::GetScrollPos(int &h, int &v)
54
+{
55
+ h = v = 0;
56
+
57
+ QScrollBar *scroll = horizontalScrollBar();
58
+ if (scroll)
59
+ h = scroll->value();
60
+
61
+ scroll = verticalScrollBar();
62
+ if (scroll)
63
+ v = scroll->value();
64
+}
65
+
66
OBSPropertiesView::OBSPropertiesView(OBSData settings_, void *obj_,
67
PropertiesReloadCallback reloadCallback,
68
PropertiesUpdateCallback callback_, int minSize_)
69
: VScrollArea (nullptr),
70
- widget (nullptr),
71
properties (nullptr, obs_properties_destroy),
72
settings (settings_),
73
obj (obj_),
74
reloadCallback (reloadCallback),
75
callback (callback_),
76
- minSize (minSize_),
77
- lastWidget (nullptr)
78
+ minSize (minSize_)
79
+{
80
+ setFrameShape(QFrame::NoFrame);
81
+ ReloadProperties();
82
+}
83
+
84
+OBSPropertiesView::OBSPropertiesView(OBSData settings_, const char *type_,
85
+ PropertiesReloadCallback reloadCallback_, int minSize_)
86
+ : VScrollArea (nullptr),
87
+ properties (nullptr, obs_properties_destroy),
88
+ settings (settings_),
89
+ type (type_),
90
+ reloadCallback (reloadCallback_),
91
+ minSize (minSize_)
92
{
93
setFrameShape(QFrame::NoFrame);
94
ReloadProperties();
95
96
lastWidget = widget;
97
}
98
99
+void OBSPropertiesView::SignalChanged()
100
+{
101
+ emit Changed();
102
+}
103
+
104
void WidgetInfo::BoolChanged(const char *setting)
105
{
106
QCheckBox *checkbox = static_cast<QCheckBox*>(widget);
107
108
return;
109
}
110
111
- view->callback(view->obj, view->settings);
112
+ if (view->callback)
113
+ view->callback(view->obj, view->settings);
114
+
115
+ view->SignalChanged();
116
+
117
if (obs_property_modified(property, view->settings)) {
118
view->lastFocused = setting;
119
QMetaObject::invokeMethod(view, "RefreshProperties",
120
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/properties-view.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/properties-view.hpp
Changed
50
1
2
std::unique_ptr<obs_properties_t, properties_delete_t>;
3
4
private:
5
- QWidget *widget;
6
+ QWidget *widget = nullptr;
7
properties_t properties;
8
OBSData settings;
9
- void *obj;
10
+ void *obj = nullptr;
11
+ std::string type;
12
PropertiesReloadCallback reloadCallback;
13
- PropertiesUpdateCallback callback;
14
+ PropertiesUpdateCallback callback = nullptr;
15
int minSize;
16
std::vector<std::unique_ptr<WidgetInfo>> children;
17
std::string lastFocused;
18
- QWidget *lastWidget;
19
+ QWidget *lastWidget = nullptr;
20
21
QWidget *NewWidget(obs_property_t *prop, QWidget *widget,
22
const char *signal);
23
24
25
void resizeEvent(QResizeEvent *event) override;
26
27
+ void GetScrollPos(int &h, int &v);
28
+ void SetScrollPos(int h, int v);
29
+
30
public slots:
31
void ReloadProperties();
32
void RefreshProperties();
33
+ void SignalChanged();
34
35
signals:
36
void PropertiesResized();
37
+ void Changed();
38
39
public:
40
OBSPropertiesView(OBSData settings, void *obj,
41
PropertiesReloadCallback reloadCallback,
42
PropertiesUpdateCallback callback,
43
int minSize = 0);
44
+ OBSPropertiesView(OBSData settings, const char *type,
45
+ PropertiesReloadCallback reloadCallback,
46
+ int minSize = 0);
47
+
48
+ inline obs_data_t *GetSettings() const {return settings;}
49
};
50
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/volume-control.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/volume-control.cpp
Changed
55
1
2
obs_volmeter_destroy(obs_volmeter);
3
}
4
5
+QColor VolumeMeter::getBkColor() const
6
+{
7
+ return bkColor;
8
+}
9
+
10
+void VolumeMeter::setBkColor(QColor c)
11
+{
12
+ bkColor = c;
13
+}
14
+
15
+QColor VolumeMeter::getMagColor() const
16
+{
17
+ return magColor;
18
+}
19
+
20
+void VolumeMeter::setMagColor(QColor c)
21
+{
22
+ magColor = c;
23
+}
24
+
25
+QColor VolumeMeter::getPeakColor() const
26
+{
27
+ return peakColor;
28
+}
29
+
30
+void VolumeMeter::setPeakColor(QColor c)
31
+{
32
+ peakColor = c;
33
+}
34
+
35
+QColor VolumeMeter::getPeakHoldColor() const
36
+{
37
+ return peakHoldColor;
38
+}
39
+
40
+void VolumeMeter::setPeakHoldColor(QColor c)
41
+{
42
+ peakHoldColor = c;
43
+}
44
+
45
+
46
VolumeMeter::VolumeMeter(QWidget *parent)
47
: QWidget(parent)
48
{
49
setMinimumSize(1, 3);
50
51
+ //Default meter color settings, they only show if there is no stylesheet, do not remove.
52
bkColor.setRgb(0xDD, 0xDD, 0xDD);
53
magColor.setRgb(0x20, 0x7D, 0x17);
54
peakColor.setRgb(0x3E, 0xF1, 0x2B);
55
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/volume-control.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/volume-control.hpp
Changed
29
1
2
class VolumeMeter : public QWidget
3
{
4
Q_OBJECT
5
+ Q_PROPERTY(QColor bkColor READ getBkColor WRITE setBkColor DESIGNABLE true)
6
+ Q_PROPERTY(QColor magColor READ getMagColor WRITE setMagColor DESIGNABLE true)
7
+ Q_PROPERTY(QColor peakColor READ getPeakColor WRITE setPeakColor DESIGNABLE true)
8
+ Q_PROPERTY(QColor peakHoldColor READ getPeakHoldColor WRITE setPeakHoldColor DESIGNABLE true)
9
+
10
private:
11
float mag, peak, peakHold;
12
QColor bkColor, magColor, peakColor, peakHoldColor;
13
14
public:
15
explicit VolumeMeter(QWidget *parent = 0);
16
void setLevels(float nmag, float npeak, float npeakHold);
17
+ QColor getBkColor() const;
18
+ void setBkColor(QColor c);
19
+ QColor getMagColor() const;
20
+ void setMagColor(QColor c);
21
+ QColor getPeakColor() const;
22
+ void setPeakColor(QColor c);
23
+ QColor getPeakHoldColor() const;
24
+ void setPeakHoldColor(QColor c);
25
+
26
protected:
27
void paintEvent(QPaintEvent *event);
28
private slots:
29
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/window-basic-adv-audio.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/window-basic-adv-audio.cpp
Changed
78
1
2
#include <QVBoxLayout>
3
-#include <QHBoxLayout>
4
+#include <QGridLayout>
5
#include <QScrollArea>
6
#include <QLabel>
7
#include "window-basic-adv-audio.hpp"
8
9
{
10
QScrollArea *scrollArea;
11
QVBoxLayout *vlayout;
12
- QHBoxLayout *hlayout;
13
QWidget *widget;
14
QLabel *label;
15
16
- hlayout = new QHBoxLayout;
17
- hlayout->setContentsMargins(0, 0, 0, 0);
18
+ mainLayout = new QGridLayout;
19
+ mainLayout->setContentsMargins(0, 0, 0, 0);
20
label = new QLabel(QTStr("Basic.AdvAudio.Name"));
21
- label->setMinimumWidth(170);
22
label->setAlignment(Qt::AlignHCenter);
23
- hlayout->addWidget(label);
24
+ mainLayout->addWidget(label, 0, 0);
25
label = new QLabel(QTStr("Basic.AdvAudio.Volume"));
26
- label->setMinimumWidth(130);
27
- label->setMaximumWidth(130);
28
label->setAlignment(Qt::AlignHCenter);
29
- hlayout->addWidget(label);
30
+ mainLayout->addWidget(label, 0, 1);
31
label = new QLabel(QTStr("Basic.AdvAudio.Mono"));
32
- label->setMinimumWidth(130);
33
- label->setMaximumWidth(130);
34
label->setAlignment(Qt::AlignHCenter);
35
- hlayout->addWidget(label);
36
+ mainLayout->addWidget(label, 0, 2);
37
label = new QLabel(QTStr("Basic.AdvAudio.Panning"));
38
- label->setMinimumWidth(140);
39
- label->setMaximumWidth(140);
40
label->setAlignment(Qt::AlignHCenter);
41
- hlayout->addWidget(label);
42
+ mainLayout->addWidget(label, 0, 3);
43
label = new QLabel(QTStr("Basic.AdvAudio.SyncOffset"));
44
- label->setMinimumWidth(130);
45
- label->setMaximumWidth(130);
46
label->setAlignment(Qt::AlignHCenter);
47
- hlayout->addWidget(label);
48
- label = new QLabel(QTStr("Basic.AdvAudio.MediaChannel"));
49
- label->setMinimumWidth(160);
50
- label->setMaximumWidth(160);
51
+ mainLayout->addWidget(label, 0, 4);
52
+ label = new QLabel(QTStr("Basic.AdvAudio.AudioTracks"));
53
label->setAlignment(Qt::AlignHCenter);
54
- hlayout->addWidget(label);
55
- widget = new QWidget;
56
- widget->setLayout(hlayout);
57
+ mainLayout->addWidget(label, 0, 5);
58
59
- vlayout = new QVBoxLayout;
60
- vlayout->setContentsMargins(0, 0, 0, 10);
61
- vlayout->addWidget(widget);
62
controlArea = new QWidget;
63
- controlArea->setLayout(vlayout);
64
+ controlArea->setLayout(mainLayout);
65
controlArea->setSizePolicy(QSizePolicy::Preferred,
66
QSizePolicy::Preferred);
67
68
69
70
inline void OBSBasicAdvAudio::AddAudioSource(obs_source_t *source)
71
{
72
- OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(source);
73
- controlArea->layout()->addWidget(control);
74
+ OBSAdvAudioCtrl *control = new OBSAdvAudioCtrl(mainLayout, source);
75
controls.push_back(control);
76
}
77
78
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/window-basic-adv-audio.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/window-basic-adv-audio.hpp
Changed
17
1
2
#include <vector>
3
4
class OBSAdvAudioCtrl;
5
+class QGridLayout;
6
7
// "Basic advanced audio"? ...
8
9
10
11
private:
12
QWidget *controlArea;
13
+ QGridLayout *mainLayout;
14
OBSSignal sourceAddedSignal;
15
OBSSignal sourceRemovedSignal;
16
17
obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/window-basic-main-outputs.cpp
Added
713
1
2
+#include <string>
3
+#include <QMessageBox>
4
+#include "window-basic-main.hpp"
5
+#include "window-basic-main-outputs.hpp"
6
+
7
+using namespace std;
8
+
9
+static void OBSStartStreaming(void *data, calldata_t *params)
10
+{
11
+ BasicOutputHandler *output = static_cast<BasicOutputHandler*>(data);
12
+ QMetaObject::invokeMethod(output->main, "StreamingStart");
13
+
14
+ UNUSED_PARAMETER(params);
15
+}
16
+
17
+static void OBSStopStreaming(void *data, calldata_t *params)
18
+{
19
+ BasicOutputHandler *output = static_cast<BasicOutputHandler*>(data);
20
+ int code = (int)calldata_int(params, "code");
21
+
22
+ QMetaObject::invokeMethod(output->main,
23
+ "StreamingStop", Q_ARG(int, code));
24
+ output->activeRefs--;
25
+}
26
+
27
+static void OBSStartRecording(void *data, calldata_t *params)
28
+{
29
+ BasicOutputHandler *output = static_cast<BasicOutputHandler*>(data);
30
+
31
+ QMetaObject::invokeMethod(output->main, "RecordingStart");
32
+
33
+ UNUSED_PARAMETER(params);
34
+}
35
+
36
+static void OBSStopRecording(void *data, calldata_t *params)
37
+{
38
+ BasicOutputHandler *output = static_cast<BasicOutputHandler*>(data);
39
+
40
+ QMetaObject::invokeMethod(output->main, "RecordingStop");
41
+ output->activeRefs--;
42
+
43
+ UNUSED_PARAMETER(params);
44
+}
45
+
46
+/* ------------------------------------------------------------------------ */
47
+
48
+struct SimpleOutput : BasicOutputHandler {
49
+ OBSEncoder aac;
50
+ OBSEncoder h264;
51
+
52
+ SimpleOutput(OBSBasic *main_);
53
+
54
+ virtual void Update() override;
55
+
56
+ void SetupOutputs();
57
+
58
+ virtual bool StartStreaming(obs_service_t *service) override;
59
+ virtual bool StartRecording() override;
60
+ virtual void StopStreaming() override;
61
+ virtual void StopRecording() override;
62
+ virtual bool StreamingActive() const override;
63
+ virtual bool RecordingActive() const override;
64
+};
65
+
66
+SimpleOutput::SimpleOutput(OBSBasic *main_) : BasicOutputHandler(main_)
67
+{
68
+ streamOutput = obs_output_create("rtmp_output", "simple_stream",
69
+ nullptr);
70
+ if (!streamOutput)
71
+ throw "Failed to create stream output (simple output)";
72
+
73
+ fileOutput = obs_output_create("flv_output", "simple_file_output",
74
+ nullptr);
75
+ if (!fileOutput)
76
+ throw "Failed to create recording output (simple output)";
77
+
78
+ h264 = obs_video_encoder_create("obs_x264", "simple_h264", nullptr);
79
+ if (!h264)
80
+ throw "Failed to create h264 encoder (simple output)";
81
+
82
+ aac = obs_audio_encoder_create("libfdk_aac", "simple_aac", nullptr, 0);
83
+ if (!aac)
84
+ aac = obs_audio_encoder_create("ffmpeg_aac", "simple_aac",
85
+ nullptr, 0);
86
+ if (!aac)
87
+ throw "Failed to create audio encoder (simple output)";
88
+
89
+ signal_handler_connect(obs_output_get_signal_handler(streamOutput),
90
+ "start", OBSStartStreaming, this);
91
+ signal_handler_connect(obs_output_get_signal_handler(streamOutput),
92
+ "stop", OBSStopStreaming, this);
93
+
94
+ signal_handler_connect(obs_output_get_signal_handler(fileOutput),
95
+ "start", OBSStartRecording, this);
96
+ signal_handler_connect(obs_output_get_signal_handler(fileOutput),
97
+ "stop", OBSStopRecording, this);
98
+}
99
+
100
+void SimpleOutput::Update()
101
+{
102
+ obs_data_t *h264Settings = obs_data_create();
103
+ obs_data_t *aacSettings = obs_data_create();
104
+
105
+ int videoBitrate = config_get_uint(main->Config(), "SimpleOutput",
106
+ "VBitrate");
107
+ int videoBufsize = config_get_uint(main->Config(), "SimpleOutput",
108
+ "Bufsize");
109
+ int audioBitrate = config_get_uint(main->Config(), "SimpleOutput",
110
+ "ABitrate");
111
+ bool advanced = config_get_bool(main->Config(), "SimpleOutput",
112
+ "UseAdvanced");
113
+ bool useCBR = config_get_bool(main->Config(), "SimpleOutput",
114
+ "UseCBR");
115
+ bool useBufsize = config_get_bool(main->Config(), "SimpleOutput",
116
+ "UseBufsize");
117
+ const char *preset = config_get_string(main->Config(),
118
+ "SimpleOutput", "Preset");
119
+ const char *custom = config_get_string(main->Config(),
120
+ "SimpleOutput", "x264Settings");
121
+
122
+ obs_data_set_int(h264Settings, "bitrate", videoBitrate);
123
+ obs_data_set_bool(h264Settings, "use_bufsize", useBufsize);
124
+ obs_data_set_int(h264Settings, "buffer_size", videoBufsize);
125
+
126
+ if (advanced) {
127
+ obs_data_set_string(h264Settings, "preset", preset);
128
+ obs_data_set_string(h264Settings, "x264opts", custom);
129
+ obs_data_set_bool(h264Settings, "cbr", useCBR);
130
+ } else {
131
+ obs_data_set_bool(h264Settings, "cbr", true);
132
+ }
133
+
134
+ obs_data_set_int(aacSettings, "bitrate", audioBitrate);
135
+
136
+ obs_encoder_update(h264, h264Settings);
137
+ obs_encoder_update(aac, aacSettings);
138
+
139
+ obs_data_release(h264Settings);
140
+ obs_data_release(aacSettings);
141
+}
142
+
143
+inline void SimpleOutput::SetupOutputs()
144
+{
145
+ SimpleOutput::Update();
146
+ obs_encoder_set_video(h264, obs_get_video());
147
+ obs_encoder_set_audio(aac, obs_get_audio());
148
+
149
+ obs_service_apply_encoder_settings(main->GetService(), h264, aac);
150
+}
151
+
152
+bool SimpleOutput::StartStreaming(obs_service_t *service)
153
+{
154
+ if (!Active())
155
+ SetupOutputs();
156
+
157
+ obs_output_set_video_encoder(streamOutput, h264);
158
+ obs_output_set_audio_encoder(streamOutput, aac, 0);
159
+ obs_output_set_service(streamOutput, service);
160
+
161
+ bool reconnect = config_get_bool(main->Config(), "SimpleOutput",
162
+ "Reconnect");
163
+ int retryDelay = config_get_uint(main->Config(), "SimpleOutput",
164
+ "RetryDelay");
165
+ int maxRetries = config_get_uint(main->Config(), "SimpleOutput",
166
+ "MaxRetries");
167
+ if (!reconnect)
168
+ maxRetries = 0;
169
+
170
+ obs_output_set_reconnect_settings(streamOutput, maxRetries,
171
+ retryDelay);
172
+
173
+ if (obs_output_start(streamOutput)) {
174
+ activeRefs++;
175
+ return true;
176
+ }
177
+
178
+ return false;
179
+}
180
+
181
+bool SimpleOutput::StartRecording()
182
+{
183
+ if (!Active())
184
+ SetupOutputs();
185
+
186
+ const char *path = config_get_string(main->Config(),
187
+ "SimpleOutput", "FilePath");
188
+
189
+ os_dir_t *dir = path ? os_opendir(path) : nullptr;
190
+
191
+ if (!dir) {
192
+ QMessageBox::information(main,
193
+ QTStr("Output.BadPath.Title"),
194
+ QTStr("Output.BadPath.Text"));
195
+ return false;
196
+ }
197
+
198
+ os_closedir(dir);
199
+
200
+ string strPath;
201
+ strPath += path;
202
+
203
+ char lastChar = strPath.back();
204
+ if (lastChar != '/' && lastChar != '\\')
205
+ strPath += "/";
206
+
207
+ strPath += GenerateTimeDateFilename("flv");
208
+
209
+ SetupOutputs();
210
+
211
+ obs_output_set_video_encoder(fileOutput, h264);
212
+ obs_output_set_audio_encoder(fileOutput, aac, 0);
213
+
214
+ obs_data_t *settings = obs_data_create();
215
+ obs_data_set_string(settings, "path", strPath.c_str());
216
+
217
+ obs_output_update(fileOutput, settings);
218
+
219
+ obs_data_release(settings);
220
+
221
+ if (obs_output_start(fileOutput)) {
222
+ activeRefs++;
223
+ return true;
224
+ }
225
+
226
+ return false;
227
+}
228
+
229
+void SimpleOutput::StopStreaming()
230
+{
231
+ obs_output_stop(streamOutput);
232
+}
233
+
234
+void SimpleOutput::StopRecording()
235
+{
236
+ obs_output_stop(fileOutput);
237
+}
238
+
239
+bool SimpleOutput::StreamingActive() const
240
+{
241
+ return obs_output_active(streamOutput);
242
+}
243
+
244
+bool SimpleOutput::RecordingActive() const
245
+{
246
+ return obs_output_active(fileOutput);
247
+}
248
+
249
+/* ------------------------------------------------------------------------ */
250
+
251
+struct AdvancedOutput : BasicOutputHandler {
252
+ OBSEncoder aacTrack[4];
253
+ OBSEncoder h264Streaming;
254
+ OBSEncoder h264Recording;
255
+
256
+ bool ffmpegRecording;
257
+ bool useStreamEncoder;
258
+
259
+ AdvancedOutput(OBSBasic *main_);
260
+
261
+ inline void UpdateStreamSettings();
262
+ inline void UpdateRecordingSettings();
263
+ virtual void Update() override;
264
+
265
+ inline void SetupStreaming();
266
+ inline void SetupRecording();
267
+ inline void SetupFFmpeg();
268
+ inline void SetupAudio();
269
+ void SetupOutputs();
270
+
271
+ virtual bool StartStreaming(obs_service_t *service) override;
272
+ virtual bool StartRecording() override;
273
+ virtual void StopStreaming() override;
274
+ virtual void StopRecording() override;
275
+ virtual bool StreamingActive() const override;
276
+ virtual bool RecordingActive() const override;
277
+};
278
+
279
+static OBSData GetDataFromJsonFile(const char *jsonFile)
280
+{
281
+ char fullPath[512];
282
+
283
+ int ret = os_get_config_path(fullPath, sizeof(fullPath), jsonFile);
284
+ if (ret > 0) {
285
+ BPtr<char> jsonData = os_quick_read_utf8_file(fullPath);
286
+ if (!!jsonData) {
287
+ obs_data_t *data = obs_data_create_from_json(jsonData);
288
+ OBSData dataRet(data);
289
+ obs_data_release(data);
290
+ return dataRet;
291
+ }
292
+ }
293
+
294
+ return nullptr;
295
+}
296
+
297
+AdvancedOutput::AdvancedOutput(OBSBasic *main_) : BasicOutputHandler(main_)
298
+{
299
+ const char *recType = config_get_string(main->Config(), "AdvOut",
300
+ "RecType");
301
+ const char *streamEncoder = config_get_string(main->Config(), "AdvOut",
302
+ "Encoder");
303
+ const char *recordEncoder = config_get_string(main->Config(), "AdvOut",
304
+ "RecEncoder");
305
+
306
+ ffmpegRecording = astrcmpi(recType, "FFmpeg") == 0;
307
+ useStreamEncoder = astrcmpi(recordEncoder, "none") == 0;
308
+
309
+ OBSData streamEncSettings = GetDataFromJsonFile(
310
+ "obs-studio/basic/streamEncoder.json");
311
+ OBSData recordEncSettings = GetDataFromJsonFile(
312
+ "obs-studio/basic/recordEncoder.json");
313
+
314
+ streamOutput = obs_output_create("rtmp_output", "adv_stream",
315
+ nullptr);
316
+ if (!streamOutput)
317
+ throw "Failed to create stream output (advanced output)";
318
+
319
+ if (ffmpegRecording) {
320
+ fileOutput = obs_output_create("ffmpeg_output",
321
+ "adv_ffmpeg_output", nullptr);
322
+ if (!fileOutput)
323
+ throw "Failed to create recording FFmpeg output "
324
+ "(advanced output)";
325
+ } else {
326
+ fileOutput = obs_output_create("flv_output", "adv_file_output",
327
+ nullptr);
328
+ if (!fileOutput)
329
+ throw "Failed to create recording output "
330
+ "(advanced output)";
331
+
332
+ if (!useStreamEncoder) {
333
+ h264Recording = obs_video_encoder_create(recordEncoder,
334
+ "recording_h264", recordEncSettings);
335
+ if (!h264Recording)
336
+ throw "Failed to create recording h264 "
337
+ "encoder (advanced output)";
338
+ }
339
+ }
340
+
341
+ h264Streaming = obs_video_encoder_create(streamEncoder,
342
+ "streaming_h264", streamEncSettings);
343
+ if (!h264Streaming)
344
+ throw "Failed to create streaming h264 encoder "
345
+ "(advanced output)";
346
+
347
+ for (int i = 0; i < 4; i++) {
348
+ char name[9];
349
+ sprintf(name, "adv_aac%d", i);
350
+
351
+ aacTrack[i] = obs_audio_encoder_create("libfdk_aac",
352
+ name, nullptr, i);
353
+ if (!aacTrack[i])
354
+ aacTrack[i] = obs_audio_encoder_create("ffmpeg_aac",
355
+ name, nullptr, i);
356
+ if (!aacTrack[i])
357
+ throw "Failed to create audio encoder "
358
+ "(advanced output)";
359
+ }
360
+
361
+ signal_handler_connect(obs_output_get_signal_handler(streamOutput),
362
+ "start", OBSStartStreaming, this);
363
+ signal_handler_connect(obs_output_get_signal_handler(streamOutput),
364
+ "stop", OBSStopStreaming, this);
365
+
366
+ signal_handler_connect(obs_output_get_signal_handler(fileOutput),
367
+ "start", OBSStartRecording, this);
368
+ signal_handler_connect(obs_output_get_signal_handler(fileOutput),
369
+ "stop", OBSStopRecording, this);
370
+}
371
+
372
+void AdvancedOutput::UpdateStreamSettings()
373
+{
374
+ OBSData settings = GetDataFromJsonFile(
375
+ "obs-studio/basic/streamEncoder.json");
376
+ obs_encoder_update(h264Streaming, settings);
377
+}
378
+
379
+inline void AdvancedOutput::UpdateRecordingSettings()
380
+{
381
+ OBSData settings = GetDataFromJsonFile(
382
+ "obs-studio/basic/recordEncoder.json");
383
+ obs_encoder_update(h264Recording, settings);
384
+}
385
+
386
+void AdvancedOutput::Update()
387
+{
388
+ UpdateStreamSettings();
389
+ if (useStreamEncoder && !ffmpegRecording)
390
+ UpdateRecordingSettings();
391
+}
392
+
393
+inline void AdvancedOutput::SetupStreaming()
394
+{
395
+ bool rescale = config_get_bool(main->Config(), "AdvOut",
396
+ "Rescale");
397
+ const char *rescaleRes = config_get_string(main->Config(), "AdvOut",
398
+ "RescaleRes");
399
+ bool multitrack = config_get_bool(main->Config(), "AdvOut",
400
+ "Multitrack");
401
+ int trackIndex = config_get_int(main->Config(), "AdvOut",
402
+ "TrackIndex");
403
+ int trackCount = config_get_int(main->Config(), "AdvOut",
404
+ "TrackCount");
405
+ bool applyServiceSettings = config_get_bool(main->Config(), "AdvOut",
406
+ "ApplyServiceSettings");
407
+ unsigned int cx = 0;
408
+ unsigned int cy = 0;
409
+
410
+ if (rescale && sscanf(rescaleRes, "%ux%u", &cx, &cy) != 2) {
411
+ cx = 0;
412
+ cy = 0;
413
+ }
414
+
415
+ obs_encoder_set_scaled_size(h264Streaming, cx, cy);
416
+ obs_encoder_set_video(h264Streaming, obs_get_video());
417
+
418
+ obs_output_set_video_encoder(streamOutput, h264Streaming);
419
+
420
+ if (applyServiceSettings) {
421
+ obs_service_apply_encoder_settings(main->GetService(),
422
+ h264Streaming, nullptr);
423
+ }
424
+
425
+ if (multitrack) {
426
+ int i = 0;
427
+ for (; i < trackCount; i++) {
428
+ obs_output_set_audio_encoder(streamOutput, aacTrack[i],
429
+ i);
430
+
431
+ if (applyServiceSettings)
432
+ obs_service_apply_encoder_settings(
433
+ main->GetService(), nullptr,
434
+ aacTrack[i]);
435
+ }
436
+
437
+ for (; i < 4; i++)
438
+ obs_output_set_audio_encoder(streamOutput, nullptr, i);
439
+
440
+ } else {
441
+ obs_output_set_audio_encoder(streamOutput,
442
+ aacTrack[trackIndex - 1], 0);
443
+
444
+ if (applyServiceSettings)
445
+ obs_service_apply_encoder_settings(main->GetService(),
446
+ nullptr, aacTrack[trackIndex - 1]);
447
+ }
448
+}
449
+
450
+inline void AdvancedOutput::SetupRecording()
451
+{
452
+ const char *path = config_get_string(main->Config(), "AdvOut",
453
+ "RecFilePath");
454
+ bool rescale = config_get_bool(main->Config(), "AdvOut",
455
+ "RecRescale");
456
+ const char *rescaleRes = config_get_string(main->Config(), "AdvOut",
457
+ "RecRescaleRes");
458
+ bool multitrack = config_get_bool(main->Config(), "AdvOut",
459
+ "RecMultitrack");
460
+ int trackIndex = config_get_int(main->Config(), "AdvOut",
461
+ "RecTrackIndex");
462
+ int trackCount = config_get_int(main->Config(), "AdvOut",
463
+ "RecTrackCount");
464
+ obs_data_t *settings = obs_data_create();
465
+ unsigned int cx = 0;
466
+ unsigned int cy = 0;
467
+
468
+ if (useStreamEncoder) {
469
+ obs_output_set_video_encoder(fileOutput, h264Streaming);
470
+ } else {
471
+ if (rescale && sscanf(rescaleRes, "%ux%u", &cx, &cy) != 2) {
472
+ cx = 0;
473
+ cy = 0;
474
+ }
475
+
476
+ obs_encoder_set_scaled_size(h264Recording, cx, cy);
477
+ obs_encoder_set_video(h264Recording, obs_get_video());
478
+ obs_output_set_video_encoder(fileOutput, h264Recording);
479
+ }
480
+
481
+ if (multitrack) {
482
+ int i = 0;
483
+ for (; i < trackCount; i++)
484
+ obs_output_set_audio_encoder(fileOutput, aacTrack[i],
485
+ i);
486
+ for (; i < 4; i++)
487
+ obs_output_set_audio_encoder(fileOutput, nullptr, i);
488
+ } else {
489
+ obs_output_set_audio_encoder(fileOutput,
490
+ aacTrack[trackIndex - 1], 0);
491
+ }
492
+
493
+ obs_data_set_string(settings, "path", path);
494
+ obs_output_update(fileOutput, settings);
495
+ obs_data_release(settings);
496
+}
497
+
498
+inline void AdvancedOutput::SetupFFmpeg()
499
+{
500
+ const char *url = config_get_string(main->Config(), "AdvOut", "FFURL");
501
+ int vBitrate = config_get_int(main->Config(), "AdvOut",
502
+ "FFVBitrate");
503
+ bool rescale = config_get_bool(main->Config(), "AdvOut",
504
+ "FFRescale");
505
+ const char *rescaleRes = config_get_string(main->Config(), "AdvOut",
506
+ "FFRescaleRes");
507
+ const char *vEncoder = config_get_string(main->Config(), "AdvOut",
508
+ "FFVEncoder");
509
+ const char *vEncCustom = config_get_string(main->Config(), "AdvOut",
510
+ "FFVCustom");
511
+ int aBitrate = config_get_int(main->Config(), "AdvOut",
512
+ "FFABitrate");
513
+ int aTrack = config_get_int(main->Config(), "AdvOut",
514
+ "FFAudioTrack");
515
+ const char *aEncoder = config_get_string(main->Config(), "AdvOut",
516
+ "FFAEncoder");
517
+ const char *aEncCustom = config_get_string(main->Config(), "AdvOut",
518
+ "FFACustom");
519
+ obs_data_t *settings = obs_data_create();
520
+
521
+ obs_data_set_string(settings, "url", url);
522
+ obs_data_set_int(settings, "video_bitrate", vBitrate);
523
+ obs_data_set_string(settings, "video_encoder", vEncoder);
524
+ obs_data_set_string(settings, "video_settings", vEncCustom);
525
+ obs_data_set_int(settings, "audio_bitrate", aBitrate);
526
+ obs_data_set_string(settings, "audio_encoder", aEncoder);
527
+ obs_data_set_string(settings, "audio_settings", aEncCustom);
528
+
529
+ if (rescale && rescaleRes && *rescaleRes) {
530
+ int width;
531
+ int height;
532
+ int val = sscanf(rescaleRes, "%dx%d", &width, &height);
533
+
534
+ if (val == 2 && width && height) {
535
+ obs_data_set_int(settings, "scale_width", width);
536
+ obs_data_set_int(settings, "scale_height", height);
537
+ }
538
+ }
539
+
540
+ obs_output_set_mixer(fileOutput, aTrack - 1);
541
+ obs_output_set_media(fileOutput, obs_get_video(), obs_get_audio());
542
+ obs_output_update(fileOutput, settings);
543
+
544
+ obs_data_release(settings);
545
+}
546
+
547
+static inline void SetEncoderName(obs_encoder_t *encoder, const char *name,
548
+ const char *defaultName)
549
+{
550
+ obs_encoder_set_name(encoder, (name && *name) ? name : defaultName);
551
+}
552
+
553
+inline void AdvancedOutput::SetupAudio()
554
+{
555
+ int track1Bitrate = config_get_uint(main->Config(), "AdvOut",
556
+ "Track1Bitrate");
557
+ int track2Bitrate = config_get_uint(main->Config(), "AdvOut",
558
+ "Track2Bitrate");
559
+ int track3Bitrate = config_get_uint(main->Config(), "AdvOut",
560
+ "Track3Bitrate");
561
+ int track4Bitrate = config_get_uint(main->Config(), "AdvOut",
562
+ "Track4Bitrate");
563
+ const char *name1 = config_get_string(main->Config(), "AdvOut",
564
+ "Track1Name");
565
+ const char *name2 = config_get_string(main->Config(), "AdvOut",
566
+ "Track2Name");
567
+ const char *name3 = config_get_string(main->Config(), "AdvOut",
568
+ "Track3Name");
569
+ const char *name4 = config_get_string(main->Config(), "AdvOut",
570
+ "Track4Name");
571
+ obs_data_t *settings[4];
572
+
573
+ for (size_t i = 0; i < 4; i++)
574
+ settings[i] = obs_data_create();
575
+
576
+ obs_data_set_int(settings[0], "bitrate", track1Bitrate);
577
+ obs_data_set_int(settings[1], "bitrate", track2Bitrate);
578
+ obs_data_set_int(settings[2], "bitrate", track3Bitrate);
579
+ obs_data_set_int(settings[3], "bitrate", track4Bitrate);
580
+
581
+ SetEncoderName(aacTrack[0], name1, "Track1");
582
+ SetEncoderName(aacTrack[1], name2, "Track2");
583
+ SetEncoderName(aacTrack[2], name3, "Track3");
584
+ SetEncoderName(aacTrack[3], name4, "Track4");
585
+
586
+ for (size_t i = 0; i < 4; i++) {
587
+ obs_encoder_update(aacTrack[i], settings[i]);
588
+ obs_data_release(settings[i]);
589
+ }
590
+}
591
+
592
+void AdvancedOutput::SetupOutputs()
593
+{
594
+ obs_encoder_set_video(h264Streaming, obs_get_video());
595
+ if (h264Recording)
596
+ obs_encoder_set_video(h264Recording, obs_get_video());
597
+ obs_encoder_set_audio(aacTrack[0], obs_get_audio());
598
+ obs_encoder_set_audio(aacTrack[1], obs_get_audio());
599
+ obs_encoder_set_audio(aacTrack[2], obs_get_audio());
600
+ obs_encoder_set_audio(aacTrack[3], obs_get_audio());
601
+
602
+ SetupStreaming();
603
+ SetupAudio();
604
+
605
+ if (ffmpegRecording)
606
+ SetupFFmpeg();
607
+ else
608
+ SetupRecording();
609
+}
610
+
611
+bool AdvancedOutput::StartStreaming(obs_service_t *service)
612
+{
613
+ AdvancedOutput::Update();
614
+ if (!Active())
615
+ SetupOutputs();
616
+
617
+ obs_output_set_service(streamOutput, service);
618
+
619
+ bool reconnect = config_get_bool(main->Config(), "AdvOut", "Reconnect");
620
+ int retryDelay = config_get_int(main->Config(), "AdvOut", "RetryDelay");
621
+ int maxRetries = config_get_int(main->Config(), "AdvOut", "MaxRetries");
622
+ if (!reconnect)
623
+ maxRetries = 0;
624
+
625
+ obs_output_set_reconnect_settings(streamOutput, maxRetries,
626
+ retryDelay);
627
+
628
+ if (obs_output_start(streamOutput)) {
629
+ activeRefs++;
630
+ return true;
631
+ }
632
+
633
+ return false;
634
+}
635
+
636
+bool AdvancedOutput::StartRecording()
637
+{
638
+ AdvancedOutput::Update();
639
+ if (!Active())
640
+ SetupOutputs();
641
+
642
+ if (!ffmpegRecording) {
643
+ const char *path = config_get_string(main->Config(),
644
+ "AdvOut", "RecFilePath");
645
+
646
+ os_dir_t *dir = path ? os_opendir(path) : nullptr;
647
+
648
+ if (!dir) {
649
+ QMessageBox::information(main,
650
+ QTStr("Output.BadPath.Title"),
651
+ QTStr("Output.BadPath.Text"));
652
+ return false;
653
+ }
654
+
655
+ os_closedir(dir);
656
+
657
+ string strPath;
658
+ strPath += path;
659
+
660
+ char lastChar = strPath.back();
661
+ if (lastChar != '/' && lastChar != '\\')
662
+ strPath += "/";
663
+
664
+ strPath += GenerateTimeDateFilename("flv");
665
+
666
+ obs_data_t *settings = obs_data_create();
667
+ obs_data_set_string(settings, "path", strPath.c_str());
668
+
669
+ obs_output_update(fileOutput, settings);
670
+
671
+ obs_data_release(settings);
672
+ }
673
+
674
+ if (obs_output_start(fileOutput)) {
675
+ activeRefs++;
676
+ return true;
677
+ }
678
+
679
+ return false;
680
+}
681
+
682
+void AdvancedOutput::StopStreaming()
683
+{
684
+ obs_output_stop(streamOutput);
685
+}
686
+
687
+void AdvancedOutput::StopRecording()
688
+{
689
+ obs_output_stop(fileOutput);
690
+}
691
+
692
+bool AdvancedOutput::StreamingActive() const
693
+{
694
+ return obs_output_active(streamOutput);
695
+}
696
+
697
+bool AdvancedOutput::RecordingActive() const
698
+{
699
+ return obs_output_active(fileOutput);
700
+}
701
+
702
+/* ------------------------------------------------------------------------ */
703
+
704
+BasicOutputHandler *CreateSimpleOutputHandler(OBSBasic *main)
705
+{
706
+ return new SimpleOutput(main);
707
+}
708
+
709
+BasicOutputHandler *CreateAdvancedOutputHandler(OBSBasic *main)
710
+{
711
+ return new AdvancedOutput(main);
712
+}
713
obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/window-basic-main-outputs.hpp
Added
30
1
2
+#pragma once
3
+
4
+class OBSBasic;
5
+
6
+struct BasicOutputHandler {
7
+ OBSOutput fileOutput;
8
+ OBSOutput streamOutput;
9
+ int activeRefs = 0;
10
+ OBSBasic *main;
11
+
12
+ inline BasicOutputHandler(OBSBasic *main_) : main(main_) {}
13
+
14
+ virtual ~BasicOutputHandler() {};
15
+
16
+ virtual bool StartStreaming(obs_service_t *service) = 0;
17
+ virtual bool StartRecording() = 0;
18
+ virtual void StopStreaming() = 0;
19
+ virtual void StopRecording() = 0;
20
+ virtual bool StreamingActive() const = 0;
21
+ virtual bool RecordingActive() const = 0;
22
+
23
+ virtual void Update() = 0;
24
+
25
+ inline bool Active() const {return !!activeRefs;}
26
+};
27
+
28
+BasicOutputHandler *CreateSimpleOutputHandler(OBSBasic *main);
29
+BasicOutputHandler *CreateAdvancedOutputHandler(OBSBasic *main);
30
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/window-basic-main.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/window-basic-main.cpp
Changed
596
1
2
#include "window-namedialog.hpp"
3
#include "window-basic-source-select.hpp"
4
#include "window-basic-main.hpp"
5
+#include "window-basic-main-outputs.hpp"
6
#include "window-basic-properties.hpp"
7
#include "window-log-reply.hpp"
8
#include "window-remux.hpp"
9
10
11
static void AddExtraModulePaths()
12
{
13
- BPtr<char> base_module_dir =
14
- os_get_config_path("obs-studio/plugins/%module%");
15
+ char base_module_dir[512];
16
+ int ret = os_get_config_path(base_module_dir, sizeof(base_module_dir),
17
+ "obs-studio/plugins/%module%");
18
19
- if (!base_module_dir)
20
+ if (ret <= 0)
21
return;
22
23
string path = (char*)base_module_dir;
24
25
{
26
ui->setupUi(this);
27
28
+ char styleSheetPath[512];
29
+ int ret = os_get_config_path(styleSheetPath, sizeof(styleSheetPath),
30
+ "obs-studio/basic/stylesheet.qss");
31
+ if (ret > 0) {
32
+ if (QFile::exists(styleSheetPath)) {
33
+ QString path = QString("file:///") +
34
+ QT_UTF8(styleSheetPath);
35
+ App()->setStyleSheet(path);
36
+ }
37
+ }
38
+
39
qRegisterMetaType<OBSScene> ("OBSScene");
40
qRegisterMetaType<OBSSceneItem>("OBSSceneItem");
41
qRegisterMetaType<OBSSource> ("OBSSource");
42
43
return count != 0;
44
}
45
46
-static void OBSStartStreaming(void *data, calldata_t *params)
47
-{
48
- UNUSED_PARAMETER(params);
49
- QMetaObject::invokeMethod(static_cast<OBSBasic*>(data),
50
- "StreamingStart");
51
-}
52
-
53
-static void OBSStopStreaming(void *data, calldata_t *params)
54
-{
55
- int code = (int)calldata_int(params, "code");
56
- QMetaObject::invokeMethod(static_cast<OBSBasic*>(data),
57
- "StreamingStop", Q_ARG(int, code));
58
-}
59
-
60
-static void OBSStartRecording(void *data, calldata_t *params)
61
-{
62
- UNUSED_PARAMETER(params);
63
-
64
- QMetaObject::invokeMethod(static_cast<OBSBasic*>(data),
65
- "RecordingStart");
66
-}
67
-
68
-static void OBSStopRecording(void *data, calldata_t *params)
69
-{
70
- UNUSED_PARAMETER(params);
71
-
72
- QMetaObject::invokeMethod(static_cast<OBSBasic*>(data),
73
- "RecordingStop");
74
-}
75
-
76
#define SERVICE_PATH "obs-studio/basic/service.json"
77
78
void OBSBasic::SaveService()
79
80
if (!service)
81
return;
82
83
- BPtr<char> serviceJsonPath(os_get_config_path(SERVICE_PATH));
84
- if (!serviceJsonPath)
85
+ char serviceJsonPath[512];
86
+ int ret = os_get_config_path(serviceJsonPath, sizeof(serviceJsonPath),
87
+ SERVICE_PATH);
88
+ if (ret <= 0)
89
return;
90
91
obs_data_t *data = obs_data_create();
92
obs_data_t *settings = obs_service_get_settings(service);
93
94
- obs_data_set_string(data, "type", obs_service_gettype(service));
95
+ obs_data_set_string(data, "type", obs_service_get_type(service));
96
obs_data_set_obj(data, "settings", settings);
97
98
const char *json = obs_data_get_json(data);
99
100
{
101
const char *type;
102
103
- BPtr<char> serviceJsonPath(os_get_config_path(SERVICE_PATH));
104
- if (!serviceJsonPath)
105
+ if (service) {
106
+ obs_service_destroy(service);
107
+ service = nullptr;
108
+ }
109
+
110
+ char serviceJsonPath[512];
111
+ int ret = os_get_config_path(serviceJsonPath, sizeof(serviceJsonPath),
112
+ SERVICE_PATH);
113
+ if (ret <= 0)
114
return false;
115
116
BPtr<char> jsonText = os_quick_read_utf8_file(serviceJsonPath);
117
118
return !!service;
119
}
120
121
-bool OBSBasic::InitOutputs()
122
-{
123
- fileOutput = obs_output_create("flv_output", "default_file_output",
124
- nullptr);
125
- if (!fileOutput)
126
- return false;
127
-
128
- streamOutput = obs_output_create("rtmp_output", "default_stream",
129
- nullptr);
130
- if (!streamOutput)
131
- return false;
132
-
133
- signal_handler_connect(obs_output_get_signal_handler(streamOutput),
134
- "start", OBSStartStreaming, this);
135
- signal_handler_connect(obs_output_get_signal_handler(streamOutput),
136
- "stop", OBSStopStreaming, this);
137
-
138
- signal_handler_connect(obs_output_get_signal_handler(fileOutput),
139
- "start", OBSStartRecording, this);
140
- signal_handler_connect(obs_output_get_signal_handler(fileOutput),
141
- "stop", OBSStopRecording, this);
142
-
143
- return true;
144
-}
145
-
146
-bool OBSBasic::InitEncoders()
147
-{
148
- x264 = obs_video_encoder_create("obs_x264", "default_h264", nullptr);
149
- if (!x264)
150
- return false;
151
-
152
- aac = obs_audio_encoder_create("libfdk_aac", "default_aac", nullptr);
153
-
154
- if (!aac)
155
- aac = obs_audio_encoder_create("ffmpeg_aac", "default_aac",
156
- nullptr);
157
-
158
- if (!aac)
159
- return false;
160
-
161
- return true;
162
-}
163
-
164
bool OBSBasic::InitService()
165
{
166
if (LoadService())
167
168
uint32_t cx = monitors[0].cx;
169
uint32_t cy = monitors[0].cy;
170
171
- /* TODO: temporary */
172
+ config_set_default_string(basicConfig, "Output", "Type", "Simple");
173
+
174
config_set_default_string(basicConfig, "SimpleOutput", "FilePath",
175
GetDefaultVideoSavePath().c_str());
176
config_set_default_uint (basicConfig, "SimpleOutput", "VBitrate",
177
178
config_set_default_bool (basicConfig, "SimpleOutput", "UseAdvanced",
179
false);
180
config_set_default_bool (basicConfig, "SimpleOutput", "UseCBR", true);
181
+ config_set_default_bool (basicConfig, "SimpleOutput", "UseBufsize",
182
+ false);
183
+ config_set_default_int (basicConfig, "SimpleOutput", "Bufsize", 2500);
184
config_set_default_string(basicConfig, "SimpleOutput", "Preset",
185
"veryfast");
186
187
+ config_set_default_bool (basicConfig, "AdvOut", "Reconnect", true);
188
+ config_set_default_uint (basicConfig, "AdvOut", "RetryDelay", 2);
189
+ config_set_default_uint (basicConfig, "AdvOut", "MaxRetries", 20);
190
+ config_set_default_bool (basicConfig, "AdvOut", "ApplyServiceSettings",
191
+ true);
192
+ config_set_default_bool (basicConfig, "AdvOut", "UseRescale", false);
193
+ config_set_default_bool (basicConfig, "AdvOut", "Multitrack", false);
194
+ config_set_default_uint (basicConfig, "AdvOut", "TrackIndex", 1);
195
+ config_set_default_uint (basicConfig, "AdvOut", "TrackCount", 1);
196
+ config_set_default_string(basicConfig, "AdvOut", "Encoder", "obs_x264");
197
+
198
+ config_set_default_string(basicConfig, "AdvOut", "RecType", "Standard");
199
+
200
+ config_set_default_string(basicConfig, "AdvOut", "RecFilePath",
201
+ GetDefaultVideoSavePath().c_str());
202
+ config_set_default_bool (basicConfig, "AdvOut", "RecUseRescale",
203
+ false);
204
+ config_set_default_bool (basicConfig, "AdvOut", "RecMultitrack",
205
+ false);
206
+ config_set_default_uint (basicConfig, "AdvOut", "RecTrackIndex", 1);
207
+ config_set_default_uint (basicConfig, "AdvOut", "RecTrackCount", 1);
208
+ config_set_default_string(basicConfig, "AdvOut", "RecEncoder",
209
+ "none");
210
+
211
+ config_set_default_uint (basicConfig, "AdvOut", "FFVBitrate", 2500);
212
+ config_set_default_bool (basicConfig, "AdvOut", "FFUseRescale",
213
+ false);
214
+ config_set_default_uint (basicConfig, "AdvOut", "FFABitrate", 160);
215
+ config_set_default_uint (basicConfig, "AdvOut", "FFAudioTrack", 1);
216
+
217
+ config_set_default_uint (basicConfig, "AdvOut", "Track1Bitrate", 160);
218
+ config_set_default_uint (basicConfig, "AdvOut", "Track2Bitrate", 160);
219
+ config_set_default_uint (basicConfig, "AdvOut", "Track3Bitrate", 160);
220
+ config_set_default_uint (basicConfig, "AdvOut", "Track4Bitrate", 160);
221
+
222
config_set_default_uint (basicConfig, "Video", "BaseCX", cx);
223
config_set_default_uint (basicConfig, "Video", "BaseCY", cy);
224
225
226
227
bool OBSBasic::InitBasicConfig()
228
{
229
- BPtr<char> configPath(os_get_config_path("obs-studio/basic/basic.ini"));
230
+ char configPath[512];
231
+ int ret = os_get_config_path(configPath, sizeof(configPath),
232
+ "obs-studio/basic/basic.ini");
233
+ if (ret <= 0) {
234
+ OBSErrorBox(nullptr, "Failed to get base.ini path");
235
+ return false;
236
+ }
237
238
int code = basicConfig.Open(configPath, CONFIG_OPEN_ALWAYS);
239
if (code != CONFIG_SUCCESS) {
240
241
obs_leave_graphics();
242
}
243
244
+void OBSBasic::ResetOutputs()
245
+{
246
+ const char *mode = config_get_string(basicConfig, "Output", "Mode");
247
+ bool advOut = astrcmpi(mode, "Advanced") == 0;
248
+
249
+ if (!outputHandler || !outputHandler->Active()) {
250
+ outputHandler.reset();
251
+ outputHandler.reset(advOut ?
252
+ CreateAdvancedOutputHandler(this) :
253
+ CreateSimpleOutputHandler(this));
254
+ } else {
255
+ outputHandler->Update();
256
+ }
257
+}
258
+
259
void OBSBasic::OBSInit()
260
{
261
- BPtr<char> savePath(os_get_config_path("obs-studio/basic/scenes.json"));
262
+ char savePath[512];
263
+ int ret = os_get_config_path(savePath, sizeof(savePath),
264
+ "obs-studio/basic/scenes.json");
265
+ if (ret <= 0)
266
+ throw "Failed to get scenes.json file path";
267
268
/* make sure it's fully displayed before doing any initialization */
269
show();
270
271
if (!ResetAudio())
272
throw "Failed to initialize audio";
273
274
- int ret = ResetVideo();
275
+ ret = ResetVideo();
276
277
switch (ret) {
278
case OBS_VIDEO_MODULE_NOT_FOUND:
279
280
AddExtraModulePaths();
281
obs_load_all_modules();
282
283
- if (!InitOutputs())
284
- throw "Failed to initialize outputs";
285
- if (!InitEncoders())
286
- throw "Failed to initialize encoders";
287
+ ResetOutputs();
288
+
289
if (!InitService())
290
throw "Failed to initialize service";
291
292
293
delete cpuUsageTimer;
294
os_cpu_usage_info_destroy(cpuUsageInfo);
295
296
+ outputHandler.reset();
297
+
298
if (interaction)
299
delete interaction;
300
301
302
303
void OBSBasic::SaveProject()
304
{
305
- BPtr<char> savePath(os_get_config_path("obs-studio/basic/scenes.json"));
306
- SaveService();
307
+ char savePath[512];
308
+ int ret = os_get_config_path(savePath, sizeof(savePath),
309
+ "obs-studio/basic/scenes.json");
310
+ if (ret <= 0)
311
+ return;
312
+
313
Save(savePath);
314
}
315
316
317
QString text = QTStr("ConfirmRemove.Text");
318
text.replace("$1", QT_UTF8(name));
319
320
- QMessageBox remove_source;
321
+ QMessageBox remove_source(this);
322
remove_source.setText(text);
323
QAbstractButton *Yes = remove_source.addButton(QTStr("Yes"),
324
QMessageBox::YesRole);
325
326
}
327
}
328
329
+bool OBSBasic::StreamingActive()
330
+{
331
+ if (!outputHandler)
332
+ return false;
333
+ return outputHandler->StreamingActive();
334
+}
335
+
336
#ifdef _WIN32
337
#define IS_WIN32 1
338
#else
339
340
341
void OBSBasic::closeEvent(QCloseEvent *event)
342
{
343
+ if (outputHandler && outputHandler->Active()) {
344
+ QMessageBox::StandardButton button = QMessageBox::question(
345
+ this, QTStr("ConfirmExit.Title"),
346
+ QTStr("ConfirmExit.Text"));
347
+
348
+ if (button == QMessageBox::No) {
349
+ event->ignore();
350
+ return;
351
+ }
352
+ }
353
+
354
QWidget::closeEvent(event);
355
if (!event->isAccepted())
356
return;
357
358
+ /* Check all child dialogs and ensure they run their proper closeEvent
359
+ * methods before exiting the application. Otherwise Qt doesn't send
360
+ * the proper QCloseEvent messages. */
361
+ QList<QDialog*> childDialogs = this->findChildren<QDialog *>();
362
+ if (!childDialogs.isEmpty()) {
363
+ for (int i = 0; i < childDialogs.size(); ++i) {
364
+ childDialogs.at(i)->close();
365
+ }
366
+ }
367
+
368
// remove draw callback in case our drawable surfaces go away before
369
// the destructor gets called
370
obs_remove_draw_callback(OBSBasic::RenderMain, this);
371
372
advAudioWindow->setAttribute(Qt::WA_DeleteOnClose, true);
373
}
374
375
+void OBSBasic::on_advAudioProps_clicked()
376
+{
377
+ on_actionAdvAudioProperties_triggered();
378
+}
379
+
380
void OBSBasic::on_scenes_currentItemChanged(QListWidgetItem *current,
381
QListWidgetItem *prev)
382
{
383
384
{
385
QListWidgetItem *item = ui->scenes->itemAt(pos);
386
387
- QMenu popup;
388
+ QMenu popup(this);
389
popup.addAction(QTStr("Add"),
390
this, SLOT(on_actionAddScene_triggered()));
391
392
393
{
394
QListWidgetItem *item = ui->sources->itemAt(pos);
395
396
- QMenu popup;
397
+ QMenu popup(this);
398
QPointer<QMenu> addSourceMenu = CreateAddSourcePopupMenu();
399
if (addSourceMenu)
400
popup.addMenu(addSourceMenu);
401
402
bool foundValues = false;
403
size_t idx = 0;
404
405
- QMenu *popup = new QMenu(QTStr("Add"));
406
+ QMenu *popup = new QMenu(QTStr("Add"), this);
407
while (obs_enum_input_types(idx++, &type)) {
408
const char *name = obs_source_get_display_name(
409
OBS_SOURCE_TYPE_INPUT, type);
410
411
412
static BPtr<char> ReadLogFile(const char *log)
413
{
414
- BPtr<char> logDir(os_get_config_path("obs-studio/logs"));
415
+ char logDir[512];
416
+ if (os_get_config_path(logDir, sizeof(logDir), "obs-studio/logs") <= 0)
417
+ return nullptr;
418
419
string path = (char*)logDir;
420
path += "/";
421
422
423
void OBSBasic::on_actionShowLogs_triggered()
424
{
425
- BPtr<char> logDir(os_get_config_path("obs-studio/logs"));
426
+ char logDir[512];
427
+ if (os_get_config_path(logDir, sizeof(logDir), "obs-studio/logs") <= 0)
428
+ return;
429
+
430
QUrl url = QUrl::fromLocalFile(QT_UTF8(logDir));
431
QDesktopServices::openUrl(url);
432
}
433
434
{
435
ui->streamButton->setText(QTStr("Basic.Main.StopStreaming"));
436
ui->streamButton->setEnabled(true);
437
- ui->statusbar->StreamStarted(streamOutput);
438
+ ui->statusbar->StreamStarted(outputHandler->streamOutput);
439
}
440
441
void OBSBasic::StreamingStop(int code)
442
443
errorMessage = Str("Output.ConnectFail.Disconnected");
444
}
445
446
- activeRefs--;
447
ui->statusbar->StreamStopped();
448
449
ui->streamButton->setText(QTStr("Basic.Main.StartStreaming"));
450
451
452
void OBSBasic::RecordingStart()
453
{
454
- ui->statusbar->RecordingStarted(fileOutput);
455
+ ui->statusbar->RecordingStarted(outputHandler->fileOutput);
456
}
457
458
void OBSBasic::RecordingStop()
459
{
460
ui->statusbar->RecordingStopped();
461
- activeRefs--;
462
ui->recordButton->setText(QTStr("Basic.Main.StartRecording"));
463
}
464
465
-void OBSBasic::SetupEncoders()
466
-{
467
- if (activeRefs == 0) {
468
- obs_data_t *x264Settings = obs_data_create();
469
- obs_data_t *aacSettings = obs_data_create();
470
-
471
- int videoBitrate = config_get_uint(basicConfig, "SimpleOutput",
472
- "VBitrate");
473
- int audioBitrate = config_get_uint(basicConfig, "SimpleOutput",
474
- "ABitrate");
475
- bool advanced = config_get_bool(basicConfig, "SimpleOutput",
476
- "UseAdvanced");
477
- bool useCBR = config_get_bool(basicConfig, "SimpleOutput",
478
- "UseCBR");
479
- const char *preset = config_get_string(basicConfig,
480
- "SimpleOutput", "Preset");
481
- const char *custom = config_get_string(basicConfig,
482
- "SimpleOutput", "x264Settings");
483
-
484
- obs_data_set_int(x264Settings, "bitrate", videoBitrate);
485
- obs_data_set_int(x264Settings, "buffer_size", videoBitrate);
486
-
487
- if (advanced) {
488
- obs_data_set_string(x264Settings, "preset", preset);
489
- obs_data_set_string(x264Settings, "x264opts", custom);
490
- obs_data_set_bool(x264Settings, "cbr", useCBR);
491
- } else {
492
- obs_data_set_bool(x264Settings, "cbr", true);
493
- }
494
-
495
- obs_data_set_int(aacSettings, "bitrate", audioBitrate);
496
-
497
- obs_encoder_update(x264, x264Settings);
498
- obs_encoder_update(aac, aacSettings);
499
-
500
- obs_data_release(x264Settings);
501
- obs_data_release(aacSettings);
502
-
503
- obs_encoder_set_video(x264, obs_get_video());
504
- obs_encoder_set_audio(aac, obs_get_audio());
505
- }
506
-}
507
-
508
void OBSBasic::on_streamButton_clicked()
509
{
510
SaveProject();
511
512
- if (obs_output_active(streamOutput)) {
513
- obs_output_stop(streamOutput);
514
+ if (outputHandler->StreamingActive()) {
515
+ outputHandler->StopStreaming();
516
} else {
517
-
518
- SaveService();
519
- SetupEncoders();
520
-
521
- obs_output_set_video_encoder(streamOutput, x264);
522
- obs_output_set_audio_encoder(streamOutput, aac);
523
- obs_output_set_service(streamOutput, service);
524
-
525
- bool reconnect = config_get_bool(basicConfig, "SimpleOutput",
526
- "Reconnect");
527
- int retryDelay = config_get_uint(basicConfig, "SimpleOutput",
528
- "RetryDelay");
529
- int maxRetries = config_get_uint(basicConfig, "SimpleOutput",
530
- "MaxRetries");
531
- if (!reconnect)
532
- maxRetries = 0;
533
-
534
- obs_output_set_reconnect_settings(streamOutput, maxRetries,
535
- retryDelay);
536
-
537
- if (obs_output_start(streamOutput)) {
538
- activeRefs++;
539
-
540
+ if (outputHandler->StartStreaming(service)) {
541
ui->streamButton->setEnabled(false);
542
ui->streamButton->setText(
543
QTStr("Basic.Main.Connecting"));
544
545
{
546
SaveProject();
547
548
- if (obs_output_active(fileOutput)) {
549
- obs_output_stop(fileOutput);
550
+ if (outputHandler->RecordingActive()) {
551
+ outputHandler->StopRecording();
552
} else {
553
554
- const char *path = config_get_string(basicConfig,
555
- "SimpleOutput", "FilePath");
556
-
557
- os_dir_t *dir = path ? os_opendir(path) : nullptr;
558
-
559
- if (!dir) {
560
- QMessageBox::information(this,
561
- QTStr("Output.BadPath.Title"),
562
- QTStr("Output.BadPath.Text"));
563
- return;
564
- }
565
-
566
- os_closedir(dir);
567
-
568
- string strPath;
569
- strPath += path;
570
-
571
- char lastChar = strPath.back();
572
- if (lastChar != '/' && lastChar != '\\')
573
- strPath += "/";
574
-
575
- strPath += GenerateTimeDateFilename("flv");
576
-
577
- SetupEncoders();
578
-
579
- obs_output_set_video_encoder(fileOutput, x264);
580
- obs_output_set_audio_encoder(fileOutput, aac);
581
-
582
- obs_data_t *settings = obs_data_create();
583
- obs_data_set_string(settings, "path", strPath.c_str());
584
-
585
- obs_output_update(fileOutput, settings);
586
-
587
- obs_data_release(settings);
588
-
589
- if (obs_output_start(fileOutput)) {
590
- activeRefs++;
591
-
592
+ if (outputHandler->StartRecording()) {
593
ui->recordButton->setText(
594
QTStr("Basic.Main.StopRecording"));
595
}
596
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/window-basic-main.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/window-basic-main.hpp
Changed
76
1
2
#define AUX_AUDIO_2 Str("AuxAudioDevice2")
3
#define AUX_AUDIO_3 Str("AuxAudioDevice3")
4
5
+struct BasicOutputHandler;
6
+
7
class OBSBasic : public OBSMainWindow {
8
Q_OBJECT
9
10
11
QPointer<QTimer> cpuUsageTimer;
12
os_cpu_usage_info_t *cpuUsageInfo = nullptr;
13
14
- obs_output_t *fileOutput = nullptr;
15
- obs_output_t *streamOutput = nullptr;
16
obs_service_t *service = nullptr;
17
- obs_encoder_t *aac = nullptr;
18
- obs_encoder_t *x264 = nullptr;
19
+ std::unique_ptr<BasicOutputHandler> outputHandler;
20
21
gs_vertbuffer_t *box = nullptr;
22
gs_vertbuffer_t *circle = nullptr;
23
24
25
ConfigFile basicConfig;
26
27
- int activeRefs = 0;
28
-
29
void DrawBackdrop(float cx, float cy);
30
31
void SetupEncoders();
32
33
void Save(const char *file);
34
void Load(const char *file);
35
36
- void SaveService();
37
- bool LoadService();
38
-
39
- bool InitOutputs();
40
- bool InitEncoders();
41
bool InitService();
42
43
bool InitBasicConfigDefaults();
44
45
obs_service_t *GetService();
46
void SetService(obs_service_t *service);
47
48
+ bool StreamingActive();
49
+
50
int ResetVideo();
51
bool ResetAudio();
52
53
+ void ResetOutputs();
54
+
55
void ResetAudioDevice(const char *sourceId, const char *deviceName,
56
const char *deviceDesc, int channel);
57
void ResetAudioDevices();
58
59
return os_cpu_usage_info_query(cpuUsageInfo);
60
}
61
62
+ void SaveService();
63
+ bool LoadService();
64
+
65
protected:
66
virtual void closeEvent(QCloseEvent *event) override;
67
virtual void changeEvent(QEvent *event) override;
68
69
void on_actionRemux_triggered();
70
void on_action_Settings_triggered();
71
void on_actionAdvAudioProperties_triggered();
72
+ void on_advAudioProps_clicked();
73
void on_actionShowLogs_triggered();
74
void on_actionUploadCurrentLog_triggered();
75
void on_actionUploadLastLog_triggered();
76
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/window-basic-properties.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/window-basic-properties.cpp
Changed
146
1
2
#include <QCloseEvent>
3
#include <QScreen>
4
#include <QWindow>
5
+#include <QMessageBox>
6
7
using namespace std;
8
9
10
: QDialog (parent),
11
main (qobject_cast<OBSBasic*>(parent)),
12
resizeTimer (0),
13
+ acceptClicked (false),
14
ui (new Ui::OBSBasicProperties),
15
source (source_),
16
removedSignal (obs_source_get_signal_handler(source),
17
18
updatePropertiesSignal (obs_source_get_signal_handler(source),
19
"update_properties",
20
OBSBasicProperties::UpdateProperties,
21
- this)
22
-
23
+ this),
24
+ oldSettings (obs_data_create()),
25
+ buttonBox (new QDialogButtonBox(this))
26
{
27
int cx = (int)config_get_int(App()->GlobalConfig(), "PropertiesWindow",
28
"cx");
29
int cy = (int)config_get_int(App()->GlobalConfig(), "PropertiesWindow",
30
"cy");
31
32
+ buttonBox->setStandardButtons(QDialogButtonBox::Ok |
33
+ QDialogButtonBox::Cancel);
34
+ buttonBox->setObjectName(QStringLiteral("buttonBox"));
35
+
36
ui->setupUi(this);
37
38
if (cx > 400 && cy > 400)
39
resize(cx, cy);
40
41
OBSData settings = obs_source_get_settings(source);
42
+ obs_data_apply(oldSettings, settings);
43
obs_data_release(settings);
44
45
view = new OBSPropertiesView(settings, source,
46
47
(PropertiesUpdateCallback)obs_source_update);
48
49
layout()->addWidget(view);
50
+ layout()->addWidget(buttonBox);
51
+ layout()->setAlignment(buttonBox, Qt::AlignRight | Qt::AlignBottom);
52
layout()->setAlignment(view, Qt::AlignBottom);
53
view->setMaximumHeight(250);
54
view->setMinimumHeight(150);
55
56
"ReloadProperties");
57
}
58
59
+void OBSBasicProperties::on_buttonBox_clicked(QAbstractButton *button)
60
+{
61
+ QDialogButtonBox::ButtonRole val = buttonBox->buttonRole(button);
62
+
63
+ if (val == QDialogButtonBox::AcceptRole) {
64
+ acceptClicked = true;
65
+ close();
66
+ }
67
+
68
+ if (val == QDialogButtonBox::RejectRole) {
69
+ obs_data_t *settings = obs_source_get_settings(source);
70
+ obs_data_clear(settings);
71
+ obs_data_release(settings);
72
+
73
+ obs_source_update(source, oldSettings);
74
+
75
+ close();
76
+ }
77
+}
78
+
79
void OBSBasicProperties::DrawPreview(void *data, uint32_t cx, uint32_t cy)
80
{
81
OBSBasicProperties *window = static_cast<OBSBasicProperties*>(data);
82
83
84
void OBSBasicProperties::closeEvent(QCloseEvent *event)
85
{
86
+ if (!acceptClicked && (CheckSettings() != 0)) {
87
+ if (!ConfirmQuit()) {
88
+ event->ignore();
89
+ return;
90
+ }
91
+ }
92
+
93
QDialog::closeEvent(event);
94
if (!event->isAccepted())
95
return;
96
97
+ obs_data_release(oldSettings);
98
+
99
// remove draw callback and release display in case our drawable
100
// surfaces go away before the destructor gets called
101
obs_display_remove_draw_callback(display,
102
103
obs_display_add_draw_callback(display,
104
OBSBasicProperties::DrawPreview, this);
105
}
106
+
107
+int OBSBasicProperties::CheckSettings()
108
+{
109
+ OBSData currentSettings = obs_source_get_settings(source);
110
+ const char *oldSettingsJson = obs_data_get_json(oldSettings);
111
+ const char *currentSettingsJson = obs_data_get_json(currentSettings);
112
+
113
+ int ret = strcmp(currentSettingsJson, oldSettingsJson);
114
+
115
+ obs_data_release(currentSettings);
116
+ return ret;
117
+}
118
+
119
+bool OBSBasicProperties::ConfirmQuit()
120
+{
121
+ QMessageBox::StandardButton button;
122
+
123
+ button = QMessageBox::question(this,
124
+ QTStr("Basic.PropertiesWindow.ConfirmTitle"),
125
+ QTStr("Basic.PropertiesWindow.Confirm"),
126
+ QMessageBox::Save | QMessageBox::Discard |
127
+ QMessageBox::Cancel);
128
+
129
+ switch (button) {
130
+ case QMessageBox::Save:
131
+ // Do nothing because the settings are already updated
132
+ break;
133
+ case QMessageBox::Discard:
134
+ obs_source_update(source, oldSettings);
135
+ break;
136
+ case QMessageBox::Cancel:
137
+ return false;
138
+ break;
139
+ default:
140
+ /* If somehow the dialog fails to show, just default to
141
+ * saving the settings. */
142
+ break;
143
+ }
144
+ return true;
145
+}
146
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/window-basic-properties.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/window-basic-properties.hpp
Changed
38
1
2
#pragma once
3
4
#include <QDialog>
5
+#include <QDialogButtonBox>
6
#include <memory>
7
-
8
#include <obs.hpp>
9
10
#include "properties-view.hpp"
11
12
private:
13
OBSBasic *main;
14
int resizeTimer;
15
+ bool acceptClicked;
16
17
std::unique_ptr<Ui::OBSBasicProperties> ui;
18
OBSSource source;
19
OBSDisplay display;
20
OBSSignal removedSignal;
21
OBSSignal updatePropertiesSignal;
22
+ OBSData oldSettings;
23
OBSPropertiesView *view;
24
+ QDialogButtonBox *buttonBox;
25
26
static void SourceRemoved(void *data, calldata_t *params);
27
static void UpdateProperties(void *data, calldata_t *params);
28
static void DrawPreview(void *data, uint32_t cx, uint32_t cy);
29
+ bool ConfirmQuit();
30
+ int CheckSettings();
31
32
private slots:
33
void OnPropertiesResized();
34
+ void on_buttonBox_clicked(QAbstractButton *button);
35
36
public:
37
OBSBasicProperties(QWidget *parent, OBSSource source_);
38
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/window-basic-settings.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/window-basic-settings.cpp
Changed
980
1
2
#define SCROLL_CHANGED SIGNAL(valueChanged(int))
3
4
#define GENERAL_CHANGED SLOT(GeneralChanged())
5
+#define STREAM1_CHANGED SLOT(Stream1Changed())
6
#define OUTPUTS_CHANGED SLOT(OutputsChanged())
7
#define AUDIO_RESTART SLOT(AudioChangedRestart())
8
#define AUDIO_CHANGED SLOT(AudioChanged())
9
#define VIDEO_RESTART SLOT(VideoChangedRestart())
10
#define VIDEO_RES SLOT(VideoChangedResolution())
11
#define VIDEO_CHANGED SLOT(VideoChanged())
12
+#define ADV_CHANGED SLOT(AdvancedChanged())
13
+#define ADV_RESTART SLOT(AdvancedChangedRestart())
14
15
OBSBasicSettings::OBSBasicSettings(QWidget *parent)
16
: QDialog (parent),
17
main (qobject_cast<OBSBasic*>(parent)),
18
- ui (new Ui::OBSBasicSettings),
19
- generalChanged (false),
20
- outputsChanged (false),
21
- audioChanged (false),
22
- videoChanged (false),
23
- pageIndex (0),
24
- loading (true),
25
- streamProperties (nullptr)
26
+ ui (new Ui::OBSBasicSettings)
27
{
28
string path;
29
30
31
32
HookWidget(ui->language, COMBO_CHANGED, GENERAL_CHANGED);
33
HookWidget(ui->outputMode, COMBO_CHANGED, OUTPUTS_CHANGED);
34
+ HookWidget(ui->streamType, COMBO_CHANGED, STREAM1_CHANGED);
35
HookWidget(ui->simpleOutputPath, EDIT_CHANGED, OUTPUTS_CHANGED);
36
HookWidget(ui->simpleOutputVBitrate, SCROLL_CHANGED, OUTPUTS_CHANGED);
37
HookWidget(ui->simpleOutputABitrate, COMBO_CHANGED, OUTPUTS_CHANGED);
38
39
HookWidget(ui->simpleOutAdvanced, CHECK_CHANGED, OUTPUTS_CHANGED);
40
HookWidget(ui->simpleOutUseCBR, CHECK_CHANGED, OUTPUTS_CHANGED);
41
HookWidget(ui->simpleOutPreset, COMBO_CHANGED, OUTPUTS_CHANGED);
42
- HookWidget(ui->simpleOutCustomX264, EDIT_CHANGED, OUTPUTS_CHANGED);
43
+ HookWidget(ui->simpleOutUseBufsize, CHECK_CHANGED, OUTPUTS_CHANGED);
44
+ HookWidget(ui->simpleOutPreset, COMBO_CHANGED, OUTPUTS_CHANGED);
45
+ HookWidget(ui->simpleOutVBufsize, SCROLL_CHANGED, OUTPUTS_CHANGED);
46
+ HookWidget(ui->simpleOutCustom, EDIT_CHANGED, OUTPUTS_CHANGED);
47
+ HookWidget(ui->advOutReconnect, CHECK_CHANGED, OUTPUTS_CHANGED);
48
+ HookWidget(ui->advOutRetryDelay, SCROLL_CHANGED, OUTPUTS_CHANGED);
49
+ HookWidget(ui->advOutMaxRetries, SCROLL_CHANGED, OUTPUTS_CHANGED);
50
+ HookWidget(ui->advOutEncoder, COMBO_CHANGED, OUTPUTS_CHANGED);
51
+ HookWidget(ui->advOutUseRescale, CHECK_CHANGED, OUTPUTS_CHANGED);
52
+ HookWidget(ui->advOutRescale, CBEDIT_CHANGED, OUTPUTS_CHANGED);
53
+ HookWidget(ui->advOutTrack1, CHECK_CHANGED, OUTPUTS_CHANGED);
54
+ HookWidget(ui->advOutTrack2, CHECK_CHANGED, OUTPUTS_CHANGED);
55
+ HookWidget(ui->advOutTrack3, CHECK_CHANGED, OUTPUTS_CHANGED);
56
+ HookWidget(ui->advOutTrack4, CHECK_CHANGED, OUTPUTS_CHANGED);
57
+ HookWidget(ui->advOutApplyService, CHECK_CHANGED, OUTPUTS_CHANGED);
58
+ HookWidget(ui->advOutRecType, COMBO_CHANGED, OUTPUTS_CHANGED);
59
+ HookWidget(ui->advOutRecPath, EDIT_CHANGED, OUTPUTS_CHANGED);
60
+ HookWidget(ui->advOutRecEncoder, COMBO_CHANGED, OUTPUTS_CHANGED);
61
+ HookWidget(ui->advOutRecUseRescale, CHECK_CHANGED, OUTPUTS_CHANGED);
62
+ HookWidget(ui->advOutRecRescale, CBEDIT_CHANGED, OUTPUTS_CHANGED);
63
+ HookWidget(ui->advOutRecTrack1, CHECK_CHANGED, OUTPUTS_CHANGED);
64
+ HookWidget(ui->advOutRecTrack2, CHECK_CHANGED, OUTPUTS_CHANGED);
65
+ HookWidget(ui->advOutRecTrack3, CHECK_CHANGED, OUTPUTS_CHANGED);
66
+ HookWidget(ui->advOutRecTrack4, CHECK_CHANGED, OUTPUTS_CHANGED);
67
+ HookWidget(ui->advOutFFURL, EDIT_CHANGED, OUTPUTS_CHANGED);
68
+ HookWidget(ui->advOutFFVBitrate, SCROLL_CHANGED, OUTPUTS_CHANGED);
69
+ HookWidget(ui->advOutFFUseRescale, CHECK_CHANGED, OUTPUTS_CHANGED);
70
+ HookWidget(ui->advOutFFRescale, CBEDIT_CHANGED, OUTPUTS_CHANGED);
71
+ HookWidget(ui->advOutFFVEncoder, EDIT_CHANGED, OUTPUTS_CHANGED);
72
+ HookWidget(ui->advOutFFVCfg, EDIT_CHANGED, OUTPUTS_CHANGED);
73
+ HookWidget(ui->advOutFFABitrate, SCROLL_CHANGED, OUTPUTS_CHANGED);
74
+ HookWidget(ui->advOutFFTrack1, CHECK_CHANGED, OUTPUTS_CHANGED);
75
+ HookWidget(ui->advOutFFTrack2, CHECK_CHANGED, OUTPUTS_CHANGED);
76
+ HookWidget(ui->advOutFFTrack3, CHECK_CHANGED, OUTPUTS_CHANGED);
77
+ HookWidget(ui->advOutFFTrack4, CHECK_CHANGED, OUTPUTS_CHANGED);
78
+ HookWidget(ui->advOutFFAEncoder, EDIT_CHANGED, OUTPUTS_CHANGED);
79
+ HookWidget(ui->advOutFFACfg, EDIT_CHANGED, OUTPUTS_CHANGED);
80
+ HookWidget(ui->advOutTrack1Bitrate, COMBO_CHANGED, OUTPUTS_CHANGED);
81
+ HookWidget(ui->advOutTrack1Name, EDIT_CHANGED, OUTPUTS_CHANGED);
82
+ HookWidget(ui->advOutTrack2Bitrate, COMBO_CHANGED, OUTPUTS_CHANGED);
83
+ HookWidget(ui->advOutTrack2Name, EDIT_CHANGED, OUTPUTS_CHANGED);
84
+ HookWidget(ui->advOutTrack3Bitrate, COMBO_CHANGED, OUTPUTS_CHANGED);
85
+ HookWidget(ui->advOutTrack3Name, EDIT_CHANGED, OUTPUTS_CHANGED);
86
+ HookWidget(ui->advOutTrack4Bitrate, COMBO_CHANGED, OUTPUTS_CHANGED);
87
+ HookWidget(ui->advOutTrack4Name, EDIT_CHANGED, OUTPUTS_CHANGED);
88
HookWidget(ui->channelSetup, COMBO_CHANGED, AUDIO_RESTART);
89
HookWidget(ui->sampleRate, COMBO_CHANGED, AUDIO_RESTART);
90
HookWidget(ui->desktopAudioDevice1, COMBO_CHANGED, AUDIO_CHANGED);
91
92
HookWidget(ui->fpsInteger, SCROLL_CHANGED, VIDEO_CHANGED);
93
HookWidget(ui->fpsNumerator, SCROLL_CHANGED, VIDEO_CHANGED);
94
HookWidget(ui->fpsDenominator, SCROLL_CHANGED, VIDEO_CHANGED);
95
+ HookWidget(ui->audioBufferingTime, SCROLL_CHANGED, ADV_RESTART);
96
+ HookWidget(ui->colorFormat, COMBO_CHANGED, ADV_CHANGED);
97
+ HookWidget(ui->colorSpace, COMBO_CHANGED, ADV_CHANGED);
98
+ HookWidget(ui->colorRange, COMBO_CHANGED, ADV_CHANGED);
99
100
//Apply button disabled until change.
101
EnableApplyButton(false);
102
103
LoadServiceTypes();
104
- LoadServiceInfo();
105
+ LoadEncoderTypes();
106
+ LoadColorRanges();
107
LoadSettings(false);
108
}
109
110
111
}
112
}
113
114
-void OBSBasicSettings::SaveCheckBox(QCheckBox *widget, const char *section,
115
- const char *value)
116
+void OBSBasicSettings::SaveCheckBox(QAbstractButton *widget,
117
+ const char *section, const char *value, bool invert)
118
{
119
- if (WidgetChanged(widget))
120
- config_set_bool(main->Config(), section, value,
121
- widget->isChecked());
122
+ if (WidgetChanged(widget)) {
123
+ bool checked = widget->isChecked();
124
+ if (invert) checked = !checked;
125
+
126
+ config_set_bool(main->Config(), section, value, checked);
127
+ }
128
}
129
130
void OBSBasicSettings::SaveEdit(QLineEdit *widget, const char *section,
131
132
ui->streamType->addItem(qName, qType);
133
}
134
135
- type = obs_service_gettype(main->GetService());
136
+ type = obs_service_get_type(main->GetService());
137
SetComboByValue(ui->streamType, type);
138
}
139
140
-void OBSBasicSettings::LoadServiceInfo()
141
+#define TEXT_USE_STREAM_ENC \
142
+ QTStr("Basic.Settings.Output.Adv.Recording.UseStreamEncoder")
143
+
144
+void OBSBasicSettings::LoadEncoderTypes()
145
{
146
- QLayout *layout = ui->streamContainer->layout();
147
- obs_service_t *service = main->GetService();
148
- obs_data_t *settings = obs_service_get_settings(service);
149
+ const char *type;
150
+ size_t idx = 0;
151
152
- delete streamProperties;
153
- streamProperties = new OBSPropertiesView(settings, service,
154
- (PropertiesReloadCallback)obs_service_properties,
155
- (PropertiesUpdateCallback)obs_service_update,
156
- 170);
157
+ ui->advOutRecEncoder->addItem(TEXT_USE_STREAM_ENC, "none");
158
159
- layout->addWidget(streamProperties);
160
+ while (obs_enum_encoder_types(idx++, &type)) {
161
+ const char *name = obs_encoder_get_display_name(type);
162
+ const char *codec = obs_get_encoder_codec(type);
163
164
- obs_data_release(settings);
165
+ if (strcmp(codec, "h264") != 0)
166
+ continue;
167
+
168
+ QString qName = QT_UTF8(name);
169
+ QString qType = QT_UTF8(type);
170
+
171
+ ui->advOutEncoder->addItem(qName, qType);
172
+ ui->advOutRecEncoder->addItem(qName, qType);
173
+ }
174
+}
175
+
176
+#define CS_PARTIAL_STR QTStr("Basic.Settings.Advanced.Video.ColorRange.Partial")
177
+#define CS_FULL_STR QTStr("Basic.Settings.Advanced.Video.ColorRange.Full")
178
+
179
+void OBSBasicSettings::LoadColorRanges()
180
+{
181
+ ui->colorRange->addItem(CS_PARTIAL_STR, "Partial");
182
+ ui->colorRange->addItem(CS_FULL_STR, "Full");
183
}
184
185
void OBSBasicSettings::LoadLanguageList()
186
187
loading = false;
188
}
189
190
+void OBSBasicSettings::LoadStream1Settings()
191
+{
192
+ QLayout *layout = ui->streamContainer->layout();
193
+ obs_service_t *service = main->GetService();
194
+ const char *type = obs_service_get_type(service);
195
+
196
+ loading = true;
197
+
198
+ obs_data_t *settings = obs_service_get_settings(service);
199
+
200
+ delete streamProperties;
201
+ streamProperties = new OBSPropertiesView(settings, type,
202
+ (PropertiesReloadCallback)obs_get_service_properties,
203
+ 170);
204
+
205
+ streamProperties->setProperty("changed", QVariant(false));
206
+ layout->addWidget(streamProperties);
207
+
208
+ QObject::connect(streamProperties, SIGNAL(Changed()),
209
+ this, STREAM1_CHANGED);
210
+
211
+ obs_data_release(settings);
212
+
213
+ loading = false;
214
+
215
+ if (main->StreamingActive()) {
216
+ ui->streamType->setEnabled(false);
217
+ ui->streamContainer->setEnabled(false);
218
+ }
219
+}
220
+
221
void OBSBasicSettings::LoadRendererList()
222
{
223
const char *renderer = config_get_string(GetGlobalConfig(), "Video",
224
225
226
static const size_t numVals = sizeof(vals)/sizeof(double);
227
228
-void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy)
229
+void OBSBasicSettings::ResetDownscales(uint32_t cx, uint32_t cy,
230
+ uint32_t out_cx, uint32_t out_cy)
231
{
232
+ QString advRescale;
233
+ QString advRecRescale;
234
+ QString advFFRescale;
235
+
236
+ advRescale = ui->advOutRescale->lineEdit()->text();
237
+ advRecRescale = ui->advOutRecRescale->lineEdit()->text();
238
+ advFFRescale = ui->advOutFFRescale->lineEdit()->text();
239
+
240
ui->outputResolution->clear();
241
+ ui->advOutRescale->clear();
242
+ ui->advOutRecRescale->clear();
243
+ ui->advOutFFRescale->clear();
244
245
for (size_t idx = 0; idx < numVals; idx++) {
246
uint32_t downscaleCX = uint32_t(double(cx) / vals[idx]);
247
uint32_t downscaleCY = uint32_t(double(cy) / vals[idx]);
248
+ uint32_t outDownscaleCX = uint32_t(double(out_cx) / vals[idx]);
249
+ uint32_t outDownscaleCY = uint32_t(double(out_cy) / vals[idx]);
250
+
251
+ downscaleCX &= 0xFFFFFFFC;
252
+ downscaleCY &= 0xFFFFFFFE;
253
+ outDownscaleCX &= 0xFFFFFFFE;
254
+ outDownscaleCY &= 0xFFFFFFFE;
255
256
string res = ResString(downscaleCX, downscaleCY);
257
+ string outRes = ResString(outDownscaleCX, outDownscaleCY);
258
ui->outputResolution->addItem(res.c_str());
259
+ ui->advOutRescale->addItem(outRes.c_str());
260
+ ui->advOutRecRescale->addItem(outRes.c_str());
261
+ ui->advOutFFRescale->addItem(outRes.c_str());
262
}
263
264
- ui->outputResolution->lineEdit()->setText(ResString(cx, cy).c_str());
265
+ string res = ResString(cx, cy);
266
+
267
+ ui->outputResolution->lineEdit()->setText(res.c_str());
268
+
269
+ if (advRescale.isEmpty())
270
+ advRescale = res.c_str();
271
+ if (advRecRescale.isEmpty())
272
+ advRecRescale = res.c_str();
273
+ if (advFFRescale.isEmpty())
274
+ advFFRescale = res.c_str();
275
+
276
+ ui->advOutRescale->lineEdit()->setText(advRescale);
277
+ ui->advOutRecRescale->lineEdit()->setText(advRecRescale);
278
+ ui->advOutFFRescale->lineEdit()->setText(advFFRescale);
279
}
280
281
void OBSBasicSettings::LoadDownscaleFilters()
282
283
{
284
uint32_t cx = config_get_uint(main->Config(), "Video", "BaseCX");
285
uint32_t cy = config_get_uint(main->Config(), "Video", "BaseCY");
286
+ uint32_t out_cx = config_get_uint(main->Config(), "Video", "OutputCX");
287
+ uint32_t out_cy = config_get_uint(main->Config(), "Video", "OutputCY");
288
vector<MonitorInfo> monitors;
289
290
ui->baseResolution->clear();
291
292
ui->baseResolution->addItem(res.c_str());
293
}
294
295
- ResetDownscales(cx, cy);
296
+ ResetDownscales(cx, cy, out_cx, out_cy);
297
298
ui->baseResolution->lineEdit()->setText(ResString(cx, cy).c_str());
299
-
300
- cx = config_get_uint(main->Config(), "Video", "OutputCX");
301
- cy = config_get_uint(main->Config(), "Video", "OutputCY");
302
-
303
- ui->outputResolution->lineEdit()->setText(ResString(cx, cy).c_str());
304
+ ui->outputResolution->lineEdit()->setText(
305
+ ResString(out_cx, out_cy).c_str());
306
}
307
308
static inline void LoadFPSCommon(OBSBasic *main, Ui::OBSBasicSettings *ui)
309
310
"FilePath");
311
int videoBitrate = config_get_uint(main->Config(), "SimpleOutput",
312
"VBitrate");
313
+ int videoBufsize = config_get_uint(main->Config(), "SimpleOutput",
314
+ "Bufsize");
315
int audioBitrate = config_get_uint(main->Config(), "SimpleOutput",
316
"ABitrate");
317
bool reconnect = config_get_bool(main->Config(), "SimpleOutput",
318
319
"UseAdvanced");
320
bool useCBR = config_get_bool(main->Config(), "SimpleOutput",
321
"UseCBR");
322
+ bool useBufsize = config_get_bool(main->Config(), "SimpleOutput",
323
+ "UseBufsize");
324
const char *preset = config_get_string(main->Config(), "SimpleOutput",
325
"Preset");
326
const char *custom = config_get_string(main->Config(), "SimpleOutput",
327
328
329
ui->simpleOutputPath->setText(path);
330
ui->simpleOutputVBitrate->setValue(videoBitrate);
331
+ ui->simpleOutUseBufsize->setChecked(useBufsize);
332
+ ui->simpleOutVBufsize->setValue(
333
+ useBufsize ? videoBufsize : videoBitrate);
334
335
SetComboByName(ui->simpleOutputABitrate,
336
std::to_string(audioBitrate).c_str());
337
338
ui->simpleOutAdvanced->setChecked(advanced);
339
ui->simpleOutUseCBR->setChecked(useCBR);
340
ui->simpleOutPreset->setCurrentText(preset);
341
- ui->simpleOutCustomX264->setText(custom);
342
+ ui->simpleOutCustom->setText(custom);
343
+}
344
+
345
+void OBSBasicSettings::LoadAdvOutputStreamingSettings()
346
+{
347
+ bool reconnect = config_get_bool(main->Config(), "AdvOut",
348
+ "Reconnect");
349
+ int retryDelay = config_get_int(main->Config(), "AdvOut",
350
+ "RetryDelay");
351
+ int maxRetries = config_get_int(main->Config(), "AdvOut",
352
+ "MaxRetries");
353
+ bool rescale = config_get_bool(main->Config(), "AdvOut",
354
+ "Rescale");
355
+ const char *rescaleRes = config_get_string(main->Config(), "AdvOut",
356
+ "RescaleRes");
357
+ int trackIndex = config_get_int(main->Config(), "AdvOut",
358
+ "TrackIndex");
359
+ bool applyServiceSettings = config_get_bool(main->Config(), "AdvOut",
360
+ "ApplyServiceSettings");
361
+
362
+ ui->advOutReconnect->setChecked(reconnect);
363
+ ui->advOutRetryDelay->setValue(retryDelay);
364
+ ui->advOutMaxRetries->setValue(maxRetries);
365
+ ui->advOutApplyService->setChecked(applyServiceSettings);
366
+ ui->advOutUseRescale->setChecked(rescale);
367
+ ui->advOutRescale->setCurrentText(rescaleRes);
368
+
369
+ switch (trackIndex) {
370
+ case 1: ui->advOutTrack1->setChecked(true); break;
371
+ case 2: ui->advOutTrack2->setChecked(true); break;
372
+ case 3: ui->advOutTrack3->setChecked(true); break;
373
+ case 4: ui->advOutTrack4->setChecked(true); break;
374
+ }
375
+}
376
+
377
+OBSPropertiesView *OBSBasicSettings::CreateEncoderPropertyView(
378
+ const char *encoder, const char *path, bool changed)
379
+{
380
+ obs_data_t *settings = obs_encoder_defaults(encoder);
381
+ OBSPropertiesView *view;
382
+
383
+ char encoderJsonPath[512];
384
+ int ret = os_get_config_path(encoderJsonPath, sizeof(encoderJsonPath),
385
+ path);
386
+ if (ret > 0) {
387
+ BPtr<char> jsonData = os_quick_read_utf8_file(encoderJsonPath);
388
+ if (!!jsonData) {
389
+ obs_data_t *data = obs_data_create_from_json(jsonData);
390
+ obs_data_apply(settings, data);
391
+ obs_data_release(data);
392
+ }
393
+ }
394
+
395
+ view = new OBSPropertiesView(settings, encoder,
396
+ (PropertiesReloadCallback)obs_get_encoder_properties,
397
+ 170);
398
+ view->setFrameShape(QFrame::StyledPanel);
399
+ view->setProperty("changed", QVariant(changed));
400
+ QObject::connect(view, SIGNAL(Changed()), this, SLOT(OutputsChanged()));
401
+
402
+ obs_data_release(settings);
403
+ return view;
404
+}
405
+
406
+void OBSBasicSettings::LoadAdvOutputStreamingEncoderProperties()
407
+{
408
+ const char *encoder = config_get_string(main->Config(), "AdvOut",
409
+ "Encoder");
410
+
411
+ delete streamEncoderProps;
412
+ streamEncoderProps = CreateEncoderPropertyView(encoder,
413
+ "obs-studio/basic/streamEncoder.json");
414
+ ui->advOutputStreamTab->layout()->addWidget(streamEncoderProps);
415
+
416
+ SetComboByValue(ui->advOutEncoder, encoder);
417
+}
418
+
419
+void OBSBasicSettings::LoadAdvOutputRecordingSettings()
420
+{
421
+ const char *type = config_get_string(main->Config(), "AdvOut",
422
+ "RecType");
423
+ const char *path = config_get_string(main->Config(), "AdvOut",
424
+ "RecFilePath");
425
+ bool rescale = config_get_bool(main->Config(), "AdvOut",
426
+ "RecRescale");
427
+ const char *rescaleRes = config_get_string(main->Config(), "AdvOut",
428
+ "RecRescaleRes");
429
+ int trackIndex = config_get_int(main->Config(), "AdvOut",
430
+ "RecTrackIndex");
431
+
432
+ int typeIndex = (astrcmpi(type, "FFmpeg") == 0) ? 1 : 0;
433
+ ui->advOutRecType->setCurrentIndex(typeIndex);
434
+ ui->advOutRecPath->setText(path);
435
+ ui->advOutRecUseRescale->setChecked(rescale);
436
+ ui->advOutRecRescale->setCurrentText(rescaleRes);
437
+
438
+ switch (trackIndex) {
439
+ case 1: ui->advOutRecTrack1->setChecked(true); break;
440
+ case 2: ui->advOutRecTrack2->setChecked(true); break;
441
+ case 3: ui->advOutRecTrack3->setChecked(true); break;
442
+ case 4: ui->advOutRecTrack4->setChecked(true); break;
443
+ }
444
+}
445
+
446
+void OBSBasicSettings::LoadAdvOutputRecordingEncoderProperties()
447
+{
448
+ const char *encoder = config_get_string(main->Config(), "AdvOut",
449
+ "RecEncoder");
450
+
451
+ delete recordEncoderProps;
452
+ recordEncoderProps = nullptr;
453
+
454
+ if (astrcmpi(encoder, "none") != 0) {
455
+ recordEncoderProps = CreateEncoderPropertyView(encoder,
456
+ "obs-studio/basic/recordEncoder.json");
457
+ ui->advOutRecStandard->layout()->addWidget(recordEncoderProps);
458
+ }
459
+
460
+ SetComboByValue(ui->advOutRecEncoder, encoder);
461
+}
462
+
463
+void OBSBasicSettings::LoadAdvOutputFFmpegSettings()
464
+{
465
+ const char *url = config_get_string(main->Config(), "AdvOut", "FFURL");
466
+ int videoBitrate = config_get_int(main->Config(), "AdvOut",
467
+ "FFVBitrate");
468
+ bool rescale = config_get_bool(main->Config(), "AdvOut",
469
+ "FFRescale");
470
+ const char *rescaleRes = config_get_string(main->Config(), "AdvOut",
471
+ "FFRescaleRes");
472
+ const char *vEncoder = config_get_string(main->Config(), "AdvOut",
473
+ "FFVEncoder");
474
+ const char *vEncCustom = config_get_string(main->Config(), "AdvOut",
475
+ "FFVCustom");
476
+ int audioBitrate = config_get_int(main->Config(), "AdvOut",
477
+ "FFABitrate");
478
+ int audioTrack = config_get_int(main->Config(), "AdvOut",
479
+ "FFAudioTrack");
480
+ const char *aEncoder = config_get_string(main->Config(), "AdvOut",
481
+ "FFAEncoder");
482
+ const char *aEncCustom = config_get_string(main->Config(), "AdvOut",
483
+ "FFACustom");
484
+
485
+ ui->advOutFFURL->setText(url);
486
+ ui->advOutFFVBitrate->setValue(videoBitrate);
487
+ ui->advOutFFUseRescale->setChecked(rescale);
488
+ ui->advOutFFRescale->setCurrentText(rescaleRes);
489
+ ui->advOutFFVEncoder->setText(vEncoder);
490
+ ui->advOutFFVCfg->setText(vEncCustom);
491
+ ui->advOutFFABitrate->setValue(audioBitrate);
492
+ ui->advOutFFAEncoder->setText(aEncoder);
493
+ ui->advOutFFACfg->setText(aEncCustom);
494
+
495
+ switch (audioTrack) {
496
+ case 1: ui->advOutFFTrack1->setChecked(true); break;
497
+ case 2: ui->advOutFFTrack2->setChecked(true); break;
498
+ case 3: ui->advOutFFTrack3->setChecked(true); break;
499
+ case 4: ui->advOutFFTrack4->setChecked(true); break;
500
+ }
501
+}
502
+
503
+void OBSBasicSettings::LoadAdvOutputAudioSettings()
504
+{
505
+ int track1Bitrate = config_get_uint(main->Config(), "AdvOut",
506
+ "Track1Bitrate");
507
+ int track2Bitrate = config_get_uint(main->Config(), "AdvOut",
508
+ "Track2Bitrate");
509
+ int track3Bitrate = config_get_uint(main->Config(), "AdvOut",
510
+ "Track3Bitrate");
511
+ int track4Bitrate = config_get_uint(main->Config(), "AdvOut",
512
+ "Track4Bitrate");
513
+ const char *name1 = config_get_string(main->Config(), "AdvOut",
514
+ "Track1Name");
515
+ const char *name2 = config_get_string(main->Config(), "AdvOut",
516
+ "Track2Name");
517
+ const char *name3 = config_get_string(main->Config(), "AdvOut",
518
+ "Track3Name");
519
+ const char *name4 = config_get_string(main->Config(), "AdvOut",
520
+ "Track4Name");
521
+
522
+ SetComboByName(ui->advOutTrack1Bitrate,
523
+ std::to_string(track1Bitrate).c_str());
524
+ SetComboByName(ui->advOutTrack2Bitrate,
525
+ std::to_string(track2Bitrate).c_str());
526
+ SetComboByName(ui->advOutTrack3Bitrate,
527
+ std::to_string(track3Bitrate).c_str());
528
+ SetComboByName(ui->advOutTrack4Bitrate,
529
+ std::to_string(track4Bitrate).c_str());
530
+
531
+ ui->advOutTrack1Name->setText(name1);
532
+ ui->advOutTrack2Name->setText(name2);
533
+ ui->advOutTrack3Name->setText(name3);
534
+ ui->advOutTrack4Name->setText(name4);
535
}
536
537
void OBSBasicSettings::LoadOutputSettings()
538
{
539
loading = true;
540
541
+ const char *mode = config_get_string(main->Config(), "Output", "Mode");
542
+
543
+ int modeIdx = astrcmpi(mode, "Advanced") == 0 ? 1 : 0;
544
+ ui->outputMode->setCurrentIndex(modeIdx);
545
+
546
LoadSimpleOutputSettings();
547
+ LoadAdvOutputStreamingSettings();
548
+ LoadAdvOutputStreamingEncoderProperties();
549
+ LoadAdvOutputRecordingSettings();
550
+ LoadAdvOutputRecordingEncoderProperties();
551
+ LoadAdvOutputFFmpegSettings();
552
+ LoadAdvOutputAudioSettings();
553
+
554
+ if (video_output_active(obs_get_video())) {
555
+ ui->outputMode->setEnabled(false);
556
+ ui->advOutTopContainer->setEnabled(false);
557
+ ui->advOutRecTopContainer->setEnabled(false);
558
+ ui->advOutRecTypeContainer->setEnabled(false);
559
+ ui->advOutputAudioTracksTab->setEnabled(false);
560
+ }
561
562
loading = false;
563
}
564
565
loading = false;
566
}
567
568
+void OBSBasicSettings::LoadAdvancedSettings()
569
+{
570
+ uint32_t audioBufferingTime = config_get_uint(main->Config(),
571
+ "Audio", "BufferingTime");
572
+ const char *videoColorFormat = config_get_string(main->Config(),
573
+ "Video", "ColorFormat");
574
+ const char *videoColorSpace = config_get_string(main->Config(),
575
+ "Video", "ColorSpace");
576
+ const char *videoColorRange = config_get_string(main->Config(),
577
+ "Video", "ColorRange");
578
+
579
+ loading = true;
580
+
581
+ ui->audioBufferingTime->setValue(audioBufferingTime);
582
+ SetComboByName(ui->colorFormat, videoColorFormat);
583
+ SetComboByName(ui->colorSpace, videoColorSpace);
584
+ SetComboByValue(ui->colorRange, videoColorRange);
585
+
586
+ if (video_output_active(obs_get_video())) {
587
+ ui->advancedVideoContainer->setEnabled(false);
588
+ }
589
+
590
+ loading = false;
591
+}
592
+
593
void OBSBasicSettings::LoadSettings(bool changedOnly)
594
{
595
if (!changedOnly || generalChanged)
596
LoadGeneralSettings();
597
+ if (!changedOnly || stream1Changed)
598
+ LoadStream1Settings();
599
if (!changedOnly || outputsChanged)
600
LoadOutputSettings();
601
if (!changedOnly || audioChanged)
602
LoadAudioSettings();
603
if (!changedOnly || videoChanged)
604
LoadVideoSettings();
605
+ if (!changedOnly || advancedChanged)
606
+ LoadAdvancedSettings();
607
}
608
609
void OBSBasicSettings::SaveGeneralSettings()
610
611
language.c_str());
612
}
613
614
+void OBSBasicSettings::SaveStream1Settings()
615
+{
616
+ QString streamType = GetComboData(ui->streamType);
617
+
618
+ obs_service_t *newService = obs_service_create(QT_TO_UTF8(streamType),
619
+ "default_service", streamProperties->GetSettings());
620
+ if (!newService)
621
+ return;
622
+
623
+ main->SetService(newService);
624
+ main->SaveService();
625
+}
626
+
627
void OBSBasicSettings::SaveVideoSettings()
628
{
629
QString baseResolution = ui->baseResolution->currentText();
630
631
SaveSpinBox(ui->fpsNumerator, "Video", "FPSNum");
632
SaveSpinBox(ui->fpsDenominator, "Video", "FPSDen");
633
SaveComboData(ui->downscaleFilter, "Video", "ScaleType");
634
+}
635
+
636
+void OBSBasicSettings::SaveAdvancedSettings()
637
+{
638
+ SaveSpinBox(ui->audioBufferingTime, "Audio", "BufferingTime");
639
+ SaveCombo(ui->colorFormat, "Video", "ColorFormat");
640
+ SaveCombo(ui->colorSpace, "Video", "ColorSpace");
641
+ SaveComboData(ui->colorRange, "Video", "ColorRange");
642
+}
643
644
- main->ResetVideo();
645
+static inline const char *OutputModeFromIdx(int idx)
646
+{
647
+ if (idx == 1)
648
+ return "Advanced";
649
+ else
650
+ return "Simple";
651
+}
652
+
653
+static inline const char *RecTypeFromIdx(int idx)
654
+{
655
+ if (idx == 1)
656
+ return "FFmpeg";
657
+ else
658
+ return "Standard";
659
+}
660
+
661
+static void WriteJsonData(OBSPropertiesView *view, const char *path)
662
+{
663
+ char full_path[512];
664
+
665
+ if (!view || !WidgetChanged(view))
666
+ return;
667
+
668
+ int ret = os_get_config_path(full_path, sizeof(full_path), path);
669
+ if (ret > 0) {
670
+ obs_data_t *settings = view->GetSettings();
671
+ if (settings) {
672
+ const char *json = obs_data_get_json(settings);
673
+ if (json && *json) {
674
+ os_quick_write_utf8_file(full_path, json,
675
+ strlen(json), false);
676
+ }
677
+ }
678
+ }
679
+}
680
+
681
+static void SaveTrackIndex(config_t *config, const char *section,
682
+ const char *name,
683
+ QAbstractButton *check1,
684
+ QAbstractButton *check2,
685
+ QAbstractButton *check3,
686
+ QAbstractButton *check4)
687
+{
688
+ if (check1->isChecked()) config_set_int(config, section, name, 1);
689
+ else if (check2->isChecked()) config_set_int(config, section, name, 2);
690
+ else if (check3->isChecked()) config_set_int(config, section, name, 3);
691
+ else if (check4->isChecked()) config_set_int(config, section, name, 4);
692
}
693
694
-/* TODO: Temporary! */
695
void OBSBasicSettings::SaveOutputSettings()
696
{
697
+ config_set_string(main->Config(), "Output", "Mode",
698
+ OutputModeFromIdx(ui->outputMode->currentIndex()));
699
+
700
SaveSpinBox(ui->simpleOutputVBitrate, "SimpleOutput", "VBitrate");
701
SaveCombo(ui->simpleOutputABitrate, "SimpleOutput", "ABitrate");
702
SaveEdit(ui->simpleOutputPath, "SimpleOutput", "FilePath");
703
704
SaveSpinBox(ui->simpleOutMaxRetries, "SimpleOutput", "MaxRetries");
705
SaveCheckBox(ui->simpleOutAdvanced, "SimpleOutput", "UseAdvanced");
706
SaveCheckBox(ui->simpleOutUseCBR, "SimpleOutput", "UseCBR");
707
+ SaveCheckBox(ui->simpleOutUseBufsize, "SimpleOutput", "UseBufsize");
708
SaveCombo(ui->simpleOutPreset, "SimpleOutput", "Preset");
709
- SaveEdit(ui->simpleOutCustomX264, "SimpleOutput", "x264Settings");
710
+ SaveEdit(ui->simpleOutCustom, "SimpleOutput", "x264Settings");
711
+
712
+ if (ui->simpleOutUseBufsize->isChecked())
713
+ SaveSpinBox(ui->simpleOutVBufsize, "SimpleOutput", "VBufsize");
714
+
715
+ SaveCheckBox(ui->advOutReconnect, "AdvOut", "Reconnect");
716
+ SaveSpinBox(ui->advOutRetryDelay, "AdvOut", "RetryDelay");
717
+ SaveSpinBox(ui->advOutMaxRetries, "AdvOut", "MaxRetries");
718
+ SaveCheckBox(ui->advOutApplyService, "AdvOut", "ApplyServiceSettings");
719
+ SaveComboData(ui->advOutEncoder, "AdvOut", "Encoder");
720
+ SaveCheckBox(ui->advOutUseRescale, "AdvOut", "Rescale");
721
+ SaveCombo(ui->advOutRescale, "AdvOut", "RescaleRes");
722
+ SaveTrackIndex(main->Config(), "AdvOut", "TrackIndex",
723
+ ui->advOutTrack1, ui->advOutTrack2,
724
+ ui->advOutTrack3, ui->advOutTrack4);
725
+
726
+ config_set_string(main->Config(), "AdvOut", "RecType",
727
+ RecTypeFromIdx(ui->advOutRecType->currentIndex()));
728
+
729
+ SaveEdit(ui->advOutRecPath, "AdvOut", "RecFilePath");
730
+ SaveComboData(ui->advOutRecEncoder, "AdvOut", "RecEncoder");
731
+ SaveCheckBox(ui->advOutRecUseRescale, "AdvOut", "RecRescale");
732
+ SaveCombo(ui->advOutRecRescale, "AdvOut", "RecRescaleRes");
733
+ SaveTrackIndex(main->Config(), "AdvOut", "RecTrackIndex",
734
+ ui->advOutRecTrack1, ui->advOutRecTrack2,
735
+ ui->advOutRecTrack3, ui->advOutRecTrack4);
736
+
737
+ SaveEdit(ui->advOutFFURL, "AdvOut", "FFURL");
738
+ SaveSpinBox(ui->advOutFFVBitrate, "AdvOut", "FFVBitrate");
739
+ SaveCheckBox(ui->advOutFFUseRescale, "AdvOut", "FFRescale");
740
+ SaveCombo(ui->advOutFFRescale, "AdvOut", "FFRescaleRes");
741
+ SaveEdit(ui->advOutFFVEncoder, "AdvOut", "FFVEncoder");
742
+ SaveEdit(ui->advOutFFVCfg, "AdvOut", "FFVCustom");
743
+ SaveSpinBox(ui->advOutFFABitrate, "AdvOut", "FFABitrate");
744
+ SaveEdit(ui->advOutFFAEncoder, "AdvOut", "FFAEncoder");
745
+ SaveEdit(ui->advOutFFACfg, "AdvOut", "FFACustom");
746
+ SaveTrackIndex(main->Config(), "AdvOut", "FFAudioTrack",
747
+ ui->advOutFFTrack1, ui->advOutFFTrack2,
748
+ ui->advOutFFTrack3, ui->advOutFFTrack4);
749
+
750
+ SaveCombo(ui->advOutTrack1Bitrate, "AdvOut", "Track1Bitrate");
751
+ SaveCombo(ui->advOutTrack2Bitrate, "AdvOut", "Track2Bitrate");
752
+ SaveCombo(ui->advOutTrack3Bitrate, "AdvOut", "Track3Bitrate");
753
+ SaveCombo(ui->advOutTrack4Bitrate, "AdvOut", "Track4Bitrate");
754
+ SaveEdit(ui->advOutTrack1Name, "AdvOut", "Track1Name");
755
+ SaveEdit(ui->advOutTrack2Name, "AdvOut", "Track2Name");
756
+ SaveEdit(ui->advOutTrack3Name, "AdvOut", "Track3Name");
757
+ SaveEdit(ui->advOutTrack4Name, "AdvOut", "Track4Name");
758
+
759
+ WriteJsonData(streamEncoderProps,
760
+ "obs-studio/basic/streamEncoder.json");
761
+ WriteJsonData(recordEncoderProps,
762
+ "obs-studio/basic/recordEncoder.json");
763
+ main->ResetOutputs();
764
}
765
766
void OBSBasicSettings::SaveAudioSettings()
767
768
{
769
if (generalChanged)
770
SaveGeneralSettings();
771
+ if (stream1Changed)
772
+ SaveStream1Settings();
773
if (outputsChanged)
774
SaveOutputSettings();
775
if (audioChanged)
776
SaveAudioSettings();
777
if (videoChanged)
778
SaveVideoSettings();
779
+ if (advancedChanged)
780
+ SaveAdvancedSettings();
781
+
782
+ if (videoChanged || advancedChanged)
783
+ main->ResetVideo();
784
785
config_save(main->Config());
786
config_save(GetGlobalConfig());
787
788
event->ignore();
789
}
790
791
+void OBSBasicSettings::on_simpleOutUseBufsize_toggled(bool checked)
792
+{
793
+ if (!checked)
794
+ ui->simpleOutVBufsize->setValue(
795
+ ui->simpleOutputVBitrate->value());
796
+}
797
+
798
+void OBSBasicSettings::on_simpleOutputVBitrate_valueChanged(int val)
799
+{
800
+ if (!ui->simpleOutUseBufsize->isChecked())
801
+ ui->simpleOutVBufsize->setValue(val);
802
+}
803
+
804
void OBSBasicSettings::on_listWidget_itemSelectionChanged()
805
{
806
int row = ui->listWidget->currentRow();
807
808
809
void OBSBasicSettings::on_streamType_currentIndexChanged(int idx)
810
{
811
- QString val = ui->streamType->itemData(idx).toString();
812
- obs_service_t *newService;
813
-
814
if (loading)
815
return;
816
817
+ QLayout *layout = ui->streamContainer->layout();
818
+ QString streamType = ui->streamType->itemData(idx).toString();
819
+ obs_data_t *settings = obs_service_defaults(QT_TO_UTF8(streamType));
820
+
821
delete streamProperties;
822
- streamProperties = nullptr;
823
+ streamProperties = new OBSPropertiesView(settings,
824
+ QT_TO_UTF8(streamType),
825
+ (PropertiesReloadCallback)obs_get_service_properties,
826
+ 170);
827
+
828
+ streamProperties->setProperty("changed", QVariant(true));
829
+ layout->addWidget(streamProperties);
830
831
- newService = obs_service_create(QT_TO_UTF8(val), nullptr, nullptr);
832
- if (newService)
833
- main->SetService(newService);
834
+ QObject::connect(streamProperties, SIGNAL(Changed()),
835
+ this, STREAM1_CHANGED);
836
837
- LoadServiceInfo();
838
+ obs_data_release(settings);
839
}
840
841
void OBSBasicSettings::on_simpleOutputBrowse_clicked()
842
{
843
QString dir = QFileDialog::getExistingDirectory(this,
844
- QTStr("OpenDirectory"),
845
+ QTStr("Basic.Settings.Output.SelectDirectory"),
846
ui->simpleOutputPath->text(),
847
QFileDialog::ShowDirsOnly |
848
QFileDialog::DontResolveSymlinks);
849
850
ui->simpleOutputPath->setText(dir);
851
}
852
853
-static inline bool StreamExists(const char *name)
854
+void OBSBasicSettings::on_advOutRecPathBrowse_clicked()
855
+{
856
+ QString dir = QFileDialog::getExistingDirectory(this,
857
+ QTStr("Basic.Settings.Output.SelectDirectory"),
858
+ ui->advOutRecPath->text(),
859
+ QFileDialog::ShowDirsOnly |
860
+ QFileDialog::DontResolveSymlinks);
861
+ if (dir.isEmpty())
862
+ return;
863
+
864
+ ui->advOutRecPath->setText(dir);
865
+}
866
+
867
+void OBSBasicSettings::on_advOutFFPathBrowse_clicked()
868
+{
869
+ QString filter;
870
+ filter += QTStr("Basic.Settings.Output.Adv.FFmpeg.SaveFilter.Common");
871
+ filter += " (*.avi *.mp4 *.flv *.ts *.mkv *.wav *.aac);;";
872
+ filter += QTStr("Basic.Settings.Output.Adv.FFmpeg.SaveFilter.All");
873
+ filter += " (*.*)";
874
+
875
+ QString file = QFileDialog::getSaveFileName(this,
876
+ QTStr("Basic.Settings.Output.SelectFile"),
877
+ ui->simpleOutputPath->text(), filter);
878
+ if (file.isEmpty())
879
+ return;
880
+
881
+ ui->advOutFFURL->setText(file);
882
+}
883
+
884
+void OBSBasicSettings::on_advOutEncoder_currentIndexChanged(int idx)
885
+{
886
+ QString encoder = GetComboData(ui->advOutEncoder);
887
+
888
+ delete streamEncoderProps;
889
+ streamEncoderProps = CreateEncoderPropertyView(QT_TO_UTF8(encoder),
890
+ "obs-studio/basic/streamEncoder.json", true);
891
+ ui->advOutputStreamTab->layout()->addWidget(streamEncoderProps);
892
+
893
+ UNUSED_PARAMETER(idx);
894
+}
895
+
896
+void OBSBasicSettings::on_advOutRecEncoder_currentIndexChanged(int idx)
897
{
898
- return obs_get_service_by_name(name) != nullptr;
899
+ ui->advOutRecUseRescale->setEnabled(idx > 0);
900
+ ui->advOutRecRescaleContainer->setEnabled(idx > 0);
901
+
902
+ delete recordEncoderProps;
903
+ recordEncoderProps = nullptr;
904
+
905
+ if (idx > 0) {
906
+ QString encoder = GetComboData(ui->advOutRecEncoder);
907
+
908
+ recordEncoderProps = CreateEncoderPropertyView(
909
+ QT_TO_UTF8(encoder),
910
+ "obs-studio/basic/recordEncoder.json", true);
911
+ ui->advOutRecStandard->layout()->addWidget(recordEncoderProps);
912
+ }
913
}
914
915
#define INVALID_RES_STR "Basic.Settings.Video.InvalidResolution"
916
917
{
918
if (!loading && ValidResolutions(ui.get())) {
919
QString baseResolution = text;
920
- uint32_t cx, cy;
921
+ uint32_t cx, cy, out_cx, out_cy;
922
923
ConvertResText(QT_TO_UTF8(baseResolution), cx, cy);
924
- ResetDownscales(cx, cy);
925
+
926
+ QString outRes = ui->outputResolution->lineEdit()->text();
927
+ ConvertResText(QT_TO_UTF8(outRes), out_cx, out_cy);
928
+
929
+ ResetDownscales(cx, cy, out_cx, out_cy);
930
}
931
}
932
933
934
}
935
}
936
937
+void OBSBasicSettings::Stream1Changed()
938
+{
939
+ if (!loading) {
940
+ stream1Changed = true;
941
+ sender()->setProperty("changed", QVariant(true));
942
+ EnableApplyButton(true);
943
+ }
944
+}
945
+
946
void OBSBasicSettings::OutputsChanged()
947
{
948
if (!loading) {
949
950
}
951
}
952
953
+void OBSBasicSettings::AdvancedChangedRestart()
954
+{
955
+ if (!loading) {
956
+ advancedChanged = true;
957
+ ui->advancedMsg->setText(
958
+ QTStr("Basic.Settings.ProgramRestart"));
959
+ sender()->setProperty("changed", QVariant(true));
960
+ EnableApplyButton(true);
961
+ }
962
+}
963
+
964
void OBSBasicSettings::VideoChangedResolution()
965
{
966
if (!loading && ValidResolutions(ui.get())) {
967
968
EnableApplyButton(true);
969
}
970
}
971
+
972
+void OBSBasicSettings::AdvancedChanged()
973
+{
974
+ if (!loading) {
975
+ advancedChanged = true;
976
+ sender()->setProperty("changed", QVariant(true));
977
+ EnableApplyButton(true);
978
+ }
979
+}
980
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/obs/window-basic-settings.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/obs/window-basic-settings.hpp
Changed
141
1
2
OBSBasic *main;
3
4
std::unique_ptr<Ui::OBSBasicSettings> ui;
5
- bool generalChanged;
6
- bool outputsChanged;
7
- bool audioChanged;
8
- bool videoChanged;
9
- int pageIndex;
10
- bool loading;
11
-
12
- OBSPropertiesView *streamProperties;
13
+ bool generalChanged = false;
14
+ bool stream1Changed = false;
15
+ bool outputsChanged = false;
16
+ bool audioChanged = false;
17
+ bool videoChanged = false;
18
+ bool advancedChanged = false;
19
+ int pageIndex = 0;
20
+ bool loading = true;
21
+
22
+ OBSPropertiesView *streamProperties = nullptr;
23
+ OBSPropertiesView *streamEncoderProps = nullptr;
24
+ OBSPropertiesView *recordEncoderProps = nullptr;
25
26
void SaveCombo(QComboBox *widget, const char *section,
27
const char *value);
28
void SaveComboData(QComboBox *widget, const char *section,
29
const char *value);
30
- void SaveCheckBox(QCheckBox *widget, const char *section,
31
- const char *value);
32
+ void SaveCheckBox(QAbstractButton *widget, const char *section,
33
+ const char *value, bool invert = false);
34
void SaveEdit(QLineEdit *widget, const char *section,
35
const char *value);
36
void SaveSpinBox(QSpinBox *widget, const char *section,
37
38
39
inline bool Changed() const
40
{
41
- return generalChanged || outputsChanged ||
42
- audioChanged || videoChanged;
43
+ return generalChanged || outputsChanged || stream1Changed ||
44
+ audioChanged || videoChanged || advancedChanged;
45
}
46
47
inline void EnableApplyButton(bool en)
48
49
inline void ClearChanged()
50
{
51
generalChanged = false;
52
+ stream1Changed = false;
53
outputsChanged = false;
54
audioChanged = false;
55
videoChanged = false;
56
+ advancedChanged= false;
57
EnableApplyButton(false);
58
}
59
60
61
bool QueryChanges();
62
63
void LoadServiceTypes();
64
- void LoadServiceInfo();
65
+ void LoadEncoderTypes();
66
+ void LoadColorRanges();
67
68
void LoadGeneralSettings();
69
+ void LoadStream1Settings();
70
void LoadOutputSettings();
71
void LoadAudioSettings();
72
void LoadVideoSettings();
73
+ void LoadAdvancedSettings();
74
void LoadSettings(bool changedOnly);
75
76
+ OBSPropertiesView *CreateEncoderPropertyView(const char *encoder,
77
+ const char *path, bool changed = false);
78
+
79
/* general */
80
void LoadLanguageList();
81
82
/* output */
83
void LoadSimpleOutputSettings();
84
+ void LoadAdvOutputStreamingSettings();
85
+ void LoadAdvOutputStreamingEncoderProperties();
86
+ void LoadAdvOutputRecordingSettings();
87
+ void LoadAdvOutputRecordingEncoderProperties();
88
+ void LoadAdvOutputFFmpegSettings();
89
+ void LoadAdvOutputAudioSettings();
90
91
/* audio */
92
void LoadListValues(QComboBox *widget, obs_property_t *prop,
93
94
95
/* video */
96
void LoadRendererList();
97
- void ResetDownscales(uint32_t cx, uint32_t cy);
98
+ void ResetDownscales(uint32_t cx, uint32_t cy,
99
+ uint32_t out_cx, uint32_t out_cy);
100
void LoadDownscaleFilters();
101
void LoadResolutionLists();
102
void LoadFPSData();
103
104
void SaveGeneralSettings();
105
+ void SaveStream1Settings();
106
void SaveOutputSettings();
107
void SaveAudioSettings();
108
void SaveVideoSettings();
109
+ void SaveAdvancedSettings();
110
void SaveSettings();
111
112
private slots:
113
+ void on_simpleOutUseBufsize_toggled(bool checked);
114
+ void on_simpleOutputVBitrate_valueChanged(int val);
115
+
116
void on_listWidget_itemSelectionChanged();
117
void on_buttonBox_clicked(QAbstractButton *button);
118
119
void on_streamType_currentIndexChanged(int idx);
120
void on_simpleOutputBrowse_clicked();
121
+ void on_advOutRecPathBrowse_clicked();
122
+ void on_advOutFFPathBrowse_clicked();
123
+ void on_advOutEncoder_currentIndexChanged(int idx);
124
+ void on_advOutRecEncoder_currentIndexChanged(int idx);
125
126
void on_baseResolution_editTextChanged(const QString &text);
127
128
129
void AudioChanged();
130
void AudioChangedRestart();
131
void OutputsChanged();
132
+ void Stream1Changed();
133
void VideoChanged();
134
void VideoChangedResolution();
135
void VideoChangedRestart();
136
+ void AdvancedChanged();
137
+ void AdvancedChangedRestart();
138
139
protected:
140
virtual void closeEvent(QCloseEvent *event);
141
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/CMakeLists.txt -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/CMakeLists.txt
Changed
9
1
2
add_subdirectory(linux-capture)
3
add_subdirectory(linux-pulseaudio)
4
add_subdirectory(linux-v4l2)
5
+ add_subdirectory(linux-jack)
6
endif()
7
8
add_subdirectory(image-source)
9
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/image-source/data/locale/cs-CZ.ini
Added
5
1
2
+ImageInput="Obrázek"
3
+File="Soubor obrázku"
4
+
5
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/image-source/data/locale/zh-CN.ini
Added
5
1
2
+ImageInput="图像"
3
+File="图像文件"
4
+
5
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/cs-CZ.ini
Added
14
1
2
+X11SharedMemoryScreenInput="Snímání obrazovky (XSHM)"
3
+Screen="Obrazovka"
4
+CaptureCursor="Snímat kurzor"
5
+XCCapture="Snímání okna (Xcomposite)"
6
+Window="Okno"
7
+CropTop="Oříznout vršek (px)"
8
+CropLeft="Oříznout vlevo (px)"
9
+CropRight="Oříznout vpravo (px)"
10
+CropBottom="Oříznout spodek (px)"
11
+SwapRedBlue="Prohodit červenou a modrou"
12
+LockX="Zamknout X server při snímání"
13
+
14
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/da-DK.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/da-DK.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Indfang Skærm (XSHM)"
3
Screen="Skærm"
4
CaptureCursor="Indfang markøren"
5
+AdvancedSettings="Avancerede indstillinger"
6
+XServer="X Server"
7
XCCapture="Indfang Vindue (Xcomposite)"
8
Window="Vindue"
9
CropTop="Beskær Top (pixels)"
10
11
CropBottom="Beskær bund (pixels)"
12
SwapRedBlue="Swap rød og blå"
13
LockX="Lås X server ved optagelse"
14
+IncludeXBorder="Inkluder X kant"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/de-DE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/de-DE.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Monitoraufnahme (XSHM)"
3
Screen="Monitor"
4
CaptureCursor="Mauszeiger aufnehmen"
5
+AdvancedSettings="Erweiterte Einstellungen"
6
+XServer="X Server"
7
XCCapture="Fensteraufnahme (Xcomposite)"
8
Window="Fenster"
9
CropTop="Oben abschneiden (Pixel)"
10
11
CropBottom="Unten abschneiden (Pixel)"
12
SwapRedBlue="Rot und Blau tauschen"
13
LockX="X Server sperren während der Aufnahme"
14
+IncludeXBorder="X Rahmen anzeigen"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/el-GR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/el-GR.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Σύλληψη Οθόνης (XSHM)"
3
Screen="Οθόνη"
4
CaptureCursor="Σύλληψη δρομέα"
5
+AdvancedSettings="Ρυθμίσεις για Προχωρημένους"
6
+XServer="X Server"
7
XCCapture="Σύλληψη παραθήρου (XComposite)"
8
Window="Παράθυρο"
9
CropTop="Περικοπή Πάνω (pixels)"
10
11
CropBottom="Περικοπή Κάτω (pixels)"
12
SwapRedBlue="Ανταλλαγή κόκκινου και μπλέ"
13
LockX="Κλείδωμα X server κατά την σύλληψη"
14
+IncludeXBorder="Περίλαβε το περίγραμμα του X"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/es-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/es-ES.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Captura de pantalla (XSHM)"
3
Screen="Pantalla"
4
CaptureCursor="Captura de Cursor"
5
+AdvancedSettings="Ajustes Avanzados"
6
+XServer="X Server"
7
XCCapture="Captura de ventana (Xcomposite)"
8
Window="Ventana"
9
CropTop="Recortar arriba (píxeles)"
10
11
CropBottom="Recortar abajo (píxeles)"
12
SwapRedBlue="Intercambiar rojo y azúl"
13
LockX="Fijar X server mientras se captura"
14
+IncludeXBorder="Incluir borde de ventana X"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/eu-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/eu-ES.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Ikusleiho Harpena (XSHM)"
3
Screen="Ikusleihoa"
4
CaptureCursor="Hartu Kurtsorea"
5
+AdvancedSettings="Ezarpen Aurreratuak"
6
+XServer="X Zerbitzaria"
7
XCCapture="Leiho Harpena (Xcomposite)"
8
Window="Leihoa"
9
CropTop="Moztu Goitik (pixel)"
10
11
CropBottom="Moztu Behetik (pixel)"
12
SwapRedBlue="Aldatu gorria eta urdina"
13
LockX="Blokeatu X zerbitzaria harpenean"
14
+IncludeXBorder="Barneratu X Hertza"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/fi-FI.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/fi-FI.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Ruudunkaappaus (XSHM)"
3
Screen="Kuvaruutu"
4
CaptureCursor="Kaappaa kursori"
5
+AdvancedSettings="Lisäasetukset"
6
+XServer="X Server"
7
XCCapture="Ikkunakaappaus (Xcomposite)"
8
Window="Ikkuna"
9
CropTop="Rajaa ylhäältä (pikselit)"
10
11
CropBottom="Rajaa alhaalta (pikselit)"
12
SwapRedBlue="Vaihda punainen ja sininen"
13
LockX="Lukitse X Server kaappauksen aikana"
14
+IncludeXBorder="Sisällytä X-reunus"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/fr-FR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/fr-FR.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Capture d'écran (XSHM)"
3
Screen="Écran"
4
CaptureCursor="Enregistrer le Curseur"
5
+AdvancedSettings="Paramètres avancés"
6
+XServer="Serveur X"
7
XCCapture="Capture de la fenêtre (Xcomposite)"
8
Window="Fenêtre"
9
CropTop="Rogner en Haut (pixels)"
10
11
CropBottom="Rogner en Bas (pixels)"
12
SwapRedBlue="Intervertir le rouge et le bleu"
13
LockX="Verrouiller le serveur X lors de la capture"
14
+IncludeXBorder="Inclure la bordure de X"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/gl-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/gl-ES.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Captura de pantalla (XSHM)"
3
Screen="Pantalla"
4
CaptureCursor="Captura de cursor"
5
+AdvancedSettings="Axustes avanzados"
6
+XServer="X Server"
7
XCCapture="Captura de xanela (Xcomposite)"
8
Window="Xanela"
9
CropTop="Recortar por arriba (píxeles)"
10
11
CropBottom="Recortar por abaixo (píxeles)"
12
SwapRedBlue="Trocar vermello e azul"
13
LockX="Bloquear o servidor X durante a captura"
14
+IncludeXBorder="Incluír o bordo da xanela X"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/hr-HR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/hr-HR.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Ekranski ulaz (XSHM)"
3
Screen="Ekran"
4
CaptureCursor="Snimaj kursor"
5
+AdvancedSettings="Napredna podešavanja"
6
+XServer="X server"
7
XCCapture="Ulaz sa prozora (Xcomposite)"
8
Window="Prozor"
9
CropTop="Odseci odozgo (pikseli)"
10
11
CropBottom="Odseci odozdo (pikseli)"
12
SwapRedBlue="Zameni crvenu i plavu"
13
LockX="Zaključaj X server u toku snimanja"
14
+IncludeXBorder="Uključujući i X okvir"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/hu-HU.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/hu-HU.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Képernyő Felvétel (XSHM)"
3
Screen="Képernyő"
4
CaptureCursor="Kurzor Rögztítése"
5
+AdvancedSettings="Speciális Beállítások"
6
+XServer="X Szerver"
7
XCCapture="Ablak Felvétel (Xcomposite)"
8
Window="Ablak"
9
CropTop="Felső Levágása (pixelek)"
10
11
CropBottom="Alsó Levágása (pixelek)"
12
SwapRedBlue="Piros és Kék Cseréje"
13
LockX="X Szerver Zárolása Rögzítéskor"
14
+IncludeXBorder="X Kerettel"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/ja-JP.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/ja-JP.ini
Changed
16
1
2
X11SharedMemoryScreenInput="画面キャプチャ (XSHM)"
3
Screen="画面"
4
CaptureCursor="カーソルをキャプチャ"
5
+AdvancedSettings="高度な設定"
6
+XServer="X サーバ"
7
XCCapture="ウィンドウキャプチャ (Xcomposite)"
8
Window="ウィンドウ"
9
CropTop="上部クロップ(ピクセル)"
10
11
CropBottom="下部クロップ(ピクセル)"
12
SwapRedBlue="赤と青を入れ替え"
13
LockX="キャプチャ時にXサーバをロック"
14
+IncludeXBorder="Xウインドウの境界を含める"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/ko-KR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/ko-KR.ini
Changed
16
1
2
X11SharedMemoryScreenInput="화면 캡쳐 (XSHM)"
3
Screen="화면"
4
CaptureCursor="커서 캡쳐"
5
+AdvancedSettings="고급 설정"
6
+XServer="X 서버"
7
XCCapture="윈도우 캡쳐(Xcomposite)"
8
Window="윈도우"
9
CropTop="위쪽 자르기 (픽셀)"
10
11
CropBottom="아래 자르기 (픽셀)"
12
SwapRedBlue="적청 교환"
13
LockX="캡쳐 시 X 서버를 잠금"
14
+IncludeXBorder="X 윈도우 경계를 포함"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/nb-NO.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/nb-NO.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Skjermopptak (XSHM)"
3
Screen="Skjerm"
4
CaptureCursor="Ta opp musepeker"
5
+AdvancedSettings="Avanserte innstillinger"
6
+XServer="X-tjener"
7
XCCapture="Vindusopptak (Xcomposite)"
8
Window="Vindu"
9
CropTop="Beskjær toppen (piksler)"
10
11
CropBottom="Beskjær bunnen (piksler)"
12
SwapRedBlue="Bytt rød og blå"
13
LockX="Lås X-server under opptak"
14
+IncludeXBorder="Inkludér X11-rammen"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/nl-NL.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/nl-NL.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Schermcapture (XSHM)"
3
Screen="Scherm"
4
CaptureCursor="Cursor Opnemen"
5
+AdvancedSettings="Geavanceerde instellingen"
6
+XServer="X Server"
7
XCCapture="Venstercapture (Xcomposite)"
8
Window="Venster"
9
CropTop="Boven Bijsnijden (pixels)"
10
11
CropBottom="Onder Bijsnijden (pixels)"
12
SwapRedBlue="Rood en blauw omwisselen"
13
LockX="X server vergrendelen tijdens het opnemen"
14
+IncludeXBorder="Inclusief X-schermranden"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/ro-RO.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/ro-RO.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Captură de ecran (XSHM)"
3
Screen="Ecran"
4
CaptureCursor="Capturează cursorul"
5
+AdvancedSettings="Setări Avansate"
6
+XServer="X Server"
7
XCCapture="Captură Fereastră (Xcomposite)"
8
Window="Fereastră"
9
CropTop="Taie Sus (pixeli)"
10
11
CropBottom="Taie jos (pixeli)"
12
SwapRedBlue="Schimbă Roșu cu Albastru"
13
LockX="Blochează server X atunci când se capturează"
14
+IncludeXBorder="Include marginea cu X"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/ru-RU.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/ru-RU.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Захват экрана (XSHM)"
3
Screen="Экран"
4
CaptureCursor="Захват курсора"
5
+AdvancedSettings="Дополнительные настройки"
6
+XServer="X-сервер"
7
XCCapture="Захват окна (Xcomposite)"
8
Window="Окно"
9
CropTop="Обрезать сверху (пикселей)"
10
11
CropBottom="Обрезать снизу (пикселей)"
12
SwapRedBlue="Поменять местами красный и синий"
13
LockX="Блокировать X-сервер при захвате"
14
+IncludeXBorder="Включить захват границы"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/sl-SI.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/sl-SI.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Zajemanje zaslona (XSHM)"
3
Screen="Zaslon"
4
CaptureCursor="Zajemaj kazalec"
5
+AdvancedSettings="Napredne nastavitve"
6
+XServer="X Server"
7
XCCapture="Zajemanje okna (Xcomposite)"
8
Window="Okno"
9
CropTop="Obreži zgoraj (pixels)"
10
11
CropBottom="Obreži spodaj (pixels)"
12
SwapRedBlue="Zamenjaj modro in rdečo"
13
LockX="Zakleni X server med zajemanjem"
14
+IncludeXBorder="Vključujejo X meje"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/sr-CS.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/sr-CS.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Ekranski ulaz (XSHM)"
3
Screen="Ekran"
4
CaptureCursor="Snimaj kursor"
5
+AdvancedSettings="Napredna podešavanja"
6
+XServer="X server"
7
XCCapture="Улаз са прозора (Xcomposite)"
8
Window="Прозор"
9
CropTop="Одсеци одозго (пиксели)"
10
11
CropBottom="Одсеци одоздо (пиксели)"
12
SwapRedBlue="Замени црвену и плаву"
13
LockX="Закључај X сервер у току снимања"
14
+IncludeXBorder="Uključujući i X okvir"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/sr-SP.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/sr-SP.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Екрански улаз (XSHM)"
3
Screen="Екран"
4
CaptureCursor="Снимај курсор"
5
+AdvancedSettings="Напредна подешавања"
6
+XServer="X сервер"
7
XCCapture="Ulaz sa prozora (Xcomposite)"
8
Window="Prozor"
9
CropTop="Odseci odozgo (pikseli)"
10
11
CropBottom="Odseci odozdo (pikseli)"
12
SwapRedBlue="Zameni crvenu i plavu"
13
LockX="Zaključaj X server u toku snimanja"
14
+IncludeXBorder="Укључујући и X оквир"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-capture/data/locale/sv-SE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/sv-SE.ini
Changed
16
1
2
X11SharedMemoryScreenInput="Bildskärmskälla (XSHM)"
3
Screen="Skärm"
4
CaptureCursor="Visa muspekare"
5
+AdvancedSettings="Avancerade Inställningar"
6
+XServer="X-servern"
7
XCCapture="Fönsterkälla (Xcomposite)"
8
Window="Fönster"
9
CropTop="Beskär övre kant (pixlar)"
10
11
CropBottom="Beskär nedre kant (pixlar)"
12
SwapRedBlue="Byt röd och blå"
13
LockX="Lås X-servern medan källan är aktiv"
14
+IncludeXBorder="Inkludera X Border"
15
16
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-capture/data/locale/zh-CN.ini
Added
17
1
2
+X11SharedMemoryScreenInput="屏幕捕获(XSHM)"
3
+Screen="屏幕"
4
+CaptureCursor="捕捉光标"
5
+AdvancedSettings="高级设置"
6
+XServer="X Server"
7
+XCCapture="窗口捕获(Xcomposite)"
8
+Window="窗口"
9
+CropTop="裁剪顶部(像素)"
10
+CropLeft="裁剪左侧(像素)"
11
+CropRight="裁剪右部(像素)"
12
+CropBottom="裁剪下部(像素)"
13
+SwapRedBlue="交换红色和蓝色"
14
+LockX="当捕获时锁定X server"
15
+IncludeXBorder="包括 X 边框"
16
+
17
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-jack
Added
2
1
+(directory)
2
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-jack/CMakeLists.txt
Added
34
1
2
+project(linux-jack)
3
+
4
+if(DISABLE_JACK)
5
+ message(STATUS "JACK support disabled")
6
+ return()
7
+endif()
8
+
9
+find_package(Jack)
10
+if(NOT JACK_FOUND AND ENABLE_JACK)
11
+ message(FATAL_ERROR "JACK Audio Connection Kit not found but set as enabled")
12
+elseif(NOT JACK_FOUND)
13
+ message(STATUS "JACK Audio Connection Kit not found, disabling JACK plugin")
14
+ return()
15
+endif()
16
+
17
+include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs")
18
+
19
+set(linux-jack_SOURCES
20
+ linux-jack.c
21
+ jack-wrapper.c
22
+ jack-input.c
23
+)
24
+
25
+add_library(linux-jack MODULE
26
+ ${linux-jack_SOURCES}
27
+)
28
+target_link_libraries(linux-jack
29
+ libobs
30
+ ${JACK_LIBRARIES}
31
+)
32
+
33
+install_obs_plugin_with_data(linux-jack data)
34
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-jack/data
Added
2
1
+(directory)
2
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-jack/data/locale
Added
2
1
+(directory)
2
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-jack/data/locale/en-US.ini
Added
5
1
2
+StartJACKServer="Start JACK Server"
3
+Channels="Number of Channels"
4
+JACKInput="JACK Input Client"
5
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-jack/jack-input.c
Added
151
1
2
+/*
3
+Copyright (C) 2015 by Bernd Buschinski <b.buschinski@gmail.com>
4
+
5
+This program is free software: you can redistribute it and/or modify
6
+it under the terms of the GNU General Public License as published by
7
+the Free Software Foundation, either version 2 of the License, or
8
+(at your option) any later version.
9
+
10
+This program is distributed in the hope that it will be useful,
11
+but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+GNU General Public License for more details.
14
+
15
+You should have received a copy of the GNU General Public License
16
+along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+*/
18
+
19
+#include "jack-wrapper.h"
20
+
21
+#include <obs-module.h>
22
+
23
+/**
24
+ * Returns the name of the plugin
25
+ */
26
+static const char *jack_input_getname(void)
27
+{
28
+ return obs_module_text("JACKInput");
29
+}
30
+
31
+/**
32
+ * Destroy the plugin object and free all memory
33
+ */
34
+static void jack_destroy(void *vptr)
35
+{
36
+ struct jack_data* data = (struct jack_data*)vptr;
37
+
38
+ if (!data)
39
+ return;
40
+
41
+ deactivate_jack(data);
42
+
43
+ if (data->device)
44
+ bfree(data->device);
45
+ pthread_mutex_destroy(&data->jack_mutex);
46
+ bfree(data);
47
+}
48
+
49
+/**
50
+ * Update the input settings
51
+ */
52
+static void jack_update(void *vptr, obs_data_t *settings)
53
+{
54
+ struct jack_data* data = (struct jack_data*)vptr;
55
+ if (!data)
56
+ return;
57
+
58
+ const char *new_device;
59
+ bool settings_changed = false;
60
+ bool new_jack_start_server = obs_data_get_bool(settings, "startjack");
61
+ int new_channel_count = obs_data_get_int(settings, "channels");
62
+
63
+ if (new_jack_start_server != data->start_jack_server) {
64
+ data->start_jack_server = new_jack_start_server;
65
+ settings_changed = true;
66
+ }
67
+
68
+ if (new_channel_count != data->channels)
69
+ /*
70
+ * keep "old" channel count for now,
71
+ * we need to destroy the correct number of channels
72
+ */
73
+ settings_changed = true;
74
+
75
+ new_device = obs_source_get_name(data->source);
76
+ if (!data->device || strcmp(data->device, new_device) != 0) {
77
+ if (data->device)
78
+ bfree(data->device);
79
+ data->device = bstrdup(new_device);
80
+ settings_changed = true;
81
+ }
82
+
83
+ if (settings_changed) {
84
+ deactivate_jack(data);
85
+
86
+ data->channels = new_channel_count;
87
+
88
+ if (jack_init(data) != 0) {
89
+ deactivate_jack(data);
90
+ }
91
+ }
92
+}
93
+
94
+/**
95
+ * Create the plugin object
96
+ */
97
+static void *jack_create(obs_data_t *settings, obs_source_t *source)
98
+{
99
+ struct jack_data *data = bzalloc(sizeof(struct jack_data));
100
+
101
+ pthread_mutex_init(&data->jack_mutex, NULL);
102
+ data->source = source;
103
+ data->channels = -1;
104
+
105
+ jack_update(data, settings);
106
+
107
+ if (data->jack_client == NULL) {
108
+ jack_destroy(data);
109
+ return NULL;
110
+ }
111
+ return data;
112
+}
113
+
114
+/**
115
+ * Get plugin defaults
116
+ */
117
+static void jack_input_defaults(obs_data_t *settings)
118
+{
119
+ obs_data_set_default_int(settings, "channels", 2);
120
+ obs_data_set_default_bool(settings, "startjack", false);
121
+}
122
+
123
+/**
124
+ * Get plugin properties
125
+ */
126
+static obs_properties_t *jack_input_properties(void *unused)
127
+{
128
+ (void)unused;
129
+
130
+ obs_properties_t *props = obs_properties_create();
131
+
132
+ obs_properties_add_int(props, "channels",
133
+ obs_module_text("Channels"), 1, 8, 1);
134
+ obs_properties_add_bool(props, "startjack",
135
+ obs_module_text("StartJACKServer"));
136
+
137
+ return props;
138
+}
139
+
140
+struct obs_source_info jack_output_capture = {
141
+ .id = "jack_output_capture",
142
+ .type = OBS_SOURCE_TYPE_INPUT,
143
+ .output_flags = OBS_SOURCE_AUDIO,
144
+ .get_name = jack_input_getname,
145
+ .create = jack_create,
146
+ .destroy = jack_destroy,
147
+ .update = jack_update,
148
+ .get_defaults = jack_input_defaults,
149
+ .get_properties = jack_input_properties
150
+};
151
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-jack/jack-wrapper.c
Added
162
1
2
+/*
3
+Copyright (C) 2015 by Bernd Buschinski <b.buschinski@gmail.com>
4
+
5
+This program is free software: you can redistribute it and/or modify
6
+it under the terms of the GNU General Public License as published by
7
+the Free Software Foundation, either version 2 of the License, or
8
+(at your option) any later version.
9
+
10
+This program is distributed in the hope that it will be useful,
11
+but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+GNU General Public License for more details.
14
+
15
+You should have received a copy of the GNU General Public License
16
+along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+*/
18
+
19
+#include "jack-wrapper.h"
20
+
21
+#include <pthread.h>
22
+#include <stdio.h>
23
+
24
+#include <util/platform.h>
25
+
26
+#define blog(level, msg, ...) blog(level, "jack-input: " msg, ##__VA_ARGS__)
27
+
28
+/**
29
+ * Get obs speaker layout from number of channels
30
+ *
31
+ * @param channels number of channels reported by jack
32
+ *
33
+ * @return obs speaker_layout id
34
+ *
35
+ * @note This *might* not work for some rather unusual setups, but should work
36
+ * fine for the majority of cases.
37
+ */
38
+static enum speaker_layout jack_channels_to_obs_speakers(uint_fast32_t channels)
39
+{
40
+ switch(channels) {
41
+ case 1: return SPEAKERS_MONO;
42
+ case 2: return SPEAKERS_STEREO;
43
+ case 3: return SPEAKERS_2POINT1;
44
+ case 4: return SPEAKERS_SURROUND;
45
+ case 5: return SPEAKERS_4POINT1;
46
+ case 6: return SPEAKERS_5POINT1;
47
+ /* What should we do with 7 channels? */
48
+ /* case 7: return SPEAKERS_...; */
49
+ case 8: return SPEAKERS_7POINT1;
50
+ }
51
+
52
+ return SPEAKERS_UNKNOWN;
53
+}
54
+
55
+int jack_process_callback(jack_nframes_t nframes, void* arg)
56
+{
57
+ struct jack_data* data = (struct jack_data*)arg;
58
+ if (data == 0)
59
+ return 0;
60
+
61
+ pthread_mutex_lock(&data->jack_mutex);
62
+
63
+ struct obs_source_audio out;
64
+ out.speakers = jack_channels_to_obs_speakers(data->channels);
65
+ out.samples_per_sec = jack_get_sample_rate (data->jack_client);
66
+ /* format is always 32 bit float for jack */
67
+ out.format = AUDIO_FORMAT_FLOAT_PLANAR;
68
+
69
+ for (unsigned int i = 0; i < data->channels; ++i) {
70
+ jack_default_audio_sample_t *jack_buffer =
71
+ (jack_default_audio_sample_t *)jack_port_get_buffer(
72
+ data->jack_ports[i], nframes);
73
+ out.data[i] = (uint8_t *)jack_buffer;
74
+ }
75
+
76
+ out.frames = nframes;
77
+ out.timestamp = os_gettime_ns() -
78
+ jack_frames_to_time(data->jack_client, nframes);
79
+
80
+ obs_source_output_audio(data->source, &out);
81
+ pthread_mutex_unlock(&data->jack_mutex);
82
+ return 0;
83
+}
84
+
85
+int_fast32_t jack_init(struct jack_data* data)
86
+{
87
+ pthread_mutex_lock(&data->jack_mutex);
88
+
89
+ if (data->jack_client != NULL)
90
+ goto good;
91
+
92
+ jack_options_t jack_option = data->start_jack_server ?
93
+ JackNullOption : JackNoStartServer;
94
+
95
+ data->jack_client = jack_client_open(data->device, jack_option, 0);
96
+ if (data->jack_client == NULL) {
97
+ blog(LOG_ERROR,
98
+ "jack_client_open Error:"
99
+ "Could not create JACK client! %s",
100
+ data->device);
101
+ goto error;
102
+ }
103
+
104
+ data->jack_ports = (jack_port_t**)bzalloc(
105
+ sizeof(jack_port_t*) * data->channels);
106
+ for (unsigned int i = 0; i < data->channels; ++i) {
107
+ char port_name[10] = {'\0'};
108
+ snprintf(port_name, sizeof(port_name), "in_%d", i+1);
109
+
110
+ data->jack_ports[i] = jack_port_register(data->jack_client,
111
+ port_name, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
112
+ if (data->jack_ports[i] == NULL) {
113
+ blog(LOG_ERROR,
114
+ "jack_port_register Error:"
115
+ "Could not create JACK port! %s",
116
+ port_name);
117
+ goto error;
118
+ }
119
+ }
120
+
121
+ if (jack_set_process_callback(data->jack_client,
122
+ jack_process_callback, data) != 0) {
123
+ blog(LOG_ERROR, "jack_set_process_callback Error");
124
+ goto error;
125
+ }
126
+
127
+ if (jack_activate(data->jack_client) != 0) {
128
+ blog(LOG_ERROR,
129
+ "jack_activate Error:"
130
+ "Could not activate JACK client!");
131
+ goto error;
132
+ }
133
+
134
+good:
135
+ pthread_mutex_unlock(&data->jack_mutex);
136
+ return 0;
137
+
138
+error:
139
+ pthread_mutex_unlock(&data->jack_mutex);
140
+ return 1;
141
+}
142
+
143
+void deactivate_jack(struct jack_data* data)
144
+{
145
+ pthread_mutex_lock(&data->jack_mutex);
146
+
147
+ if (data->jack_client) {
148
+ if (data->jack_ports != NULL) {
149
+ for (int i = 0; i < data->channels; ++i) {
150
+ if (data->jack_ports[i] != NULL)
151
+ jack_port_unregister(data->jack_client,
152
+ data->jack_ports[i]);
153
+ }
154
+ bfree(data->jack_ports);
155
+ data->jack_ports = NULL;
156
+ }
157
+ jack_client_close(data->jack_client);
158
+ data->jack_client = NULL;
159
+ }
160
+ pthread_mutex_unlock(&data->jack_mutex);
161
+}
162
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-jack/jack-wrapper.h
Added
53
1
2
+/*
3
+Copyright (C) 2015 by Bernd Buschinski <b.buschinski@gmail.com>
4
+
5
+This program is free software: you can redistribute it and/or modify
6
+it under the terms of the GNU General Public License as published by
7
+the Free Software Foundation, either version 2 of the License, or
8
+(at your option) any later version.
9
+
10
+This program is distributed in the hope that it will be useful,
11
+but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+GNU General Public License for more details.
14
+
15
+You should have received a copy of the GNU General Public License
16
+along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+*/
18
+
19
+#pragma once
20
+
21
+#include <jack/jack.h>
22
+#include <obs.h>
23
+#include <pthread.h>
24
+
25
+struct jack_data {
26
+ obs_source_t *source;
27
+
28
+ /* user settings */
29
+ char *device;
30
+ uint_fast8_t channels;
31
+ bool start_jack_server;
32
+
33
+ /* server info */
34
+ enum speaker_layout speakers;
35
+ uint_fast32_t samples_per_sec;
36
+ uint_fast32_t bytes_per_frame;
37
+
38
+ jack_client_t *jack_client;
39
+ jack_port_t **jack_ports;
40
+
41
+ pthread_mutex_t jack_mutex;
42
+};
43
+
44
+/**
45
+ * Initialize the jack client and register the ports
46
+ */
47
+int_fast32_t jack_init(struct jack_data* data);
48
+
49
+/**
50
+ * Destroys the jack client and unregisters the ports
51
+ */
52
+void deactivate_jack(struct jack_data* data);
53
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-jack/linux-jack.c
Added
30
1
2
+/*
3
+Copyright (C) 2015 by Bernd Buschinski <b.buschinski@gmail.com>
4
+
5
+This program is free software: you can redistribute it and/or modify
6
+it under the terms of the GNU General Public License as published by
7
+the Free Software Foundation, either version 2 of the License, or
8
+(at your option) any later version.
9
+
10
+This program is distributed in the hope that it will be useful,
11
+but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+GNU General Public License for more details.
14
+
15
+You should have received a copy of the GNU General Public License
16
+along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+*/
18
+#include <obs-module.h>
19
+
20
+OBS_DECLARE_MODULE()
21
+OBS_MODULE_USE_DEFAULT_LOCALE("linux-jack", "en-US")
22
+
23
+extern struct obs_source_info jack_output_capture;
24
+
25
+bool obs_module_load(void)
26
+{
27
+ obs_register_source(&jack_output_capture);
28
+ return true;
29
+}
30
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-pulseaudio/data/locale/cs-CZ.ini
Added
6
1
2
+PulseInput="Záznam vstupu zvuku (PulseAudio)"
3
+PulseOutput="Záznam výstupu zvuku (PulseAudio)"
4
+Device="Zařízení"
5
+
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-pulseaudio/data/locale/fr-FR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-pulseaudio/data/locale/fr-FR.ini
Changed
7
1
2
PulseInput="Capture d'Audio Entrant (PulseAudio)"
3
PulseOutput="Capture d'Audio Sortant (PulseAudio)"
4
-Device="Appareil"
5
+Device="Périphérique"
6
7
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-pulseaudio/data/locale/zh-CN.ini
Added
6
1
2
+PulseInput="音频输入捕获(脉冲音频)"
3
+PulseOutput="音频输出捕获(脉冲音频)"
4
+Device="设备"
5
+
6
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-v4l2/data/locale/cs-CZ.ini
Added
11
1
2
+V4L2Input="Zařízení pro záznam (V4L2)"
3
+Device="Zařízení"
4
+Input="Vstup"
5
+ImageFormat="Formát videa"
6
+Resolution="Rozlišení"
7
+FrameRate="Frekvence snímkování"
8
+LeaveUnchanged="Ponechat nezměněné"
9
+UseSystemTiming="Použít systémové časování"
10
+
11
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-v4l2/data/locale/de-DE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-v4l2/data/locale/de-DE.ini
Changed
7
1
2
-V4L2Input="Videogerät (V4L2)"
3
+V4L2Input="Videoaufnahmegerät (V4L2)"
4
Device="Gerät"
5
Input="Eingabe"
6
ImageFormat="Videoformat"
7
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-v4l2/data/locale/nb-NO.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-v4l2/data/locale/nb-NO.ini
Changed
7
1
2
Resolution="Oppløsning"
3
FrameRate="Bildehastighet"
4
LeaveUnchanged="La stå uendret"
5
+UseSystemTiming="Bruk systemtid"
6
7
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-v4l2/data/locale/pl-PL.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-v4l2/data/locale/pl-PL.ini
Changed
7
1
2
ImageFormat="Format wideo"
3
Resolution="Rozdzielczość"
4
FrameRate="Klatki na sekundę"
5
+LeaveUnchanged="Pozostaw bez zmian"
6
7
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/linux-v4l2/data/locale/sv-SE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-v4l2/data/locale/sv-SE.ini
Changed
7
1
2
Resolution="Upplösning"
3
FrameRate="Bildhastighet"
4
LeaveUnchanged="Lämna oförändrat"
5
+UseSystemTiming="Använd Systemets Timing"
6
7
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/linux-v4l2/data/locale/zh-CN.ini
Added
11
1
2
+V4L2Input="视频捕获设备(V4L2)"
3
+Device="设备"
4
+Input="输入"
5
+ImageFormat="视频格式"
6
+Resolution="分辨率"
7
+FrameRate="帧率"
8
+LeaveUnchanged="保持不变"
9
+UseSystemTiming="使用系统时间(忽略V4L2时间)"
10
+
11
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-avcapture/data/locale/cs-CZ.ini
Added
7
1
2
+AvCapture="Zařízení pro záznam"
3
+Device="Zařízení"
4
+UsePreset="Použít předvolbu"
5
+Preset="Předvolba"
6
+
7
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-avcapture/data/locale/de-DE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-avcapture/data/locale/de-DE.ini
Changed
7
1
2
-AvCapture="Videogerät"
3
+AvCapture="Videoaufnahmegerät"
4
Device="Gerät"
5
UsePreset="Benutze Voreinstellung"
6
Preset="Voreinstellung"
7
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-avcapture/data/locale/zh-CN.ini
Added
7
1
2
+AvCapture="视频捕捉设备"
3
+Device="设备"
4
+UsePreset="使用预设"
5
+Preset="预设"
6
+
7
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-capture/data/locale/de-DE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-capture/data/locale/de-DE.ini
Changed
10
1
2
WindowCapture="Fensteraufnahme"
3
WindowCapture.ShowShadow="Zeige Fensterschatten"
4
WindowUtils.Window="Fenster"
5
-WindowUtils.ShowEmptyNames="Zeife Fenster mit leeren Namen"
6
+WindowUtils.ShowEmptyNames="Zeige Fenster mit leeren Namen"
7
CropMode="Zuschneiden"
8
CropMode.None="Keine"
9
CropMode.Manual="Manuell"
10
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-capture/data/locale/zh-CN.ini
Added
23
1
2
+CoreAudio.InputCapture="音频输入捕获"
3
+CoreAudio.OutputCapture="音频输出捕获"
4
+CoreAudio.Device="设备"
5
+CoreAudio.Device.Default="默认"
6
+DisplayCapture="显示捕获"
7
+DisplayCapture.Display="显示"
8
+DisplayCapture.ShowCursor="显示光标"
9
+WindowCapture="窗口捕获"
10
+WindowCapture.ShowShadow="显示窗口阴影"
11
+WindowUtils.Window="窗口"
12
+WindowUtils.ShowEmptyNames="显示窗口名称为空"
13
+CropMode="裁剪"
14
+CropMode.None="无"
15
+CropMode.Manual="手动"
16
+CropMode.ToWindow="到窗口"
17
+CropMode.ToWindowAndManual="到窗口和手动"
18
+Crop.origin.x="裁剪左侧"
19
+Crop.origin.y="裁剪顶部"
20
+Crop.size.width="裁剪右侧"
21
+Crop.size.height="裁剪底部"
22
+
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/da-DK.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/da-DK.ini
Changed
12
1
2
+Syphon="Indfang spil (Syphon)"
3
Source="Kilde"
4
LaunchSyphonInject="Kør SyphonInject"
5
Inject="Indsæt"
6
7
Crop.origin.y="Beskær top"
8
Crop.size.width="Beskær højre"
9
Crop.size.height="Beskær bund"
10
+AllowTransparency="Tillad gennemsigtighed"
11
12
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/de-DE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/de-DE.ini
Changed
6
1
2
+Syphon="Spielaufnahme (Syphon)"
3
Source="Quelle"
4
LaunchSyphonInject="SyphonInject starten"
5
Inject="Injizieren"
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/el-GR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/el-GR.ini
Changed
6
1
2
+Syphon="Σύλληψη Παιχνιδιού (Syphon)"
3
Source="Πηγή"
4
LaunchSyphonInject="Έναρξη SyphonInject"
5
Inject="Εισήγαγε"
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/en-US.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/en-US.ini
Changed
6
1
2
+Syphon="Game Capture (Syphon)"
3
Source="Source"
4
LaunchSyphonInject="Launch SyphonInject"
5
Inject="Inject"
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/es-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/es-ES.ini
Changed
6
1
2
+Syphon="Captura de juego (Syphon)"
3
Source="Fuente"
4
LaunchSyphonInject="Lanzar SyphonInject"
5
Inject="Inyectar"
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/eu-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/eu-ES.ini
Changed
6
1
2
+Syphon="Jolas Harpena (Syphon)"
3
Source="Iturburua"
4
LaunchSyphonInject="Abiarazi SyphonInject"
5
Inject="Inject"
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/fi-FI.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/fi-FI.ini
Changed
6
1
2
+Syphon="Kaappaa peli (Syphon)"
3
Source="Lähde"
4
LaunchSyphonInject="Käynnistä SyphonInject"
5
Inject="Inject"
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/fr-FR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/fr-FR.ini
Changed
6
1
2
+Syphon="Capture de jeu (Syphon)"
3
Source="Source"
4
LaunchSyphonInject="Lancer SyphonInject"
5
Inject="Injecter"
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/hr-HR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/hr-HR.ini
Changed
6
1
2
+Syphon="Snimanje igre (Syphon)"
3
Source="Izvor"
4
LaunchSyphonInject="Pokreni SyphonInject"
5
Inject="Ubrizgaj"
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/ja-JP.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/ja-JP.ini
Changed
6
1
2
+Syphon="ゲームキャプチャ (サイフォン)"
3
Source="ソース"
4
LaunchSyphonInject="サイフォンインジェクトを起動する"
5
Inject="インジェクト"
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/ko-KR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/ko-KR.ini
Changed
6
1
2
+Syphon="게임 캡쳐 (Syphon)"
3
Source="소스"
4
LaunchSyphonInject="SyphonInject 실행"
5
Inject="삽입"
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/nb-NO.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/nb-NO.ini
Changed
12
1
2
+Syphon="Spillopptak (Syphon)"
3
Source="Kilde"
4
LaunchSyphonInject="Start SyphonInject"
5
Inject="Injiser"
6
7
Crop.origin.y="Beskjær topp"
8
Crop.size.width="Beskjær høyre"
9
Crop.size.height="Beskjær bunn"
10
+AllowTransparency="Tillat gjennomsiktighet"
11
12
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/nl-NL.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/nl-NL.ini
Changed
6
1
2
+Syphon="Gamecapture (Syphon)"
3
Source="Bron"
4
LaunchSyphonInject="Start SyphonInject"
5
Inject="Injecteren"
6
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/pl-PL.ini
Added
4
1
2
+Source="Źródło"
3
+
4
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/ru-RU.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/ru-RU.ini
Changed
6
1
2
+Syphon="Захват игры (Syphon)"
3
Source="Источник"
4
LaunchSyphonInject="Запуск SyphonInject"
5
Inject="Ввести"
6
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/sl-SI.ini
Added
14
1
2
+Source="Vir"
3
+LaunchSyphonInject="Zaženi SyphonInject"
4
+Inject="Vstavi"
5
+Application="Aplikacija"
6
+SyphonLicense="Syphon Licenca"
7
+Crop="Obreži"
8
+Crop.origin.x="Obreži levo"
9
+Crop.origin.y="Obreži vrh"
10
+Crop.size.width="Obreži desno"
11
+Crop.size.height="Obreži spodaj"
12
+AllowTransparency="Omogoči prozornost"
13
+
14
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/sr-CS.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/sr-CS.ini
Changed
6
1
2
+Syphon="Snimanje igre (Syphon)"
3
Source="Izvor"
4
LaunchSyphonInject="Pokreni SyphonInject"
5
Inject="Ubrizgaj"
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/sr-SP.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/sr-SP.ini
Changed
6
1
2
+Syphon="Снимање игре (Syphon)"
3
Source="Извор"
4
LaunchSyphonInject="Покрени SyphonInject"
5
Inject="Убризгај"
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/data/locale/sv-SE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/sv-SE.ini
Changed
7
1
2
Crop.origin.y="Beskär topp"
3
Crop.size.width="Beskär höger"
4
Crop.size.height="Beskär botten"
5
+AllowTransparency="Tillåt opacitet"
6
7
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/data/locale/zh-CN.ini
Added
15
1
2
+Syphon="游戏捕获(Syphon)"
3
+Source="来源"
4
+LaunchSyphonInject="启动 SyphonInject"
5
+Inject="注入"
6
+Application="应用"
7
+SyphonLicense="Syphon 许可证"
8
+Crop="裁剪"
9
+Crop.origin.x="裁剪左侧"
10
+Crop.origin.y="裁剪顶部"
11
+Crop.size.width="裁剪右侧"
12
+Crop.size.height="裁剪底部"
13
+AllowTransparency="允许透明度"
14
+
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/mac-syphon/syphon.m -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/mac-syphon/syphon.m
Changed
10
1
2
3
static const char *syphon_get_name()
4
{
5
- return "Syphon";
6
+ return obs_module_text("Syphon");
7
}
8
9
static void stop_client(syphon_t s)
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-ffmpeg/CMakeLists.txt -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-ffmpeg/CMakeLists.txt
Changed
19
1
2
project(obs-ffmpeg)
3
4
-if(WIN32)
5
+if(MSVC)
6
set(obs-ffmpeg_PLATFORM_DEPS
7
w32-pthreads)
8
endif()
9
10
11
set(obs-ffmpeg_HEADERS
12
obs-ffmpeg-formats.h
13
- obs-ffmpeg-compat.h)
14
+ obs-ffmpeg-compat.h
15
+ closest-pixel-format.h)
16
set(obs-ffmpeg_SOURCES
17
obs-ffmpeg.c
18
obs-ffmpeg-aac.c
19
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-ffmpeg/closest-pixel-format.h
Added
117
1
2
+#pragma once
3
+
4
+static const enum AVPixelFormat i420_formats[] = {
5
+ AV_PIX_FMT_YUV420P,
6
+ AV_PIX_FMT_NV12,
7
+ AV_PIX_FMT_NV21,
8
+ AV_PIX_FMT_YUYV422,
9
+ AV_PIX_FMT_UYVY422,
10
+ AV_PIX_FMT_YUV422P,
11
+ AV_PIX_FMT_NONE
12
+};
13
+
14
+static const enum AVPixelFormat nv12_formats[] = {
15
+ AV_PIX_FMT_NV12,
16
+ AV_PIX_FMT_NV21,
17
+ AV_PIX_FMT_YUV420P,
18
+ AV_PIX_FMT_YUYV422,
19
+ AV_PIX_FMT_UYVY422,
20
+ AV_PIX_FMT_NONE
21
+};
22
+
23
+static const enum AVPixelFormat yuy2_formats[] = {
24
+ AV_PIX_FMT_YUYV422,
25
+ AV_PIX_FMT_UYVY422,
26
+ AV_PIX_FMT_NV12,
27
+ AV_PIX_FMT_NV21,
28
+ AV_PIX_FMT_YUV420P,
29
+ AV_PIX_FMT_NONE
30
+};
31
+
32
+static const enum AVPixelFormat uyvy_formats[] = {
33
+ AV_PIX_FMT_UYVY422,
34
+ AV_PIX_FMT_YUYV422,
35
+ AV_PIX_FMT_NV12,
36
+ AV_PIX_FMT_NV21,
37
+ AV_PIX_FMT_YUV420P,
38
+ AV_PIX_FMT_NONE
39
+};
40
+
41
+static const enum AVPixelFormat rgba_formats[] = {
42
+ AV_PIX_FMT_RGBA,
43
+ AV_PIX_FMT_BGRA,
44
+ AV_PIX_FMT_YUYV422,
45
+ AV_PIX_FMT_UYVY422,
46
+ AV_PIX_FMT_NV12,
47
+ AV_PIX_FMT_NV21,
48
+ AV_PIX_FMT_NONE
49
+};
50
+
51
+static const enum AVPixelFormat bgra_formats[] = {
52
+ AV_PIX_FMT_BGRA,
53
+ AV_PIX_FMT_RGBA,
54
+ AV_PIX_FMT_YUYV422,
55
+ AV_PIX_FMT_UYVY422,
56
+ AV_PIX_FMT_NV12,
57
+ AV_PIX_FMT_NV21,
58
+ AV_PIX_FMT_NONE
59
+};
60
+
61
+static enum AVPixelFormat get_best_format(
62
+ const enum AVPixelFormat *best,
63
+ const enum AVPixelFormat *formats)
64
+{
65
+ while (*best != AV_PIX_FMT_NONE) {
66
+ enum AVPixelFormat best_format = *best;
67
+ const enum AVPixelFormat *cur_formats = formats;
68
+
69
+ while (*cur_formats != AV_PIX_FMT_NONE) {
70
+ enum AVPixelFormat avail_format = *cur_formats;
71
+
72
+ if (best_format == avail_format)
73
+ return best_format;
74
+
75
+ cur_formats++;
76
+ }
77
+
78
+ best++;
79
+ }
80
+
81
+ return AV_PIX_FMT_NONE;
82
+}
83
+
84
+static inline enum AVPixelFormat get_closest_format(
85
+ enum AVPixelFormat format,
86
+ const enum AVPixelFormat *formats)
87
+{
88
+ enum AVPixelFormat best_format = AV_PIX_FMT_NONE;
89
+
90
+ if (!formats || formats[0] == AV_PIX_FMT_NONE)
91
+ return format;
92
+
93
+ switch ((int)format) {
94
+
95
+ case AV_PIX_FMT_YUV420P:
96
+ best_format = get_best_format(i420_formats, formats);
97
+ break;
98
+ case AV_PIX_FMT_NV12:
99
+ best_format = get_best_format(nv12_formats, formats);
100
+ break;
101
+ case AV_PIX_FMT_YUYV422:
102
+ best_format = get_best_format(yuy2_formats, formats);
103
+ break;
104
+ case AV_PIX_FMT_UYVY422:
105
+ best_format = get_best_format(uyvy_formats, formats);
106
+ break;
107
+ case AV_PIX_FMT_RGBA:
108
+ best_format = get_best_format(rgba_formats, formats);
109
+ break;
110
+ case AV_PIX_FMT_BGRA:
111
+ best_format = get_best_format(bgra_formats, formats);
112
+ break;
113
+ }
114
+
115
+ return (best_format == AV_PIX_FMT_NONE) ? formats[0] : best_format;
116
+}
117
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-ffmpeg/data/locale/zh-CN.ini
Added
6
1
2
+FFmpegOutput="FFmpeg 输出"
3
+FFmpegAAC="FFmpeg 默认 AAC 编码器"
4
+Bitrate="比特率"
5
+
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-output.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-output.c
Changed
379
1
2
#include <libswscale/swscale.h>
3
4
#include "obs-ffmpeg-formats.h"
5
+#include "closest-pixel-format.h"
6
#include "obs-ffmpeg-compat.h"
7
8
-//#define OBS_FFMPEG_VIDEO_FORMAT VIDEO_FORMAT_I420
9
-#define OBS_FFMPEG_VIDEO_FORMAT VIDEO_FORMAT_NV12
10
-
11
-/* NOTE: much of this stuff is test stuff that was more or less copied from
12
- * the muxing.c ffmpeg example */
13
+struct ffmpeg_cfg {
14
+ const char *url;
15
+ int video_bitrate;
16
+ int audio_bitrate;
17
+ const char *video_encoder;
18
+ const char *audio_encoder;
19
+ const char *video_settings;
20
+ const char *audio_settings;
21
+ enum AVPixelFormat format;
22
+ int scale_width;
23
+ int scale_height;
24
+ int width;
25
+ int height;
26
+};
27
28
struct ffmpeg_data {
29
AVStream *video;
30
31
AVFormatContext *output;
32
struct SwsContext *swscale;
33
34
- int video_bitrate;
35
AVPicture dst_picture;
36
AVFrame *vframe;
37
int frame_size;
38
int total_frames;
39
40
- int width;
41
- int height;
42
-
43
uint64_t start_timestamp;
44
45
- int audio_bitrate;
46
uint32_t audio_samplerate;
47
enum audio_format audio_format;
48
size_t audio_planes;
49
50
AVFrame *aframe;
51
int total_samples;
52
53
- const char *filename_test;
54
+ struct ffmpeg_cfg config;
55
56
bool initialized;
57
};
58
59
/* ------------------------------------------------------------------------- */
60
61
static bool new_stream(struct ffmpeg_data *data, AVStream **stream,
62
- AVCodec **codec, enum AVCodecID id)
63
+ AVCodec **codec, enum AVCodecID id, const char *name)
64
{
65
- *codec = avcodec_find_encoder(id);
66
+ *codec = (!!name && *name) ?
67
+ avcodec_find_encoder_by_name(name) :
68
+ avcodec_find_encoder(id);
69
+
70
if (!*codec) {
71
blog(LOG_WARNING, "Couldn't find encoder '%s'",
72
avcodec_get_name(id));
73
74
return true;
75
}
76
77
+static void parse_params(AVCodecContext *context, char **opts)
78
+{
79
+ if (!context || !context->priv_data)
80
+ return;
81
+
82
+ while (*opts) {
83
+ char *opt = *opts;
84
+ char *assign = strchr(opt, '=');
85
+
86
+ if (assign) {
87
+ char *name = opt;
88
+ char *value;
89
+
90
+ *assign = 0;
91
+ value = assign+1;
92
+
93
+ av_opt_set(context->priv_data, name, value, 0);
94
+ }
95
+
96
+ opts++;
97
+ }
98
+}
99
+
100
static bool open_video_codec(struct ffmpeg_data *data)
101
{
102
AVCodecContext *context = data->video->codec;
103
+ char **opts = strlist_split(data->config.video_settings, ' ', false);
104
int ret;
105
106
- if (data->vcodec->id == AV_CODEC_ID_H264) {
107
+ if (data->vcodec->id == AV_CODEC_ID_H264)
108
av_opt_set(context->priv_data, "preset", "veryfast", 0);
109
- av_opt_set(context->priv_data, "x264-params", "nal-hrd=cbr", 0);
110
+
111
+ if (opts) {
112
+ parse_params(context, opts);
113
+ strlist_free(opts);
114
}
115
116
ret = avcodec_open2(context, data->vcodec, NULL);
117
118
119
static bool init_swscale(struct ffmpeg_data *data, AVCodecContext *context)
120
{
121
- enum AVPixelFormat format;
122
- format = obs_to_ffmpeg_video_format(OBS_FFMPEG_VIDEO_FORMAT);
123
-
124
data->swscale = sws_getContext(
125
- context->width, context->height, format,
126
- context->width, context->height, context->pix_fmt,
127
+ data->config.width, data->config.height,
128
+ data->config.format,
129
+ data->config.scale_width, data->config.scale_height,
130
+ context->pix_fmt,
131
SWS_BICUBIC, NULL, NULL, NULL);
132
133
if (!data->swscale) {
134
135
136
static bool create_video_stream(struct ffmpeg_data *data)
137
{
138
+ enum AVPixelFormat closest_format;
139
AVCodecContext *context;
140
struct obs_video_info ovi;
141
- enum AVPixelFormat vformat;
142
-
143
- vformat = obs_to_ffmpeg_video_format(OBS_FFMPEG_VIDEO_FORMAT);
144
145
if (!obs_get_video_info(&ovi)) {
146
blog(LOG_WARNING, "No active video");
147
148
}
149
150
if (!new_stream(data, &data->video, &data->vcodec,
151
- data->output->oformat->video_codec))
152
+ data->output->oformat->video_codec,
153
+ data->config.video_encoder))
154
return false;
155
156
+ closest_format = get_closest_format(data->config.format,
157
+ data->vcodec->pix_fmts);
158
+
159
context = data->video->codec;
160
- context->codec_id = data->output->oformat->video_codec;
161
- context->bit_rate = data->video_bitrate * 1000;
162
- context->rc_buffer_size = data->video_bitrate * 1000;
163
- context->rc_max_rate = data->video_bitrate * 1000;
164
- context->width = data->width;
165
- context->height = data->height;
166
+ context->bit_rate = data->config.video_bitrate * 1000;
167
+ context->width = data->config.scale_width;
168
+ context->height = data->config.scale_height;
169
context->time_base.num = ovi.fps_den;
170
context->time_base.den = ovi.fps_num;
171
context->gop_size = 120;
172
- context->pix_fmt = vformat;
173
+ context->pix_fmt = closest_format;
174
175
if (data->output->oformat->flags & AVFMT_GLOBALHEADER)
176
context->flags |= CODEC_FLAG_GLOBAL_HEADER;
177
178
if (!open_video_codec(data))
179
return false;
180
181
- if (context->pix_fmt != vformat)
182
+ if (context->pix_fmt != data->config.format ||
183
+ data->config.width != data->config.scale_width ||
184
+ data->config.height != data->config.scale_height) {
185
+
186
if (!init_swscale(data, context))
187
return false;
188
+ }
189
190
return true;
191
}
192
193
static bool open_audio_codec(struct ffmpeg_data *data)
194
{
195
AVCodecContext *context = data->audio->codec;
196
+ char **opts = strlist_split(data->config.video_settings, ' ', false);
197
int ret;
198
199
+ if (opts) {
200
+ parse_params(context, opts);
201
+ strlist_free(opts);
202
+ }
203
+
204
data->aframe = av_frame_alloc();
205
if (!data->aframe) {
206
blog(LOG_WARNING, "Failed to allocate audio frame");
207
208
}
209
210
if (!new_stream(data, &data->audio, &data->acodec,
211
- data->output->oformat->audio_codec))
212
+ data->output->oformat->audio_codec,
213
+ data->config.audio_encoder))
214
return false;
215
216
context = data->audio->codec;
217
- context->bit_rate = data->audio_bitrate * 1000;
218
+ context->bit_rate = data->config.audio_bitrate * 1000;
219
context->channels = get_audio_channels(aoi.speakers);
220
context->sample_rate = aoi.samples_per_sec;
221
context->sample_fmt = data->acodec->sample_fmts ?
222
223
int ret;
224
225
if ((format->flags & AVFMT_NOFILE) == 0) {
226
- ret = avio_open(&data->output->pb, data->filename_test,
227
+ ret = avio_open(&data->output->pb, data->config.url,
228
AVIO_FLAG_WRITE);
229
if (ret < 0) {
230
- blog(LOG_WARNING, "Couldn't open file '%s', %s",
231
- data->filename_test, av_err2str(ret));
232
+ blog(LOG_WARNING, "Couldn't open '%s', %s",
233
+ data->config.url, av_err2str(ret));
234
return false;
235
}
236
}
237
238
ret = avformat_write_header(data->output, NULL);
239
if (ret < 0) {
240
- blog(LOG_WARNING, "Error opening file '%s': %s",
241
- data->filename_test, av_err2str(ret));
242
+ blog(LOG_WARNING, "Error opening '%s': %s",
243
+ data->config.url, av_err2str(ret));
244
return false;
245
}
246
247
248
memset(data, 0, sizeof(struct ffmpeg_data));
249
}
250
251
-static bool ffmpeg_data_init(struct ffmpeg_data *data, const char *filename,
252
- int vbitrate, int abitrate, int width, int height)
253
+static bool ffmpeg_data_init(struct ffmpeg_data *data,
254
+ struct ffmpeg_cfg *config)
255
{
256
bool is_rtmp = false;
257
258
memset(data, 0, sizeof(struct ffmpeg_data));
259
- data->filename_test = filename;
260
- data->video_bitrate = vbitrate;
261
- data->audio_bitrate = abitrate;
262
- data->width = width;
263
- data->height = height;
264
+ data->config = *config;
265
266
- if (!filename || !*filename)
267
+ if (!config->url || !*config->url)
268
return false;
269
270
av_register_all();
271
avformat_network_init();
272
273
- is_rtmp = (astrcmp_n(filename, "rtmp://", 7) == 0);
274
+ is_rtmp = (astrcmpi_n(config->url, "rtmp://", 7) == 0);
275
276
- /* TODO: settings */
277
avformat_alloc_output_context2(&data->output, NULL,
278
- is_rtmp ? "flv" : NULL, data->filename_test);
279
+ is_rtmp ? "flv" : NULL, data->config.url);
280
if (is_rtmp) {
281
data->output->oformat->video_codec = AV_CODEC_ID_H264;
282
data->output->oformat->audio_codec = AV_CODEC_ID_AAC;
283
284
AVCodecContext *context = data->video->codec;
285
AVPacket packet = {0};
286
int ret = 0, got_packet;
287
- enum AVPixelFormat format;
288
289
av_init_packet(&packet);
290
291
if (!data->start_timestamp)
292
data->start_timestamp = frame->timestamp;
293
294
- format = obs_to_ffmpeg_video_format(OBS_FFMPEG_VIDEO_FORMAT);
295
- if (context->pix_fmt != format)
296
+ if (!!data->swscale)
297
sws_scale(data->swscale, (const uint8_t *const *)frame->data,
298
(const int*)frame->linesize,
299
- 0, context->height, data->dst_picture.data,
300
+ 0, data->config.height, data->dst_picture.data,
301
data->dst_picture.linesize);
302
else
303
copy_data(&data->dst_picture, frame, context->height);
304
305
306
static bool try_connect(struct ffmpeg_output *output)
307
{
308
- const char *filename_test;
309
+ video_t *video = obs_output_video(output->output);
310
+ struct ffmpeg_cfg config;
311
obs_data_t *settings;
312
- int audio_bitrate, video_bitrate;
313
- int width, height;
314
+ bool success;
315
int ret;
316
317
settings = obs_output_get_settings(output->output);
318
- filename_test = obs_data_get_string(settings, "filename");
319
- video_bitrate = (int)obs_data_get_int(settings, "video_bitrate");
320
- audio_bitrate = (int)obs_data_get_int(settings, "audio_bitrate");
321
- obs_data_release(settings);
322
-
323
- if (!filename_test || !*filename_test)
324
+ config.url = obs_data_get_string(settings, "url");
325
+ config.video_bitrate = (int)obs_data_get_int(settings, "video_bitrate");
326
+ config.audio_bitrate = (int)obs_data_get_int(settings, "audio_bitrate");
327
+ config.video_encoder = obs_data_get_string(settings, "video_encoder");
328
+ config.audio_encoder = obs_data_get_string(settings, "audio_encoder");
329
+ config.video_settings = obs_data_get_string(settings, "video_settings");
330
+ config.audio_settings = obs_data_get_string(settings, "audio_settings");
331
+ config.scale_width = (int)obs_data_get_int(settings, "scale_width");
332
+ config.scale_height = (int)obs_data_get_int(settings, "scale_height");
333
+ config.width = (int)obs_output_get_width(output->output);
334
+ config.height = (int)obs_output_get_height(output->output);
335
+ config.format = obs_to_ffmpeg_video_format(
336
+ video_output_get_format(video));
337
+
338
+ if (config.format == AV_PIX_FMT_NONE) {
339
+ blog(LOG_DEBUG, "invalid pixel format used for FFmpeg output");
340
return false;
341
+ }
342
+
343
+ if (!config.scale_width)
344
+ config.scale_width = config.width;
345
+ if (!config.scale_height)
346
+ config.scale_height = config.height;
347
348
- width = (int)obs_output_get_width(output->output);
349
- height = (int)obs_output_get_height(output->output);
350
+ success = ffmpeg_data_init(&output->ff_data, &config);
351
+ obs_data_release(settings);
352
353
- if (!ffmpeg_data_init(&output->ff_data, filename_test,
354
- video_bitrate, audio_bitrate,
355
- width, height))
356
+ if (!success)
357
return false;
358
359
struct audio_convert_info aci = {
360
.format = output->ff_data.audio_format
361
};
362
363
- struct video_scale_info vsi = {
364
- .format = OBS_FFMPEG_VIDEO_FORMAT
365
- };
366
-
367
output->active = true;
368
369
if (!obs_output_can_begin_data_capture(output->output, 0))
370
371
return false;
372
}
373
374
- obs_output_set_video_conversion(output->output, &vsi);
375
+ obs_output_set_video_conversion(output->output, NULL);
376
obs_output_set_audio_conversion(output->output, &aci);
377
obs_output_begin_data_capture(output->output, 0);
378
output->write_thread_active = true;
379
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-libfdk/data/locale/zh-CN.ini
Added
6
1
2
+LibFDK="libfdk AAC 编码器"
3
+Bitrate="比特率"
4
+Afterburner="启用 AAC Afterburner"
5
+
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-outputs/CMakeLists.txt -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-outputs/CMakeLists.txt
Changed
19
1
2
3
if(WIN32)
4
set(obs-outputs_PLATFORM_DEPS
5
- w32-pthreads
6
- ws2_32.lib
7
- winmm.lib)
8
+ ws2_32
9
+ winmm)
10
+endif()
11
+
12
+if(MSVC)
13
+ set(obs-outputs_PLATFORM_DEPS
14
+ ${obs-outputs_PLATFORM_DEPS}
15
+ w32-pthreads)
16
endif()
17
18
set(obs-outputs_librtmp_HEADERS
19
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-outputs/data/locale/zh-CN.ini
Added
7
1
2
+RTMPStream="RTMP 流"
3
+RTMPStream.DropThreshold="Drop阈值(毫秒)"
4
+FLVOutput="FLV 文件输出"
5
+FLVOutput.FilePath="文件路径"
6
+
7
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-outputs/flv-mux.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-outputs/flv-mux.c
Changed
93
1
2
fwrite(buf, 1, enc - buf, file);
3
}
4
5
-static void build_flv_meta_data(obs_output_t *context,
6
- uint8_t **output, size_t *size)
7
+static bool build_flv_meta_data(obs_output_t *context,
8
+ uint8_t **output, size_t *size, size_t a_idx)
9
{
10
obs_encoder_t *vencoder = obs_output_get_video_encoder(context);
11
- obs_encoder_t *aencoder = obs_output_get_audio_encoder(context);
12
+ obs_encoder_t *aencoder = obs_output_get_audio_encoder(context, a_idx);
13
video_t *video = obs_encoder_video(vencoder);
14
audio_t *audio = obs_encoder_audio(aencoder);
15
char buf[4096];
16
17
char *end = enc+sizeof(buf);
18
struct dstr encoder_name = {0};
19
20
+ if (a_idx > 0 && !aencoder)
21
+ return false;
22
+
23
enc_str(&enc, end, "onMetaData");
24
25
*enc++ = AMF_ECMA_ARRAY;
26
- enc = AMF_EncodeInt32(enc, end, 14);
27
+ enc = AMF_EncodeInt32(enc, end, a_idx == 0 ? 14 : 9);
28
29
enc_num_val(&enc, end, "duration", 0.0);
30
enc_num_val(&enc, end, "fileSize", 0.0);
31
32
- enc_num_val(&enc, end, "width",
33
- (double)obs_encoder_get_width(vencoder));
34
- enc_num_val(&enc, end, "height",
35
- (double)obs_encoder_get_height(vencoder));
36
-
37
- enc_str_val(&enc, end, "videocodecid", "avc1");
38
- enc_num_val(&enc, end, "videodatarate", encoder_bitrate(vencoder));
39
- enc_num_val(&enc, end, "framerate", video_output_get_frame_rate(video));
40
+ if (a_idx == 0) {
41
+ enc_num_val(&enc, end, "width",
42
+ (double)obs_encoder_get_width(vencoder));
43
+ enc_num_val(&enc, end, "height",
44
+ (double)obs_encoder_get_height(vencoder));
45
+
46
+ enc_str_val(&enc, end, "videocodecid", "avc1");
47
+ enc_num_val(&enc, end, "videodatarate",
48
+ encoder_bitrate(vencoder));
49
+ enc_num_val(&enc, end, "framerate",
50
+ video_output_get_frame_rate(video));
51
+ }
52
53
enc_str_val(&enc, end, "audiocodecid", "mp4a");
54
enc_num_val(&enc, end, "audiodatarate", encoder_bitrate(aencoder));
55
56
57
*size = enc-buf;
58
*output = bmemdup(buf, *size);
59
+ return true;
60
}
61
62
-void flv_meta_data(obs_output_t *context, uint8_t **output, size_t *size,
63
- bool write_header)
64
+bool flv_meta_data(obs_output_t *context, uint8_t **output, size_t *size,
65
+ bool write_header, size_t audio_idx)
66
{
67
struct array_output_data data;
68
struct serializer s;
69
- uint8_t *meta_data;
70
+ uint8_t *meta_data = NULL;
71
size_t meta_data_size;
72
uint32_t start_pos;
73
74
array_output_serializer_init(&s, &data);
75
76
- build_flv_meta_data(context, &meta_data, &meta_data_size);
77
+ if (!build_flv_meta_data(context, &meta_data, &meta_data_size,
78
+ audio_idx)) {
79
+ bfree(meta_data);
80
+ return false;
81
+ }
82
83
if (write_header) {
84
s_write(&s, "FLV", 3);
85
86
*size = data.bytes.num;
87
88
bfree(meta_data);
89
+ return true;
90
}
91
92
#ifdef DEBUG_TIMESTAMPS
93
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-outputs/flv-mux.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-outputs/flv-mux.h
Changed
11
1
2
3
extern void write_file_info(FILE *file, int64_t duration_ms, int64_t size);
4
5
-extern void flv_meta_data(obs_output_t *context, uint8_t **output, size_t *size,
6
- bool write_header);
7
+extern bool flv_meta_data(obs_output_t *context, uint8_t **output, size_t *size,
8
+ bool write_header, size_t audio_idx);
9
extern void flv_packet_mux(struct encoder_packet *packet,
10
uint8_t **output, size_t *size, bool is_header);
11
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-outputs/flv-output.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-outputs/flv-output.c
Changed
19
1
2
uint8_t *meta_data;
3
size_t meta_data_size;
4
5
- flv_meta_data(stream->output, &meta_data, &meta_data_size, true);
6
+ flv_meta_data(stream->output, &meta_data, &meta_data_size, true, 0);
7
fwrite(meta_data, 1, meta_data_size, stream->file);
8
bfree(meta_data);
9
}
10
11
static void write_audio_header(struct flv_output *stream)
12
{
13
obs_output_t *context = stream->output;
14
- obs_encoder_t *aencoder = obs_output_get_audio_encoder(context);
15
+ obs_encoder_t *aencoder = obs_output_get_audio_encoder(context, 0);
16
uint8_t *header;
17
18
struct encoder_packet packet = {
19
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-outputs/librtmp/amf.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-outputs/librtmp/amf.c
Changed
36
1
2
3
return len + nSize;
4
}
5
+ return len;
6
}
7
8
int
9
10
/* decode name */
11
if (bDecodeName)
12
{
13
- AVal name;
14
+ AVal name = AV_empty;
15
int nRes = AMF3ReadString(pBuffer, &name);
16
17
if (name.av_len <= 0)
18
19
void
20
AMFProp_Reset(AMFObjectProperty *prop)
21
{
22
- if (prop->p_type == AMF_OBJECT)
23
+ if (prop->p_type == AMF_OBJECT || prop->p_type == AMF_ECMA_ARRAY || prop->p_type == AMF_STRICT_ARRAY)
24
AMF_Reset(&prop->p_vu.p_object);
25
else
26
{
27
28
29
for (i = 0; i < cd.cd_num; i++)
30
{
31
- AVal memberName;
32
+ AVal memberName = AV_empty;
33
len = AMF3ReadString(pBuffer, &memberName);
34
RTMP_Log(RTMP_LOGDEBUG, "Member: %s", memberName.av_val);
35
AMF3CD_AddProp(&cd, &memberName);
36
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-outputs/librtmp/hashswf.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-outputs/librtmp/hashswf.c
Changed
10
1
2
}
3
sa.sin_port = htons(port);
4
sb.sb_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
5
- if (sb.sb_socket == -1)
6
+ if (sb.sb_socket == INVALID_SOCKET)
7
return HTTPRES_LOST_CONNECTION;
8
i =
9
sprintf(sb.sb_buf,
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-outputs/librtmp/parseurl.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-outputs/librtmp/parseurl.c
Changed
195
1
2
#include "log.h"
3
4
int RTMP_ParseURL(const char *url, int *protocol, AVal *host, unsigned int *port,
5
- AVal *playpath, AVal *app)
6
-{
7
- char *p, *end, *col, *ques, *slash;
8
-
9
- RTMP_Log(RTMP_LOGDEBUG, "Parsing...");
10
-
11
- *protocol = RTMP_PROTOCOL_RTMP;
12
- *port = 0;
13
- playpath->av_len = 0;
14
- playpath->av_val = NULL;
15
- app->av_len = 0;
16
- app->av_val = NULL;
17
-
18
- /* Old School Parsing */
19
-
20
- /* look for usual :// pattern */
21
- p = strstr(url, "://");
22
- if(!p)
23
- {
24
- RTMP_Log(RTMP_LOGERROR, "RTMP URL: No :// in url!");
25
- return FALSE;
26
- }
27
- {
28
- int len = (int)(p-url);
29
-
30
- if(len == 4 && strncasecmp(url, "rtmp", 4)==0)
31
- *protocol = RTMP_PROTOCOL_RTMP;
32
- else if(len == 5 && strncasecmp(url, "rtmpt", 5)==0)
33
- *protocol = RTMP_PROTOCOL_RTMPT;
34
- else if(len == 5 && strncasecmp(url, "rtmps", 5)==0)
35
- *protocol = RTMP_PROTOCOL_RTMPS;
36
- else if(len == 5 && strncasecmp(url, "rtmpe", 5)==0)
37
- *protocol = RTMP_PROTOCOL_RTMPE;
38
- else if(len == 5 && strncasecmp(url, "rtmfp", 5)==0)
39
- *protocol = RTMP_PROTOCOL_RTMFP;
40
- else if(len == 6 && strncasecmp(url, "rtmpte", 6)==0)
41
- *protocol = RTMP_PROTOCOL_RTMPTE;
42
- else if(len == 6 && strncasecmp(url, "rtmpts", 6)==0)
43
- *protocol = RTMP_PROTOCOL_RTMPTS;
44
- else
45
- {
46
- RTMP_Log(RTMP_LOGWARNING, "Unknown protocol!\n");
47
- goto parsehost;
48
- }
49
- }
50
-
51
- RTMP_Log(RTMP_LOGDEBUG, "Parsed protocol: %d", *protocol);
52
-
53
-parsehost:
54
- /* let's get the hostname */
55
- p+=3;
56
-
57
- /* check for sudden death */
58
- if(*p==0)
59
- {
60
- RTMP_Log(RTMP_LOGWARNING, "No hostname in URL!");
61
- return FALSE;
62
- }
63
-
64
- end = p + strlen(p);
65
- col = strchr(p, ':');
66
- ques = strchr(p, '?');
67
- slash = strchr(p, '/');
68
-
69
- {
70
- int hostlen;
71
- if(slash)
72
- hostlen = slash - p;
73
- else
74
- hostlen = end - p;
75
- if(col && col -p < hostlen)
76
- hostlen = col - p;
77
-
78
- if(hostlen < 256)
79
- {
80
- host->av_val = p;
81
- host->av_len = hostlen;
82
- RTMP_Log(RTMP_LOGDEBUG, "Parsed host : %.*s", hostlen, host->av_val);
83
- }
84
- else
85
- {
86
- RTMP_Log(RTMP_LOGWARNING, "Hostname exceeds 255 characters!");
87
- }
88
-
89
- p+=hostlen;
90
- }
91
-
92
- /* get the port number if available */
93
- if(*p == ':')
94
- {
95
- unsigned int p2;
96
- p++;
97
- p2 = atoi(p);
98
- if(p2 > 65535)
99
- {
100
- RTMP_Log(RTMP_LOGWARNING, "Invalid port number!");
101
- }
102
- else
103
- {
104
- *port = p2;
105
- }
106
- }
107
-
108
- if(!slash)
109
- {
110
- RTMP_Log(RTMP_LOGWARNING, "No application or playpath in URL!");
111
- return TRUE;
112
- }
113
- p = slash+1;
114
-
115
- {
116
- /* parse application
117
- *
118
- * rtmp://host[:port]/app[/appinstance][/...]
119
- * application = app[/appinstance]
120
- */
121
-
122
- char *slash2, *slash3 = NULL, *slash4 = NULL;
123
- int applen, appnamelen;
124
-
125
- slash2 = strchr(p, '/');
126
- if(slash2)
127
- slash3 = strchr(slash2+1, '/');
128
- if(slash3)
129
- slash4 = strchr(slash3+1, '/');
130
-
131
- applen = end-p; /* ondemand, pass all parameters as app */
132
- appnamelen = applen; /* ondemand length */
133
-
134
- if(ques && strstr(p, "slist=")) /* whatever it is, the '?' and slist= means we need to use everything as app and parse plapath from slist= */
135
- {
136
- appnamelen = ques-p;
137
- }
138
- else if(strncmp(p, "ondemand/", 9)==0)
139
- {
140
- /* app = ondemand/foobar, only pass app=ondemand */
141
- applen = 8;
142
- appnamelen = 8;
143
- }
144
- else /* app!=ondemand, so app is app[/appinstance] */
145
- {
146
- if(slash4)
147
- appnamelen = slash4-p;
148
- else if(slash3)
149
- appnamelen = slash3-p;
150
- else if(slash2)
151
- appnamelen = slash2-p;
152
-
153
- applen = appnamelen;
154
- }
155
-
156
- app->av_val = p;
157
- app->av_len = applen;
158
- RTMP_Log(RTMP_LOGDEBUG, "Parsed app : %.*s", applen, p);
159
-
160
- p += appnamelen;
161
- }
162
-
163
- if (*p == '/')
164
- p++;
165
-
166
- if (end-p)
167
- {
168
- AVal av = {p, end-p};
169
- RTMP_ParsePlaypath(&av, playpath);
170
- }
171
-
172
- return TRUE;
173
-}
174
-
175
-int RTMP_ParseURL2(const char *url, int *protocol, AVal *host, unsigned int *port,
176
AVal *app)
177
{
178
- char *p, *end, *col, /* *ques, */ *slash;
179
+ char *p, *end, *col, /* *ques, */ *slash, *v6;
180
181
RTMP_Log(RTMP_LOGDEBUG, "Parsing...");
182
183
184
}
185
186
end = p + strlen(p);
187
- col = strchr(p, ':');
188
+ v6 = strchr(p, ']');
189
// ques = strchr(p, '?');
190
slash = strchr(p, '/');
191
+ col = strchr((v6 && v6 < slash) ? v6 : p, ':');
192
193
{
194
int hostlen;
195
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-outputs/librtmp/rtmp.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-outputs/librtmp/rtmp.c
Changed
1219
1
2
static int SendCheckBWResult(RTMP *r, double txn);
3
static int SendDeleteStream(RTMP *r, double dStreamId);
4
static int SendFCSubscribe(RTMP *r, AVal *subscribepath);
5
-static int SendPlay(RTMP *r);
6
+static int SendPlay(RTMP *r, int streamIdx);
7
static int SendBytesReceived(RTMP *r);
8
static int SendUsherToken(RTMP *r, AVal *usherToken);
9
-static int SendFCUnpublish(RTMP *r);
10
+static int SendFCUnpublish(RTMP *r, int streamIdx);
11
12
#if 0 /* unused */
13
static int SendBGHasStream(RTMP *r, double dId, AVal *playpath);
14
15
r->m_nServerBW = 2500000;
16
r->m_fAudioCodecs = 3191.0;
17
r->m_fVideoCodecs = 252.0;
18
+ r->Link.curStreamIdx = 0;
19
+ r->Link.nStreams = 0;
20
r->Link.timeout = 30;
21
r->Link.swfAge = 30;
22
}
23
24
int
25
RTMP_IsConnected(RTMP *r)
26
{
27
- return r->m_sb.sb_socket != -1;
28
+ return r->m_sb.sb_socket != INVALID_SOCKET;
29
}
30
31
SOCKET
32
33
}
34
}
35
36
-void
37
-RTMP_SetupStream(RTMP *r,
38
- int protocol,
39
- AVal *host,
40
- unsigned int port,
41
- AVal *sockshost,
42
- AVal *playpath,
43
- AVal *tcUrl,
44
- AVal *swfUrl,
45
- AVal *pageUrl,
46
- AVal *app,
47
- AVal *auth,
48
- AVal *swfSHA256Hash,
49
- uint32_t swfSize,
50
- AVal *flashVer,
51
- AVal *subscribepath,
52
- AVal *usherToken,
53
- int dStart,
54
- int dStop, int bLiveStream, long int timeout)
55
-{
56
- RTMP_Log(RTMP_LOGDEBUG, "Protocol : %s", RTMPProtocolStrings[protocol&7]);
57
- RTMP_Log(RTMP_LOGDEBUG, "Hostname : %.*s", host->av_len, host->av_val);
58
- RTMP_Log(RTMP_LOGDEBUG, "Port : %d", port);
59
- RTMP_Log(RTMP_LOGDEBUG, "Playpath : %s", playpath->av_val);
60
-
61
- if (tcUrl && tcUrl->av_val)
62
- RTMP_Log(RTMP_LOGDEBUG, "tcUrl : %s", tcUrl->av_val);
63
- if (swfUrl && swfUrl->av_val)
64
- RTMP_Log(RTMP_LOGDEBUG, "swfUrl : %s", swfUrl->av_val);
65
- if (pageUrl && pageUrl->av_val)
66
- RTMP_Log(RTMP_LOGDEBUG, "pageUrl : %s", pageUrl->av_val);
67
- if (app && app->av_val)
68
- RTMP_Log(RTMP_LOGDEBUG, "app : %.*s", app->av_len, app->av_val);
69
- if (auth && auth->av_val)
70
- RTMP_Log(RTMP_LOGDEBUG, "auth : %s", auth->av_val);
71
- if (subscribepath && subscribepath->av_val)
72
- RTMP_Log(RTMP_LOGDEBUG, "subscribepath : %s", subscribepath->av_val);
73
- if (usherToken && usherToken->av_val)
74
- RTMP_Log(RTMP_LOGDEBUG, "NetStream.Authenticate.UsherToken : %s", usherToken->av_val);
75
- if (flashVer && flashVer->av_val)
76
- RTMP_Log(RTMP_LOGDEBUG, "flashVer : %s", flashVer->av_val);
77
- if (dStart > 0)
78
- RTMP_Log(RTMP_LOGDEBUG, "StartTime : %d msec", dStart);
79
- if (dStop > 0)
80
- RTMP_Log(RTMP_LOGDEBUG, "StopTime : %d msec", dStop);
81
-
82
- RTMP_Log(RTMP_LOGDEBUG, "live : %s", bLiveStream ? "yes" : "no");
83
- RTMP_Log(RTMP_LOGDEBUG, "timeout : %ld sec", timeout);
84
-
85
-#ifdef CRYPTO
86
- if (swfSHA256Hash != NULL && swfSize > 0)
87
- {
88
- memcpy(r->Link.SWFHash, swfSHA256Hash->av_val, sizeof(r->Link.SWFHash));
89
- r->Link.SWFSize = swfSize;
90
- RTMP_Log(RTMP_LOGDEBUG, "SWFSHA256:");
91
- RTMP_LogHex(RTMP_LOGDEBUG, r->Link.SWFHash, sizeof(r->Link.SWFHash));
92
- RTMP_Log(RTMP_LOGDEBUG, "SWFSize : %u", r->Link.SWFSize);
93
- }
94
- else
95
- {
96
- r->Link.SWFSize = 0;
97
- }
98
-
99
-#else
100
- (void)swfSHA256Hash;
101
- (void)swfSize;
102
-#endif
103
-
104
- SocksSetup(r, sockshost);
105
-
106
- if (tcUrl && tcUrl->av_len)
107
- r->Link.tcUrl = *tcUrl;
108
- if (swfUrl && swfUrl->av_len)
109
- r->Link.swfUrl = *swfUrl;
110
- if (pageUrl && pageUrl->av_len)
111
- r->Link.pageUrl = *pageUrl;
112
- if (app && app->av_len)
113
- r->Link.app = *app;
114
- if (auth && auth->av_len)
115
- {
116
- r->Link.auth = *auth;
117
- r->Link.lFlags |= RTMP_LF_AUTH;
118
- }
119
- if (flashVer && flashVer->av_len)
120
- r->Link.flashVer = *flashVer;
121
- else
122
- r->Link.flashVer = RTMP_DefaultFlashVer;
123
- if (subscribepath && subscribepath->av_len)
124
- r->Link.subscribepath = *subscribepath;
125
- if (usherToken && usherToken->av_len)
126
- r->Link.usherToken = *usherToken;
127
- r->Link.seekTime = dStart;
128
- r->Link.stopTime = dStop;
129
- if (bLiveStream)
130
- r->Link.lFlags |= RTMP_LF_LIVE;
131
- r->Link.timeout = timeout;
132
-
133
- r->Link.protocol = protocol;
134
- r->Link.hostname = *host;
135
- r->Link.port = port;
136
- r->Link.playpath = *playpath;
137
-
138
- if (r->Link.port == 0)
139
- {
140
- if (protocol & RTMP_FEATURE_SSL)
141
- r->Link.port = 443;
142
- else if (protocol & RTMP_FEATURE_HTTP)
143
- r->Link.port = 80;
144
- else
145
- r->Link.port = 1935;
146
- }
147
-}
148
-
149
-enum { OPT_STR=0, OPT_INT, OPT_BOOL, OPT_CONN };
150
-static const char *optinfo[] =
151
-{
152
- "string", "integer", "boolean", "AMF"
153
-};
154
-
155
-#define OFF(x) offsetof(struct RTMP,x)
156
-
157
-static struct urlopt
158
-{
159
- AVal name;
160
- off_t off;
161
- int otype;
162
- int omisc;
163
- char *use;
164
-} options[] =
165
-{
166
- {
167
- AVC("socks"), OFF(Link.sockshost), OPT_STR, 0,
168
- "Use the specified SOCKS proxy"
169
- },
170
- {
171
- AVC("app"), OFF(Link.app), OPT_STR, 0,
172
- "Name of target app on server"
173
- },
174
- {
175
- AVC("tcUrl"), OFF(Link.tcUrl), OPT_STR, 0,
176
- "URL to played stream"
177
- },
178
- {
179
- AVC("pageUrl"), OFF(Link.pageUrl), OPT_STR, 0,
180
- "URL of played media's web page"
181
- },
182
- {
183
- AVC("swfUrl"), OFF(Link.swfUrl), OPT_STR, 0,
184
- "URL to player SWF file"
185
- },
186
- {
187
- AVC("flashver"), OFF(Link.flashVer), OPT_STR, 0,
188
- "Flash version string (default " DEF_VERSTR ")"
189
- },
190
- {
191
- AVC("conn"), OFF(Link.extras), OPT_CONN, 0,
192
- "Append arbitrary AMF data to Connect message"
193
- },
194
- {
195
- AVC("playpath"), OFF(Link.playpath), OPT_STR, 0,
196
- "Path to target media on server"
197
- },
198
- {
199
- AVC("playlist"), OFF(Link.lFlags), OPT_BOOL, RTMP_LF_PLST,
200
- "Set playlist before play command"
201
- },
202
- {
203
- AVC("live"), OFF(Link.lFlags), OPT_BOOL, RTMP_LF_LIVE,
204
- "Stream is live, no seeking possible"
205
- },
206
- {
207
- AVC("subscribe"), OFF(Link.subscribepath), OPT_STR, 0,
208
- "Stream to subscribe to"
209
- },
210
- {
211
- AVC("jtv"), OFF(Link.usherToken), OPT_STR, 0,
212
- "Justin.tv authentication token"
213
- },
214
- {
215
- AVC("token"), OFF(Link.token), OPT_STR, 0,
216
- "Key for SecureToken response"
217
- },
218
- {
219
- AVC("swfVfy"), OFF(Link.lFlags), OPT_BOOL, RTMP_LF_SWFV,
220
- "Perform SWF Verification"
221
- },
222
- {
223
- AVC("swfAge"), OFF(Link.swfAge), OPT_INT, 0,
224
- "Number of days to use cached SWF hash"
225
- },
226
- {
227
- AVC("start"), OFF(Link.seekTime), OPT_INT, 0,
228
- "Stream start position in milliseconds"
229
- },
230
- {
231
- AVC("stop"), OFF(Link.stopTime), OPT_INT, 0,
232
- "Stream stop position in milliseconds"
233
- },
234
- {
235
- AVC("buffer"), OFF(m_nBufferMS), OPT_INT, 0,
236
- "Buffer time in milliseconds"
237
- },
238
- {
239
- AVC("timeout"), OFF(Link.timeout), OPT_INT, 0,
240
- "Session timeout in seconds"
241
- },
242
- {
243
- AVC("pubUser"), OFF(Link.pubUser), OPT_STR, 0,
244
- "Publisher username"
245
- },
246
- {
247
- AVC("pubPasswd"), OFF(Link.pubPasswd), OPT_STR, 0,
248
- "Publisher password"
249
- },
250
- { {NULL,0}, 0, 0}
251
-};
252
-
253
-static const AVal truth[] =
254
-{
255
- AVC("1"),
256
- AVC("on"),
257
- AVC("yes"),
258
- AVC("true"),
259
- {0,0}
260
-};
261
-
262
-static void RTMP_OptUsage()
263
-{
264
- int i;
265
-
266
- RTMP_Log(RTMP_LOGERROR, "Valid RTMP options are:\n");
267
- for (i=0; options[i].name.av_len; i++)
268
- {
269
- RTMP_Log(RTMP_LOGERROR, "%10s %-7s %s\n", options[i].name.av_val,
270
- optinfo[options[i].otype], options[i].use);
271
- }
272
-}
273
-
274
static int
275
parseAMF(AMFObject *obj, AVal *av, int *depth)
276
{
277
278
return 0;
279
}
280
281
-int RTMP_SetOpt(RTMP *r, const AVal *opt, AVal *arg)
282
-{
283
- int i;
284
- void *v;
285
-
286
- for (i=0; options[i].name.av_len; i++)
287
- {
288
- if (opt->av_len != options[i].name.av_len) continue;
289
- if (strcasecmp(opt->av_val, options[i].name.av_val)) continue;
290
- v = (char *)r + options[i].off;
291
- switch(options[i].otype)
292
- {
293
- case OPT_STR:
294
- {
295
- AVal *aptr = v;
296
- *aptr = *arg;
297
- }
298
- break;
299
- case OPT_INT:
300
- {
301
- long l = strtol(arg->av_val, NULL, 0);
302
- *(int *)v = l;
303
- }
304
- break;
305
- case OPT_BOOL:
306
- {
307
- int j, fl;
308
- fl = *(int *)v;
309
- for (j=0; truth[j].av_len; j++)
310
- {
311
- if (arg->av_len != truth[j].av_len) continue;
312
- if (strcasecmp(arg->av_val, truth[j].av_val)) continue;
313
- fl |= options[i].omisc;
314
- break;
315
- }
316
- *(int *)v = fl;
317
- }
318
- break;
319
- case OPT_CONN:
320
- if (parseAMF(&r->Link.extras, arg, &r->Link.edepth))
321
- return FALSE;
322
- break;
323
- }
324
- break;
325
- }
326
- if (!options[i].name.av_len)
327
- {
328
- RTMP_Log(RTMP_LOGERROR, "Unknown option %s", opt->av_val);
329
- RTMP_OptUsage();
330
- return FALSE;
331
- }
332
-
333
- return TRUE;
334
-}
335
-
336
int RTMP_SetupURL(RTMP *r, char *url)
337
{
338
- AVal opt, arg;
339
- char *p1, *p2, *ptr = strchr(url, ' ');
340
int ret, len;
341
unsigned int port = 0;
342
343
- if (ptr)
344
- *ptr = '\0';
345
-
346
len = (int)strlen(url);
347
ret = RTMP_ParseURL(url, &r->Link.protocol, &r->Link.hostname,
348
- &port, &r->Link.playpath0, &r->Link.app);
349
- if (!ret)
350
- return ret;
351
- r->Link.port = port;
352
- r->Link.playpath = r->Link.playpath0;
353
-
354
- while (ptr)
355
- {
356
- *ptr++ = '\0';
357
- p1 = ptr;
358
- p2 = strchr(p1, '=');
359
- if (!p2)
360
- break;
361
- opt.av_val = p1;
362
- opt.av_len = p2 - p1;
363
- *p2++ = '\0';
364
- arg.av_val = p2;
365
- ptr = strchr(p2, ' ');
366
- if (ptr)
367
- {
368
- *ptr = '\0';
369
- arg.av_len = ptr - p2;
370
- /* skip repeated spaces */
371
- while(ptr[1] == ' ')
372
- *ptr++ = '\0';
373
- }
374
- else
375
- {
376
- arg.av_len = (int)strlen(p2);
377
- }
378
-
379
- /* unescape */
380
- port = arg.av_len;
381
- for (p1=p2; port >0;)
382
- {
383
- if (*p1 == '\\')
384
- {
385
- unsigned int c;
386
- if (port < 3)
387
- return FALSE;
388
- sscanf(p1+1, "%02x", &c);
389
- *p2++ = c;
390
- port -= 3;
391
- p1 += 3;
392
- }
393
- else
394
- {
395
- *p2++ = *p1++;
396
- port--;
397
- }
398
- }
399
- arg.av_len = p2 - arg.av_val;
400
-
401
- ret = RTMP_SetOpt(r, &opt, &arg);
402
- if (!ret)
403
- return ret;
404
- }
405
-
406
- if (!r->Link.tcUrl.av_len)
407
- {
408
- r->Link.tcUrl.av_val = url;
409
- if (r->Link.app.av_len)
410
- {
411
- if (r->Link.app.av_val < url + len)
412
- {
413
- /* if app is part of original url, just use it */
414
- r->Link.tcUrl.av_len = r->Link.app.av_len + (r->Link.app.av_val - url);
415
- }
416
- else
417
- {
418
- len = r->Link.hostname.av_len + r->Link.app.av_len +
419
- sizeof("rtmpte://:65535/");
420
- r->Link.tcUrl.av_val = malloc(len);
421
- r->Link.tcUrl.av_len = snprintf(r->Link.tcUrl.av_val, len,
422
- "%s://%.*s:%d/%.*s",
423
- RTMPProtocolStringsLower[r->Link.protocol],
424
- r->Link.hostname.av_len, r->Link.hostname.av_val,
425
- r->Link.port,
426
- r->Link.app.av_len, r->Link.app.av_val);
427
- r->Link.lFlags |= RTMP_LF_FTCU;
428
- }
429
- }
430
- else
431
- {
432
- r->Link.tcUrl.av_len = (int)strlen(url);
433
- }
434
- }
435
-
436
-#ifdef CRYPTO
437
- if ((r->Link.lFlags & RTMP_LF_SWFV) && r->Link.swfUrl.av_len)
438
- RTMP_HashSWF(r->Link.swfUrl.av_val, &r->Link.SWFSize,
439
- (unsigned char *)r->Link.SWFHash, r->Link.swfAge);
440
-#endif
441
-
442
- SocksSetup(r, &r->Link.sockshost);
443
-
444
- if (r->Link.port == 0)
445
- {
446
- if (r->Link.protocol & RTMP_FEATURE_SSL)
447
- r->Link.port = 443;
448
- else if (r->Link.protocol & RTMP_FEATURE_HTTP)
449
- r->Link.port = 80;
450
- else
451
- r->Link.port = 1935;
452
- }
453
- return TRUE;
454
-}
455
-
456
-int RTMP_SetupURL2(RTMP *r, char *url, char *playpath)
457
-{
458
- AVal opt, arg;
459
- char *p1, *p2, *ptr = strchr(url, ' ');
460
- int ret, len;
461
- unsigned int port = 0;
462
-
463
- if (ptr)
464
- *ptr = '\0';
465
-
466
- len = (int)strlen(url);
467
- ret = RTMP_ParseURL2(url, &r->Link.protocol, &r->Link.hostname,
468
&port, &r->Link.app);
469
if (!ret)
470
return ret;
471
r->Link.port = port;
472
473
- if(playpath && *playpath)
474
- {
475
- AVal pp = {playpath, (int)strlen(playpath)};
476
- RTMP_ParsePlaypath(&pp, &r->Link.playpath0);
477
- }
478
-
479
- r->Link.playpath = r->Link.playpath0;
480
-
481
- while (ptr)
482
- {
483
- *ptr++ = '\0';
484
- p1 = ptr;
485
- p2 = strchr(p1, '=');
486
- if (!p2)
487
- break;
488
- opt.av_val = p1;
489
- opt.av_len = p2 - p1;
490
- *p2++ = '\0';
491
- arg.av_val = p2;
492
- ptr = strchr(p2, ' ');
493
- if (ptr)
494
- {
495
- *ptr = '\0';
496
- arg.av_len = ptr - p2;
497
- /* skip repeated spaces */
498
- while(ptr[1] == ' ')
499
- *ptr++ = '\0';
500
- }
501
- else
502
- {
503
- arg.av_len = (int)strlen(p2);
504
- }
505
-
506
- /* unescape */
507
- port = arg.av_len;
508
- for (p1=p2; port >0;)
509
- {
510
- if (*p1 == '\\')
511
- {
512
- unsigned int c;
513
- if (port < 3)
514
- return FALSE;
515
- sscanf(p1+1, "%02x", &c);
516
- *p2++ = c;
517
- port -= 3;
518
- p1 += 3;
519
- }
520
- else
521
- {
522
- *p2++ = *p1++;
523
- port--;
524
- }
525
- }
526
- arg.av_len = p2 - arg.av_val;
527
-
528
- ret = RTMP_SetOpt(r, &opt, &arg);
529
- if (!ret)
530
- return ret;
531
- }
532
-
533
if (!r->Link.tcUrl.av_len)
534
{
535
r->Link.tcUrl.av_val = url;
536
537
return TRUE;
538
}
539
540
+int RTMP_AddStream(RTMP *r, const char *playpath)
541
+{
542
+ int idx = -1;
543
+
544
+ if (playpath && *playpath)
545
+ {
546
+ AVal pp = {(char*)playpath, (int)strlen(playpath)};
547
+ RTMP_ParsePlaypath(&pp, &r->Link.streams[r->Link.nStreams].playpath);
548
+ r->Link.streams[r->Link.nStreams].id = -1;
549
+
550
+ idx = r->Link.nStreams;
551
+ r->Link.nStreams++;
552
+ }
553
+
554
+ return idx;
555
+}
556
+
557
static int
558
-add_addr_info(struct sockaddr_in *service, AVal *host, int port)
559
+add_addr_info(struct sockaddr_storage *service, socklen_t *addrlen, AVal *host, int port)
560
{
561
char *hostname;
562
int ret = TRUE;
563
- if (host->av_val[host->av_len])
564
+ if (host->av_val[host->av_len] || host->av_val[0] == '[')
565
{
566
- hostname = malloc(host->av_len+1);
567
- memcpy(hostname, host->av_val, host->av_len);
568
- hostname[host->av_len] = '\0';
569
+ int v6 = host->av_val[0] == '[';
570
+ hostname = malloc(host->av_len+1 - v6 * 2);
571
+ memcpy(hostname, host->av_val + v6, host->av_len - v6 * 2);
572
+ hostname[host->av_len - v6 * 2] = '\0';
573
}
574
else
575
{
576
hostname = host->av_val;
577
}
578
579
- service->sin_addr.s_addr = inet_addr(hostname);
580
- if (service->sin_addr.s_addr == INADDR_NONE)
581
+ struct addrinfo hints;
582
+ struct addrinfo *result = NULL;
583
+ struct addrinfo *ptr = NULL;
584
+
585
+ memset(&hints, 0, sizeof(hints));
586
+
587
+ hints.ai_family = AF_UNSPEC;
588
+ hints.ai_socktype = SOCK_STREAM;
589
+ hints.ai_protocol = IPPROTO_TCP;
590
+
591
+ service->ss_family = AF_UNSPEC;
592
+ *addrlen = 0;
593
+
594
+ char portStr[8];
595
+
596
+ sprintf(portStr, "%d", port);
597
+
598
+ int err = getaddrinfo(hostname, portStr, &hints, &result);
599
+
600
+ if (err)
601
{
602
- struct hostent *host = gethostbyname(hostname);
603
- if (host == NULL || host->h_addr == NULL)
604
+#ifndef _WIN32
605
+#define gai_strerrorA gai_strerror
606
+#endif
607
+ RTMP_Log(RTMP_LOGERROR, "Could not resolve %s: %s (%d)", hostname, gai_strerrorA(GetSockError()), GetSockError());
608
+ ret = FALSE;
609
+ goto finish;
610
+ }
611
+
612
+ // they should come back in OS preferred order
613
+ for (ptr = result; ptr != NULL; ptr = ptr->ai_next)
614
+ {
615
+ if (ptr->ai_family == AF_INET || ptr->ai_family == AF_INET6)
616
{
617
- RTMP_Log(RTMP_LOGERROR, "Problem accessing the DNS. (addr: %s, error: %d)", hostname, GetSockError());
618
- ret = FALSE;
619
- goto finish;
620
+ memcpy(service, ptr->ai_addr, ptr->ai_addrlen);
621
+ *addrlen = (socklen_t)ptr->ai_addrlen;
622
+ break;
623
}
624
- service->sin_addr = *(struct in_addr *)host->h_addr;
625
}
626
627
- service->sin_port = htons(port);
628
+ freeaddrinfo(result);
629
+
630
+ if (service->ss_family == AF_UNSPEC || *addrlen == 0)
631
+ {
632
+ RTMP_Log(RTMP_LOGERROR, "Could not resolve server '%s': no valid address found", hostname);
633
+ ret = FALSE;
634
+ goto finish;
635
+ }
636
+
637
finish:
638
if (hostname != host->av_val)
639
free(hostname);
640
641
#endif
642
643
int
644
-RTMP_Connect0(RTMP *r, struct sockaddr * service)
645
+RTMP_Connect0(RTMP *r, struct sockaddr * service, socklen_t addrlen)
646
{
647
int on = 1;
648
r->m_sb.sb_timedout = FALSE;
649
650
651
//best to be explicit, we need overlapped socket
652
#ifdef _WIN32
653
- r->m_sb.sb_socket = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
654
+ r->m_sb.sb_socket = WSASocket(service->sa_family, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
655
#else
656
- r->m_sb.sb_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
657
+ r->m_sb.sb_socket = socket(service->sa_family, SOCK_STREAM, IPPROTO_TCP);
658
#endif
659
660
- if (r->m_sb.sb_socket != -1)
661
+ if (r->m_sb.sb_socket != INVALID_SOCKET)
662
{
663
if(r->m_bindIP.addrLen)
664
{
665
666
}
667
}
668
669
- if (connect(r->m_sb.sb_socket, service, sizeof(struct sockaddr)) < 0)
670
+ if (connect(r->m_sb.sb_socket, service, addrlen) < 0)
671
{
672
int err = GetSockError();
673
if (err == E_CONNREFUSED)
674
675
int
676
RTMP_Connect(RTMP *r, RTMPPacket *cp)
677
{
678
- struct sockaddr_in service;
679
+#ifdef _WIN32
680
+ HOSTENT *h;
681
+#endif
682
+ struct sockaddr_storage service;
683
+ socklen_t addrlen = 0;
684
if (!r->Link.hostname.av_len)
685
return FALSE;
686
687
- memset(&service, 0, sizeof(struct sockaddr_in));
688
- service.sin_family = AF_INET;
689
+#ifdef _WIN32
690
+ //COMODO security software sandbox blocks all DNS by returning "host not found"
691
+ h = gethostbyname("localhost");
692
+ if (!h && GetLastError() == WSAHOST_NOT_FOUND)
693
+ {
694
+ RTMP_Log(RTMP_LOGERROR, "RTMP_Connect: Connection test failed. This error is likely caused by Comodo Internet Security running OBS in sandbox mode. Please add OBS to the Comodo automatic sandbox exclusion list, restart OBS and try again (11001).");
695
+ return FALSE;
696
+ }
697
+#endif
698
+
699
+ memset(&service, 0, sizeof(service));
700
701
if (r->Link.socksport)
702
{
703
/* Connect via SOCKS */
704
- if (!add_addr_info(&service, &r->Link.sockshost, r->Link.socksport))
705
+ if (!add_addr_info(&service, &addrlen, &r->Link.sockshost, r->Link.socksport))
706
return FALSE;
707
}
708
else
709
{
710
/* Connect directly */
711
- if (!add_addr_info(&service, &r->Link.hostname, r->Link.port))
712
+ if (!add_addr_info(&service, &addrlen, &r->Link.hostname, r->Link.port))
713
return FALSE;
714
}
715
716
- if (!RTMP_Connect0(r, (struct sockaddr *)&service))
717
+ if (!RTMP_Connect0(r, (struct sockaddr *)&service, addrlen))
718
return FALSE;
719
720
r->m_bSendCounter = TRUE;
721
722
SocksNegotiate(RTMP *r)
723
{
724
unsigned long addr;
725
- struct sockaddr_in service;
726
- memset(&service, 0, sizeof(struct sockaddr_in));
727
+ struct sockaddr_storage service;
728
+ socklen_t addrlen = 0;
729
+ memset(&service, 0, sizeof(service));
730
+
731
+ add_addr_info(&service, &addrlen, &r->Link.hostname, r->Link.port);
732
+
733
+ // not doing IPv6 socks
734
+ if (service.ss_family == AF_INET6)
735
+ return FALSE;
736
737
- add_addr_info(&service, &r->Link.hostname, r->Link.port);
738
- addr = htonl(service.sin_addr.s_addr);
739
+ addr = htonl((*(struct sockaddr_in *)&service).sin_addr.s_addr);
740
741
{
742
char packet[] =
743
744
}
745
746
int
747
-RTMP_ReconnectStream(RTMP *r, int seekTime)
748
+RTMP_ReconnectStream(RTMP *r, int seekTime, int streamIdx)
749
{
750
- RTMP_DeleteStream(r);
751
+ RTMP_DeleteStream(r, streamIdx);
752
753
RTMP_SendCreateStream(r);
754
755
756
}
757
758
void
759
-RTMP_DeleteStream(RTMP *r)
760
+RTMP_DeleteStream(RTMP *r, int streamIdx)
761
{
762
if (r->m_stream_id < 0)
763
return;
764
765
r->m_bPlaying = FALSE;
766
767
if ((r->Link.protocol & RTMP_FEATURE_WRITE))
768
- SendFCUnpublish(r);
769
+ SendFCUnpublish(r, streamIdx);
770
771
SendDeleteStream(r, r->m_stream_id);
772
r->m_stream_id = -1;
773
774
RTMP_Log(RTMP_LOGDEBUG, "%s, unknown packet type received: 0x%02x", __FUNCTION__,
775
packet->m_packetType);
776
#ifdef _DEBUG
777
- RTMP_LogHex(RTMP_LOGDEBUG, (uint8_t*)packet->m_body, packet->m_nBodySize);
778
+ RTMP_LogHex(RTMP_LOGDEBUG, (const uint8_t*)packet->m_body, packet->m_nBodySize);
779
#endif
780
}
781
782
783
SAVC(releaseStream);
784
785
static int
786
-SendReleaseStream(RTMP *r)
787
+SendReleaseStream(RTMP *r, int streamIdx)
788
{
789
RTMPPacket packet;
790
char pbuf[1024], *pend = pbuf + sizeof(pbuf);
791
792
enc = AMF_EncodeString(enc, pend, &av_releaseStream);
793
enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes);
794
*enc++ = AMF_NULL;
795
- enc = AMF_EncodeString(enc, pend, &r->Link.playpath);
796
+ enc = AMF_EncodeString(enc, pend, &r->Link.streams[streamIdx].playpath);
797
if (!enc)
798
return FALSE;
799
800
801
SAVC(FCPublish);
802
803
static int
804
-SendFCPublish(RTMP *r)
805
+SendFCPublish(RTMP *r, int streamIdx)
806
{
807
RTMPPacket packet;
808
char pbuf[1024], *pend = pbuf + sizeof(pbuf);
809
810
enc = AMF_EncodeString(enc, pend, &av_FCPublish);
811
enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes);
812
*enc++ = AMF_NULL;
813
- enc = AMF_EncodeString(enc, pend, &r->Link.playpath);
814
+ enc = AMF_EncodeString(enc, pend, &r->Link.streams[streamIdx].playpath);
815
if (!enc)
816
return FALSE;
817
818
819
SAVC(FCUnpublish);
820
821
static int
822
-SendFCUnpublish(RTMP *r)
823
+SendFCUnpublish(RTMP *r, int streamIdx)
824
{
825
RTMPPacket packet;
826
char pbuf[1024], *pend = pbuf + sizeof(pbuf);
827
828
enc = AMF_EncodeString(enc, pend, &av_FCUnpublish);
829
enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes);
830
*enc++ = AMF_NULL;
831
- enc = AMF_EncodeString(enc, pend, &r->Link.playpath);
832
+ enc = AMF_EncodeString(enc, pend, &r->Link.streams[streamIdx].playpath);
833
if (!enc)
834
return FALSE;
835
836
837
838
SAVC(publish);
839
SAVC(live);
840
-#if 0
841
-SAVC(record);
842
-#endif
843
844
static int
845
-SendPublish(RTMP *r)
846
+SendPublish(RTMP *r, int streamIdx)
847
{
848
RTMPPacket packet;
849
char pbuf[1024], *pend = pbuf + sizeof(pbuf);
850
851
packet.m_headerType = RTMP_PACKET_SIZE_LARGE;
852
packet.m_packetType = RTMP_PACKET_TYPE_INVOKE;
853
packet.m_nTimeStamp = 0;
854
- packet.m_nInfoField2 = r->m_stream_id;
855
+ packet.m_nInfoField2 = r->Link.streams[streamIdx].id;
856
packet.m_hasAbsTimestamp = 0;
857
packet.m_body = pbuf + RTMP_MAX_HEADER_SIZE;
858
859
860
enc = AMF_EncodeString(enc, pend, &av_publish);
861
enc = AMF_EncodeNumber(enc, pend, ++r->m_numInvokes);
862
*enc++ = AMF_NULL;
863
- enc = AMF_EncodeString(enc, pend, &r->Link.playpath);
864
+ enc = AMF_EncodeString(enc, pend, &r->Link.streams[streamIdx].playpath);
865
if (!enc)
866
return FALSE;
867
868
869
SAVC(play);
870
871
static int
872
-SendPlay(RTMP *r)
873
+SendPlay(RTMP *r, int streamIdx)
874
{
875
RTMPPacket packet;
876
char pbuf[1024], *pend = pbuf + sizeof(pbuf);
877
878
packet.m_headerType = RTMP_PACKET_SIZE_LARGE;
879
packet.m_packetType = RTMP_PACKET_TYPE_INVOKE;
880
packet.m_nTimeStamp = 0;
881
- packet.m_nInfoField2 = r->m_stream_id; /*0x01000000; */
882
+ packet.m_nInfoField2 = r->Link.streams[streamIdx].id; /*0x01000000; */
883
packet.m_hasAbsTimestamp = 0;
884
packet.m_body = pbuf + RTMP_MAX_HEADER_SIZE;
885
886
887
888
RTMP_Log(RTMP_LOGDEBUG, "%s, seekTime=%d, stopTime=%d, sending play: %s",
889
__FUNCTION__, r->Link.seekTime, r->Link.stopTime,
890
- r->Link.playpath.av_val);
891
- enc = AMF_EncodeString(enc, pend, &r->Link.playpath);
892
+ r->Link.streams[streamIdx].playpath.av_val);
893
+ enc = AMF_EncodeString(enc, pend, &r->Link.streams[streamIdx].playpath);
894
if (!enc)
895
return FALSE;
896
897
898
SAVC(0);
899
900
static int
901
-SendPlaylist(RTMP *r)
902
+SendPlaylist(RTMP *r, int streamIdx)
903
{
904
RTMPPacket packet;
905
char pbuf[1024], *pend = pbuf + sizeof(pbuf);
906
907
packet.m_headerType = RTMP_PACKET_SIZE_LARGE;
908
packet.m_packetType = RTMP_PACKET_TYPE_INVOKE;
909
packet.m_nTimeStamp = 0;
910
- packet.m_nInfoField2 = r->m_stream_id; /*0x01000000; */
911
+ packet.m_nInfoField2 = r->Link.streams[streamIdx].id; /*0x01000000; */
912
packet.m_hasAbsTimestamp = 0;
913
packet.m_body = pbuf + RTMP_MAX_HEADER_SIZE;
914
915
916
*enc++ = 0;
917
*enc++ = 0;
918
*enc++ = AMF_OBJECT;
919
- enc = AMF_EncodeNamedString(enc, pend, &av_0, &r->Link.playpath);
920
+ enc = AMF_EncodeNamedString(enc, pend, &av_0, &r->Link.streams[streamIdx].playpath);
921
if (!enc)
922
return FALSE;
923
if (enc + 3 >= pend)
924
925
*ptr = '\0';
926
}
927
928
+static char *AValChr(AVal *av, char c)
929
+{
930
+ int i;
931
+ for (i = 0; i < av->av_len; i++)
932
+ {
933
+ if (av->av_val[i] == c)
934
+ return &av->av_val[i];
935
+ }
936
+ return NULL;
937
+}
938
+
939
static int
940
PublisherAuth(RTMP *r, AVal *description)
941
{
942
943
{
944
char *par, *val = NULL, *orig_ptr;
945
AVal user, salt, opaque, challenge, *aptr = NULL;
946
- opaque.av_len = 0;
947
- challenge.av_len = 0;
948
+
949
+ opaque.av_len = challenge.av_len = salt.av_len = user.av_len = 0;
950
+ opaque.av_val = challenge.av_val = salt.av_val = user.av_val = NULL;
951
952
ptr = orig_ptr = strdup(token_in);
953
while (ptr)
954
955
/* cnonce = hexenc(4 random bytes) (initialized on first connection) */
956
char cnonce[9];
957
958
+ nonce.av_len = user.av_len = 0;
959
+ nonce.av_val = user.av_val = NULL;
960
+
961
ptr = orig_ptr = strdup(token_in);
962
/* Extract parameters (we need user and nonce) */
963
while (ptr)
964
965
/* hash2 = hexenc(md5(method + ":/" + app + "/" + appInstance)) */
966
/* Extract appname + appinstance without query parameters */
967
apptmp = r->Link.app;
968
- ptr = strchr(apptmp.av_val, '?');
969
+ ptr = AValChr(&apptmp, '?');
970
if (ptr)
971
apptmp.av_len = ptr - apptmp.av_val;
972
973
974
MD5_Update(&md5ctx, (void *)method, sizeof(method)-1);
975
MD5_Update(&md5ctx, ":/", 2);
976
MD5_Update(&md5ctx, apptmp.av_val, apptmp.av_len);
977
+ if (!AValChr(&apptmp, '/'))
978
+ MD5_Update(&md5ctx, "/_definst_", sizeof("/_definst_") - 1);
979
MD5_Final(md5sum_val, &md5ctx);
980
RTMP_Log(RTMP_LOGDEBUG, "%s, md5(%s:/%.*s) =>", __FUNCTION__,
981
method, apptmp.av_len, apptmp.av_val);
982
983
static const AVal av_NetStream_Publish_Start = AVC("NetStream.Publish.Start");
984
static const AVal av_NetStream_Publish_Rejected = AVC("NetStream.Publish.Rejected");
985
static const AVal av_NetStream_Publish_Denied = AVC("NetStream.Publish.Denied");
986
-#if 0
987
-static const AVal av_NetConnection_Connect_Rejected =
988
- AVC("NetConnection.Connect.Rejected");
989
-#endif
990
991
/* Returns 0 for OK/Failed/error, 1 for 'Stop or Complete' */
992
static int
993
994
}
995
if (r->Link.protocol & RTMP_FEATURE_WRITE)
996
{
997
- SendReleaseStream(r);
998
- SendFCPublish(r);
999
+ for (int i = 0; i < r->Link.nStreams; i++)
1000
+ SendReleaseStream(r, i);
1001
+ for (int i = 0; i < r->Link.nStreams; i++)
1002
+ SendFCPublish(r, i);
1003
}
1004
else
1005
{
1006
RTMP_SendServerBW(r);
1007
RTMP_SendCtrl(r, 3, 0, 300);
1008
}
1009
- RTMP_SendCreateStream(r);
1010
+
1011
+ for (int i = 0; i < r->Link.nStreams; i++)
1012
+ RTMP_SendCreateStream(r);
1013
1014
if (!(r->Link.protocol & RTMP_FEATURE_WRITE))
1015
{
1016
1017
if (r->Link.subscribepath.av_len)
1018
SendFCSubscribe(r, &r->Link.subscribepath);
1019
else if (r->Link.lFlags & RTMP_LF_LIVE)
1020
- SendFCSubscribe(r, &r->Link.playpath);
1021
+ {
1022
+ for (int i = 0; i < r->Link.nStreams; i++)
1023
+ SendFCSubscribe(r, &r->Link.streams[i].playpath);
1024
+ }
1025
}
1026
}
1027
else if (AVMATCH(&methodInvoked, &av_createStream))
1028
{
1029
- r->m_stream_id = (int)AMFProp_GetNumber(AMF_GetProp(&obj, NULL, 3));
1030
+ int id = (int)AMFProp_GetNumber(AMF_GetProp(&obj, NULL, 3));
1031
+ r->Link.streams[r->Link.curStreamIdx].id = id;
1032
1033
if (r->Link.protocol & RTMP_FEATURE_WRITE)
1034
- {
1035
- SendPublish(r);
1036
- }
1037
+ SendPublish(r, r->Link.curStreamIdx);
1038
else
1039
{
1040
if (r->Link.lFlags & RTMP_LF_PLST)
1041
- SendPlaylist(r);
1042
- SendPlay(r);
1043
- RTMP_SendCtrl(r, 3, r->m_stream_id, r->m_nBufferMS);
1044
+ SendPlaylist(r, r->Link.curStreamIdx);
1045
+ SendPlay(r, r->Link.curStreamIdx);
1046
+ RTMP_SendCtrl(r, 3, id, r->m_nBufferMS);
1047
}
1048
+
1049
+ r->Link.curStreamIdx++;
1050
}
1051
else if (AVMATCH(&methodInvoked, &av_play) ||
1052
AVMATCH(&methodInvoked, &av_publish))
1053
{
1054
r->m_bPlaying = TRUE;
1055
+ r->Link.playingStreams++;
1056
}
1057
free(methodInvoked.av_val);
1058
}
1059
1060
char *header = (char *)hbuf;
1061
int nSize, hSize, nToRead, nChunk;
1062
// int didAlloc = FALSE;
1063
+ int extendedTimestamp = 0;
1064
1065
- RTMP_Log(RTMP_LOGDEBUG2, "%s: fd=%d", __FUNCTION__, r->m_sb.sb_socket);
1066
+ RTMP_Log(RTMP_LOGDEBUG2, "%s: fd=%d", __FUNCTION__, (int)r->m_sb.sb_socket);
1067
1068
if (ReadN(r, (char *)hbuf, 1) == 0)
1069
{
1070
1071
packet->m_nInfoField2 = DecodeInt32LE(header + 7);
1072
}
1073
}
1074
- if (packet->m_nTimeStamp == 0xffffff)
1075
+
1076
+ extendedTimestamp = (packet->m_nTimeStamp == 0xffffff);
1077
+
1078
+ if (extendedTimestamp)
1079
{
1080
if (ReadN(r, header + nSize, 4) != 4)
1081
{
1082
1083
if (!r->m_vecChannelsIn[packet->m_nChannel])
1084
r->m_vecChannelsIn[packet->m_nChannel] = malloc(sizeof(RTMPPacket));
1085
memcpy(r->m_vecChannelsIn[packet->m_nChannel], packet, sizeof(RTMPPacket));
1086
+ if (extendedTimestamp)
1087
+ r->m_vecChannelsIn[packet->m_nChannel]->m_nTimeStamp = 0xffffff;
1088
1089
if (RTMPPacket_IsReady(packet))
1090
{
1091
1092
int wrote;
1093
char hbuf[RTMP_MAX_HEADER_SIZE];
1094
1095
- RTMP_Log(RTMP_LOGDEBUG2, "%s: fd=%d, size=%d", __FUNCTION__, r->m_sb.sb_socket,
1096
+ RTMP_Log(RTMP_LOGDEBUG2, "%s: fd=%d, size=%d", __FUNCTION__, (int)r->m_sb.sb_socket,
1097
chunk->c_chunkSize);
1098
RTMP_LogHexString(RTMP_LOGDEBUG2, (uint8_t *)chunk->c_header, chunk->c_headerSize);
1099
if (chunk->c_chunkSize)
1100
1101
buffer = packet->m_body;
1102
nChunkSize = r->m_outChunkSize;
1103
1104
- RTMP_Log(RTMP_LOGDEBUG2, "%s: fd=%d, size=%d", __FUNCTION__, r->m_sb.sb_socket,
1105
+ RTMP_Log(RTMP_LOGDEBUG2, "%s: fd=%d, size=%d", __FUNCTION__, (int)r->m_sb.sb_socket,
1106
nSize);
1107
/* send all chunks in one HTTP request */
1108
if (r->Link.protocol & RTMP_FEATURE_HTTP)
1109
1110
1111
if (RTMP_IsConnected(r))
1112
{
1113
- if (r->m_stream_id > 0)
1114
+ for (int idx = 0; idx < r->Link.nStreams; idx++)
1115
{
1116
- i = r->m_stream_id;
1117
- r->m_stream_id = 0;
1118
- if ((r->Link.protocol & RTMP_FEATURE_WRITE))
1119
- SendFCUnpublish(r);
1120
- SendDeleteStream(r, i);
1121
+ if (r->Link.streams[idx].id > 0)
1122
+ {
1123
+ i = r->Link.streams[idx].id;
1124
+ r->Link.streams[idx].id = 0;
1125
+ if ((r->Link.protocol & RTMP_FEATURE_WRITE))
1126
+ SendFCUnpublish(r, idx);
1127
+ SendDeleteStream(r, (double)i);
1128
+ }
1129
}
1130
if (r->m_clientID.av_val)
1131
{
1132
1133
RTMPSockBuf_Close(&r->m_sb);
1134
}
1135
1136
+ for (int idx = 0; idx < r->Link.nStreams; idx++)
1137
+ r->Link.streams[idx].id = -1;
1138
+
1139
r->m_stream_id = -1;
1140
r->m_sb.sb_socket = -1;
1141
r->m_nBWCheckCounter = 0;
1142
1143
r->m_numInvokes = 0;
1144
1145
r->m_bPlaying = FALSE;
1146
+ r->Link.playingStreams = 0;
1147
r->m_sb.sb_size = 0;
1148
1149
r->m_msgCounter = 0;
1150
1151
r->Link.rc4keyOut = NULL;
1152
}
1153
#else
1154
- free(r->Link.playpath0.av_val);
1155
- r->Link.playpath0.av_val = NULL;
1156
+ for (int idx = 0; idx < r->Link.nStreams; idx++)
1157
+ {
1158
+ free(r->Link.streams[idx].playpath.av_val);
1159
+ r->Link.streams[idx].playpath.av_val = NULL;
1160
+ }
1161
+
1162
+ r->Link.nStreams = 0;
1163
#endif
1164
}
1165
1166
1167
sb->sb_ssl = NULL;
1168
}
1169
#endif
1170
- if (sb->sb_socket != -1)
1171
+ if (sb->sb_socket != INVALID_SOCKET)
1172
return closesocket(sb->sb_socket);
1173
return 0;
1174
}
1175
1176
1177
if (recopy)
1178
{
1179
- len = (unsigned int)(ret) > buflen ? buflen : (unsigned int)ret;
1180
- memcpy(buf, r->m_read.buf, len);
1181
+ len = ret > (int)(buflen) ? buflen : (unsigned int)(ret);
1182
+ memcpy(buf, r->m_read.buf, len);
1183
r->m_read.bufpos = r->m_read.buf + len;
1184
r->m_read.buflen = ret - len;
1185
}
1186
1187
memcpy(mybuf, flvHeader, sizeof(flvHeader));
1188
r->m_read.buf += sizeof(flvHeader);
1189
r->m_read.buflen -= sizeof(flvHeader);
1190
+ cnt += sizeof(flvHeader);
1191
1192
while (r->m_read.timestamp == 0)
1193
{
1194
1195
{
1196
mybuf = realloc(mybuf, cnt + nRead);
1197
memcpy(mybuf+cnt, r->m_read.buf, nRead);
1198
+ free(r->m_read.buf);
1199
r->m_read.buf = mybuf+cnt+nRead;
1200
break;
1201
}
1202
1203
static const AVal av_setDataFrame = AVC("@setDataFrame");
1204
1205
int
1206
-RTMP_Write(RTMP *r, const char *buf, int size)
1207
+RTMP_Write(RTMP *r, const char *buf, int size, int streamIdx)
1208
{
1209
RTMPPacket *pkt = &r->m_write;
1210
char *pend, *enc;
1211
int s2 = size, ret, num;
1212
1213
pkt->m_nChannel = 0x04; /* source channel */
1214
- pkt->m_nInfoField2 = r->m_stream_id;
1215
+ pkt->m_nInfoField2 = r->Link.streams[streamIdx].id;
1216
1217
while (s2)
1218
{
1219
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-outputs/librtmp/rtmp.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-outputs/librtmp/rtmp.h
Changed
97
1
2
#include <stdint.h>
3
4
#ifdef _WIN32
5
+#ifdef _MSC_VER
6
#pragma warning(disable:4996) //depricated warnings
7
#pragma warning(disable:4244) //64bit defensive mechanism, fixed the ones that mattered
8
-#include <winsock.h>
9
+#endif
10
+#include <winsock2.h>
11
+#include <ws2tcpip.h>
12
#else
13
#include <sys/socket.h>
14
#include <netinet/in.h>
15
16
17
#define RTMPPacket_IsReady(a) ((a)->m_nBytesRead == (a)->m_nBodySize)
18
19
+ typedef struct RTMP_Stream {
20
+ int id;
21
+ AVal playpath;
22
+ } RTMP_Stream;
23
+
24
typedef struct RTMP_LNK
25
{
26
+#define RTMP_MAX_STREAMS 8
27
+ RTMP_Stream streams[RTMP_MAX_STREAMS];
28
+ int nStreams;
29
+ int curStreamIdx;
30
+ int playingStreams;
31
+
32
AVal hostname;
33
AVal sockshost;
34
35
- AVal playpath0; /* parsed from URL */
36
- AVal playpath; /* passed in explicitly */
37
AVal tcUrl;
38
AVal swfUrl;
39
AVal pageUrl;
40
41
42
typedef struct RTMP_BINDINFO
43
{
44
- struct sockaddr_in addr;
45
+ struct sockaddr_storage addr;
46
int addrLen;
47
} RTMP_BINDINFO;
48
49
50
} RTMP;
51
52
int RTMP_ParseURL(const char *url, int *protocol, AVal *host,
53
- unsigned int *port, AVal *playpath, AVal *app);
54
-
55
- int RTMP_ParseURL2(const char *url, int *protocol, AVal *host,
56
unsigned int *port, AVal *app);
57
58
void RTMP_ParsePlaypath(AVal *in, AVal *out);
59
60
61
int RTMP_SetOpt(RTMP *r, const AVal *opt, AVal *arg);
62
int RTMP_SetupURL(RTMP *r, char *url);
63
- int RTMP_SetupURL2(RTMP *r, char *url, char *playpath);
64
+ int RTMP_AddStream(RTMP *r, const char *playpath);
65
void RTMP_SetupStream(RTMP *r, int protocol,
66
AVal *hostname,
67
unsigned int port,
68
69
70
int RTMP_Connect(RTMP *r, RTMPPacket *cp);
71
struct sockaddr;
72
- int RTMP_Connect0(RTMP *r, struct sockaddr *svc);
73
+ int RTMP_Connect0(RTMP *r, struct sockaddr *svc, socklen_t addrlen);
74
int RTMP_Connect1(RTMP *r, RTMPPacket *cp);
75
int RTMP_Serve(RTMP *r);
76
int RTMP_TLS_Accept(RTMP *r, void *ctx);
77
78
int RTMP_ToggleStream(RTMP *r);
79
80
int RTMP_ConnectStream(RTMP *r, int seekTime);
81
- int RTMP_ReconnectStream(RTMP *r, int seekTime);
82
- void RTMP_DeleteStream(RTMP *r);
83
+ int RTMP_ReconnectStream(RTMP *r, int seekTime, int streamIdx);
84
+ void RTMP_DeleteStream(RTMP *r, int streamIdx);
85
int RTMP_GetNextMediaPacket(RTMP *r, RTMPPacket *packet);
86
int RTMP_ClientPacket(RTMP *r, RTMPPacket *packet);
87
88
89
int RTMP_SendClientBW(RTMP *r);
90
void RTMP_DropRequest(RTMP *r, int i, int freeit);
91
int RTMP_Read(RTMP *r, char *buf, int size);
92
- int RTMP_Write(RTMP *r, const char *buf, int size);
93
+ int RTMP_Write(RTMP *r, const char *buf, int size, int streamIdx);
94
95
/* hashswf.c */
96
int RTMP_HashSWF(const char *url, unsigned int *size, unsigned char *hash,
97
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-outputs/librtmp/rtmp_sys.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-outputs/librtmp/rtmp_sys.h
Changed
19
1
2
3
#include <winsock2.h>
4
#include <ws2tcpip.h>
5
+#include <Mstcpip.h>
6
7
8
#ifdef _MSC_VER /* MSVC */
9
10
#define closesocket(s) close(s)
11
#define msleep(n) usleep(n*1000)
12
#define SET_RCVTIMEO(tv,s) struct timeval tv = {s,0}
13
+#ifndef INVALID_SOCKET
14
+#define INVALID_SOCKET -1
15
+#endif
16
#endif
17
18
#include "rtmp.h"
19
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-outputs/rtmp-helpers.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-outputs/rtmp-helpers.h
Changed
10
1
2
along with this program. If not, see <http://www.gnu.org/licenses/>.
3
******************************************************************************/
4
5
+#pragma once
6
+
7
#include "librtmp/rtmp.h"
8
9
static inline AVal *flv_str(AVal *out, const char *str)
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-outputs/rtmp-stream.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-outputs/rtmp-stream.c
Changed
170
1
2
}
3
4
static int send_packet(struct rtmp_stream *stream,
5
- struct encoder_packet *packet, bool is_header)
6
+ struct encoder_packet *packet, bool is_header, size_t idx)
7
{
8
uint8_t *data;
9
size_t size;
10
11
#ifdef TEST_FRAMEDROPS
12
os_sleep_ms(rand() % 40);
13
#endif
14
- ret = RTMP_Write(&stream->rtmp, (char*)data, (int)size);
15
+ ret = RTMP_Write(&stream->rtmp, (char*)data, (int)size, (int)idx);
16
bfree(data);
17
18
obs_free_encoder_packet(packet);
19
20
send_headers(stream);
21
22
while (get_next_packet(stream, &packet))
23
- if (send_packet(stream, &packet, false) < 0)
24
+ if (send_packet(stream, &packet, false, packet.track_idx) < 0)
25
return false;
26
27
return true;
28
29
if (!stream->sent_headers)
30
send_headers(stream);
31
32
- if (send_packet(stream, &packet, false) < 0) {
33
+ if (send_packet(stream, &packet, false, packet.track_idx) < 0) {
34
disconnected = true;
35
break;
36
}
37
38
return NULL;
39
}
40
41
-static void send_meta_data(struct rtmp_stream *stream)
42
+static bool send_meta_data(struct rtmp_stream *stream, size_t idx)
43
{
44
uint8_t *meta_data;
45
size_t meta_data_size;
46
+ bool success = flv_meta_data(stream->output, &meta_data,
47
+ &meta_data_size, false, idx);
48
49
- flv_meta_data(stream->output, &meta_data, &meta_data_size, false);
50
- RTMP_Write(&stream->rtmp, (char*)meta_data, (int)meta_data_size);
51
- bfree(meta_data);
52
+ if (success) {
53
+ RTMP_Write(&stream->rtmp, (char*)meta_data,
54
+ (int)meta_data_size, (int)idx);
55
+ bfree(meta_data);
56
+ }
57
+
58
+ return success;
59
}
60
61
-static void send_audio_header(struct rtmp_stream *stream)
62
+static bool send_audio_header(struct rtmp_stream *stream, size_t idx)
63
{
64
obs_output_t *context = stream->output;
65
- obs_encoder_t *aencoder = obs_output_get_audio_encoder(context);
66
+ obs_encoder_t *aencoder = obs_output_get_audio_encoder(context, idx);
67
uint8_t *header;
68
69
struct encoder_packet packet = {
70
71
.timebase_den = 1
72
};
73
74
+ if (!aencoder)
75
+ return false;
76
+
77
obs_encoder_get_extra_data(aencoder, &header, &packet.size);
78
packet.data = bmemdup(header, packet.size);
79
- send_packet(stream, &packet, true);
80
+ send_packet(stream, &packet, true, idx);
81
+ return true;
82
}
83
84
static void send_video_header(struct rtmp_stream *stream)
85
86
87
obs_encoder_get_extra_data(vencoder, &header, &size);
88
packet.size = obs_parse_avc_header(&packet.data, header, size);
89
- send_packet(stream, &packet, true);
90
+ send_packet(stream, &packet, true, 0);
91
}
92
93
static inline void send_headers(struct rtmp_stream *stream)
94
{
95
stream->sent_headers = true;
96
- send_audio_header(stream);
97
+ size_t i = 0;
98
+
99
+ send_audio_header(stream, i++);
100
send_video_header(stream);
101
+
102
+ while (send_audio_header(stream, i++));
103
}
104
105
static inline bool reset_semaphore(struct rtmp_stream *stream)
106
107
static int init_send(struct rtmp_stream *stream)
108
{
109
int ret;
110
+ size_t idx = 0;
111
112
#if defined(_WIN32)
113
adjust_sndbuf_size(stream, MIN_SENDBUF_SIZE);
114
115
}
116
117
stream->active = true;
118
- send_meta_data(stream);
119
+ while (send_meta_data(stream, idx++));
120
obs_output_begin_data_capture(stream->output, 0);
121
122
return OBS_OUTPUT_SUCCESS;
123
124
125
info("Connecting to RTMP URL %s...", stream->path.array);
126
127
- if (!RTMP_SetupURL2(&stream->rtmp, stream->path.array,
128
- stream->key.array))
129
+ if (!RTMP_SetupURL(&stream->rtmp, stream->path.array))
130
return OBS_OUTPUT_BAD_PATH;
131
132
RTMP_EnableWrite(&stream->rtmp);
133
134
set_rtmp_str(&stream->rtmp.Link.flashVer,
135
"FMLE/3.0 (compatible; FMSc/1.0)");
136
137
+ RTMP_AddStream(&stream->rtmp, stream->key.array);
138
+
139
+ for (size_t idx = 1;; idx++) {
140
+ obs_encoder_t *encoder = obs_output_get_audio_encoder(
141
+ stream->output, idx);
142
+ const char *encoder_name;
143
+
144
+ if (!encoder)
145
+ break;
146
+
147
+ encoder_name = obs_encoder_get_name(encoder);
148
+ RTMP_AddStream(&stream->rtmp, encoder_name);
149
+ }
150
+
151
stream->rtmp.m_outChunkSize = 4096;
152
stream->rtmp.m_bSendChunkSizeInfo = true;
153
stream->rtmp.m_bUseNagle = true;
154
155
.id = "rtmp_output",
156
.flags = OBS_OUTPUT_AV |
157
OBS_OUTPUT_ENCODED |
158
- OBS_OUTPUT_SERVICE,
159
+ OBS_OUTPUT_SERVICE |
160
+ OBS_OUTPUT_MULTI_TRACK,
161
.get_name = rtmp_stream_getname,
162
.create = rtmp_stream_create,
163
.destroy = rtmp_stream_destroy,
164
165
.get_properties = rtmp_stream_properties,
166
.get_total_bytes = rtmp_stream_total_bytes_sent,
167
.get_dropped_frames = rtmp_stream_dropped_frames
168
-};
169
+};
170
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/ar-SA.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/ar-SA.ini
Changed
10
1
2
Bitrate="معدل النقل"
3
BufferSize="حجم المخزن المؤقت"
4
KeyframeIntervalSec="الفاصل الزمني لـKeyframe (ثانية, 0=تلقائي)"
5
-CPUPreset="استخدام المعالج (سرعة التشفير)"
6
Profile="الملف الشخصي"
7
Tune="لحن"
8
-EncoderOptions="خيارات تشفير x264 (مفصولة بالمسافة)"
9
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/bg-BG.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/bg-BG.ini
Changed
9
1
2
Bitrate="Битрейт"
3
BufferSize="Размер на буфера"
4
KeyframeIntervalSec="Keyframe интервал (секунди, 0 = автоматично)"
5
-CPUPreset="CPU Usage Preset (скорост на енкодера)"
6
Profile="Профил"
7
-EncoderOptions="x264 Настройки (отдалечени с празно място)"
8
9
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/da-DK.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/da-DK.ini
Changed
15
1
2
Bitrate="Bitrate"
3
+CustomBufsize="Brug brugerdefineret bufferstørrelse"
4
BufferSize="Bufferstørrelsen"
5
+UseCBR="Brug CBR"
6
+CRF="CRF"
7
KeyframeIntervalSec="Keyframe Interval (sekunder, 0 = auto)"
8
-CPUPreset="CPU Forbrug Forudindstillede (enkoder hastighed)"
9
Profile="Profil"
10
Tune="Stil ind"
11
-EncoderOptions="x264 Encoder Indstillinger (adskilt af mellemrum)"
12
+None="(Ingen)"
13
+EncoderOptions="x264 indstillinger (adskilt af mellemrum)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/de-DE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/de-DE.ini
Changed
16
1
2
Bitrate="Bitrate"
3
+CustomBufsize="Verwende benutzerdefinierte Puffergröße"
4
BufferSize="Puffergröße"
5
+UseCBR="Benutze CBR"
6
+CRF="CRF"
7
KeyframeIntervalSec="Keyframeintervall (Sekunden, 0=auto)"
8
-CPUPreset="CPU Voreinstellung (Encoder Geschwindigkeit)"
9
+CPUPreset="Prozessorauslastung-Voreinstellung (höher = weniger CPU Auslastung)"
10
Profile="Profil"
11
Tune="Tune"
12
-EncoderOptions="x264 Encoder-Optionen (durch Leerzeichen getrennt)"
13
+None="(Nichts)"
14
+EncoderOptions="x264 Optionen (durch Leerzeichen getrennt)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/el-GR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/el-GR.ini
Changed
16
1
2
Bitrate="Ρυθμός μετάδοσης bit"
3
+CustomBufsize="Χρήση Προσαρμοσμένου Μεγέθους Buffer"
4
BufferSize="Μέγεθος buffer"
5
+UseCBR="Χρήση CBR"
6
+CRF="CRF"
7
KeyframeIntervalSec="Συχνότητα Καρέ-Κλειδιού (δευτερόλεπτα, 0=αυτόματο)"
8
-CPUPreset="Προφίλ Χρήσης CPU (ταχύτητα κωδικοποιητή)"
9
+CPUPreset="Προφίλ Χρήσης CPU (υψηλότερο = λιγότερη CPU)"
10
Profile="Προφίλ"
11
Tune="Βελτιστοποίηση"
12
-EncoderOptions="Επιλογές κωδικοποιητή x264 (χωρίζονται με κενό)"
13
+None="(Κανένα)"
14
+EncoderOptions="Επιλογές x264 (διαχωρισμένες από κενό)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/en-US.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/en-US.ini
Changed
15
1
2
Bitrate="Bitrate"
3
+CustomBufsize="Use Custom Buffer Size"
4
BufferSize="Buffer Size"
5
+UseCBR="Use CBR"
6
+CRF="CRF"
7
KeyframeIntervalSec="Keyframe Interval (seconds, 0=auto)"
8
-CPUPreset="CPU Usage Preset (encoder speed)"
9
+CPUPreset="CPU Usage Preset (higher = less CPU)"
10
Profile="Profile"
11
Tune="Tune"
12
-EncoderOptions="x264 Encoder Options (separated by space)"
13
+None="(None)"
14
+EncoderOptions="x264 Options (separated by space)"
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/es-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/es-ES.ini
Changed
16
1
2
Bitrate="Tasa de bits"
3
+CustomBufsize="Usar tamaño de caché personalizado"
4
BufferSize="Tamaño de la memoria intermedia"
5
+UseCBR="Usar CBR"
6
+CRF="CRF"
7
KeyframeIntervalSec="Intervalo de fotogramas clave (segundos, 0 = auto)"
8
-CPUPreset="Preajuste del uso de CPU (velocidad del codificador)"
9
+CPUPreset="Perfíl de uso de CPU (superior = menos CPU)"
10
Profile="Perfil"
11
Tune="Sintonizar"
12
-EncoderOptions="Opciones del codificador x264 (separadas por espacio)"
13
+None="(Ninguno)"
14
+EncoderOptions="Opciones x264 (separadas por espacio)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/eu-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/eu-ES.ini
Changed
16
1
2
Bitrate="Bitneurria"
3
+CustomBufsize="Erabili Norbere Buffer Neurria"
4
BufferSize="Buffer Neurria"
5
+UseCBR="Erabili BNG"
6
+CRF="CRF"
7
KeyframeIntervalSec="Giltzaframe Tartea (segundu, 0=berez)"
8
-CPUPreset="CPU Erabilpen Aurrezarpena (kodeatzaile abiadura)"
9
+CPUPreset="CPU Erabilpen Aurrezarpena (handiagoa = CPU gutxiago)"
10
Profile="Profila"
11
Tune="Sintonizatu"
12
-EncoderOptions="x264 Kodeatzaile Aukerak (tarte batez bananduta)"
13
+None="(Bat ere ez)"
14
+EncoderOptions="x264 Aukerak (tarte batez bananduta)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/fi-FI.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/fi-FI.ini
Changed
16
1
2
Bitrate="Bitrate"
3
+CustomBufsize="Käytä valinnaista puskurin kokoa"
4
BufferSize="Puskurin koko"
5
+UseCBR="Käytä CBR"
6
+CRF="CRF"
7
KeyframeIntervalSec="Keyframe-väli (sec, 0=auto)"
8
-CPUPreset="CPU:n käytön esiasetus (enkooderin nopeus)"
9
+CPUPreset="CPU:n käyttö (korkeampi vaatii enemmän tehoa)"
10
Profile="Profiili"
11
Tune="Hienosäätö"
12
-EncoderOptions="x264-enkooderin valinnat (erotellaan välilyönnillä)"
13
+None="(Ei mitään)"
14
+EncoderOptions="x264-asetukset (erotetaan välilyönnillä)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/fr-FR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/fr-FR.ini
Changed
17
1
2
Bitrate="Débit"
3
+CustomBufsize="Utiliser une taille de buffer personnalisée"
4
BufferSize="Taille du Tampon"
5
-KeyframeIntervalSec="Intervalle d'image clé (secondes, 0=auto)"
6
-CPUPreset="Préconfiguration d'utilisation du CPU (vitesse de l'encodeur)"
7
+UseCBR="Utiliser CBR"
8
+CRF="CRF"
9
+KeyframeIntervalSec="Intervalle d'image-clé (en secondes, 0 = auto)"
10
+CPUPreset="Réglages prédéfinis du CPU (élevé = charge CPU faible)"
11
Profile="Profil"
12
Tune="Régler"
13
-EncoderOptions="Paramètres de l'Encodeur x264 (séparés par des espaces)"
14
+None="(Aucun)"
15
+EncoderOptions="Options x264 (séparées par un espace)"
16
17
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/gl-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/gl-ES.ini
Changed
16
1
2
Bitrate="Velocidade de bits"
3
+CustomBufsize="Utilizar tamaño da caché personalizado"
4
BufferSize="Tamaño do búfer"
5
+UseCBR="Utilizar CBR"
6
+CRF="CRF"
7
KeyframeIntervalSec="Intervalo de fotogramas chave (segundos, 0 = auto)"
8
-CPUPreset="Predefinición do uso da CPU (velocidade do codificador)"
9
+CPUPreset="Uso predefinido da CPU (superior = menos CPU)"
10
Profile="Perfil"
11
Tune="Sintonizar"
12
-EncoderOptions="Opcións do codificador x264 (separadas por espazo)"
13
+None="(Ningún)"
14
+EncoderOptions="Opcións x264 (separadas por un espazo)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/hr-HR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/hr-HR.ini
Changed
16
1
2
Bitrate="Protok"
3
+CustomBufsize="Koristi specifičnu veličinu bafera"
4
BufferSize="Veličina buffer-a"
5
+UseCBR="Koristi CBR"
6
+CRF="CRF"
7
KeyframeIntervalSec="Keyframe interval (sekunde, 0=automatski)"
8
-CPUPreset="Šablon iskorišćenja procesora (brzina enkodera)"
9
+CPUPreset="Koristi CPU šablon (veće = manje CPU-a)"
10
Profile="Profil"
11
Tune="Doterivanje"
12
-EncoderOptions="x264 enkoder opcije (odvojene razmakom)"
13
+None="(Nijedno)"
14
+EncoderOptions="x264 opcije (odvojene razmakom)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/hu-HU.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/hu-HU.ini
Changed
16
1
2
Bitrate="Bitráta"
3
+CustomBufsize="Egyéni pufferméret használata"
4
BufferSize="Bufferméret"
5
+UseCBR="CBR Használata"
6
+CRF="CRF"
7
KeyframeIntervalSec="Kulcsképkocka Időköze (másodperc, 0=auto)"
8
-CPUPreset="CPU Terhelési Készlet (kódoló sebesség)"
9
+CPUPreset="CPU Készlet (magasabb = kevesebb CPU igény)"
10
Profile="Profil"
11
Tune="Hangolás"
12
-EncoderOptions="x 264 Kódoló Beállítás (szóközzel elválasztva)"
13
+None="(Nincs)"
14
+EncoderOptions="x264 Opciók (szóközzel elválasztva)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/it-IT.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/it-IT.ini
Changed
10
1
2
Bitrate="Bitrate"
3
BufferSize="Grandezza buffer"
4
KeyframeIntervalSec="Intervallo keyframe (secondi, 0=auto)"
5
-CPUPreset="Pre imposta l'uso della CPU (velocità di codificazione)"
6
Profile="Profilo"
7
Tune="Regola"
8
-EncoderOptions="Opzioni codificatore x264 (sperate con uno spazio)"
9
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/ja-JP.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/ja-JP.ini
Changed
16
1
2
Bitrate="ビットレート"
3
+CustomBufsize="特定バッファサイズを使用"
4
BufferSize="バッファサイズ"
5
+UseCBR="CBRを使用する"
6
+CRF="CRF"
7
KeyframeIntervalSec="キーフレーム間隔 (秒, 0=自動)"
8
-CPUPreset="CPU 使用のプリセット(エンコーダー速度)"
9
+CPUPreset="CPU使用のプリセット (高い = CPU使用低い)"
10
Profile="プロファイル"
11
Tune="チューン"
12
-EncoderOptions="x264 エンコーダーオプション (スペース区切り)"
13
+None="(なし)"
14
+EncoderOptions="x264 オプション (スペースで区切る)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/ko-KR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/ko-KR.ini
Changed
16
1
2
Bitrate="비트레이트"
3
+CustomBufsize="사용자 임의 버퍼 크기 설정"
4
BufferSize="버퍼 크기"
5
+UseCBR="CBR 사용"
6
+CRF="CRF"
7
KeyframeIntervalSec="키프레임 간격 (초 단위, 0=자동)"
8
-CPUPreset="CPU 사용량 사전 설정 (인코더 속도)"
9
+CPUPreset="CPU 사용량 사전설정 (높음 = 적은 CPU 부담)"
10
Profile="프로필"
11
Tune="조정"
12
-EncoderOptions="x264 인코더 설정 (공백으로 구분)"
13
+None="(없음)"
14
+EncoderOptions="x264 설정 (공백으로 구분)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/nb-NO.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/nb-NO.ini
Changed
16
1
2
Bitrate="Bitrate"
3
+CustomBufsize="Bruk egendefinert bufferstørrelse"
4
BufferSize="Buffer størrelse"
5
+UseCBR="Bruk CBR"
6
+CRF="CRF"
7
KeyframeIntervalSec="Keyframeintervall (sekunder, 0=automatisk)"
8
-CPUPreset="Forhåndsinstillinger for prosessorbruk (kodings hastighet)"
9
+CPUPreset="Forhåndsinstilling for prosessorbruk (raskere betyr mindre belastning)"
10
Profile="Profil"
11
Tune="Tune"
12
-EncoderOptions="x264 kodingsalternativer (adksilt med mellomrom)"
13
+None="(Ingen)"
14
+EncoderOptions="x264 alternativer (separert med mellomrom)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/nl-NL.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/nl-NL.ini
Changed
16
1
2
Bitrate="Bitrate"
3
+CustomBufsize="Aangepaste buffergrootte gebruiken"
4
BufferSize="Buffergrootte"
5
+UseCBR="CBR Gebruiken"
6
+CRF="CRF"
7
KeyframeIntervalSec="Tijd tussen keyframes (seconden, 0=auto)"
8
-CPUPreset="Processorgebruik Preset (encoder snelheid)"
9
+CPUPreset="CPU-gebruik instelling (hoger = minder CPU)"
10
Profile="Profiel"
11
Tune="Afstemmen"
12
-EncoderOptions="x264 Encoderinstellingen (gescheiden door spaties)"
13
+None="(Geen)"
14
+EncoderOptions="x264 Opties (gescheiden door spaties)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/pl-PL.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/pl-PL.ini
Changed
10
1
2
Bitrate="Przepływność bitowa"
3
BufferSize="Rozmiar bufora"
4
KeyframeIntervalSec="Interwał klatek kluczowych (sekundy, 0 - auto)"
5
-CPUPreset="Ustawienie wykorzystania CPU (szybkość enkodera)"
6
Profile="Profil"
7
Tune="Dostrajanie"
8
-EncoderOptions="Ustawienia enkodera x264 (oddzielone spacją)"
9
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/pt-BR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/pt-BR.ini
Changed
10
1
2
Bitrate="Taxa de Bits"
3
BufferSize="Tamanho do Buffer"
4
KeyframeIntervalSec="Intervalo de Keyframe (segundos, 0 = auto)"
5
-CPUPreset="Predefinição de Uso da CPU (Velocidade do Codificador)"
6
Profile="Perfil"
7
Tune="Ajustar"
8
-EncoderOptions="Opções do Codificador x264 (Separados por Espaço)"
9
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/pt-PT.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/pt-PT.ini
Changed
10
1
2
Bitrate="Taxa de Bits (Bitrate)"
3
BufferSize="Tamanho do Buffer"
4
KeyframeIntervalSec="Intervalo de Keyframe (segundos, 0 = auto)"
5
-CPUPreset="Predefinição de uso CPU (velocidade do codificador)"
6
Profile="Perfil"
7
Tune="Sintonizar"
8
-EncoderOptions="Opções do Codificador x264 (separados por espaço)"
9
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/ro-RO.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/ro-RO.ini
Changed
10
1
2
Bitrate="Rata biti"
3
BufferSize="Dimensiune tampon"
4
KeyframeIntervalSec="Intervalul de cadre (secunde, 0 = auto)"
5
-CPUPreset="Utilizare Procesor Prestabilit (viteza de codare)"
6
Profile="Profil"
7
Tune="Reglaj"
8
-EncoderOptions="Opţiuni Codare x264 (separate prin spațiu)"
9
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/ru-RU.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/ru-RU.ini
Changed
16
1
2
Bitrate="Битрейт"
3
+CustomBufsize="Использовать пользовательский размер буфера"
4
BufferSize="Размер буфера"
5
+UseCBR="Использовать CBR"
6
+CRF="CRF"
7
KeyframeIntervalSec="Интервал ключевых кадров (сек, 0=авто)"
8
-CPUPreset="Предустановка использования ЦП (скорость шифратора)"
9
+CPUPreset="Предустановка использования ЦП (выше = меньше)"
10
Profile="Профиль"
11
Tune="Настроить"
12
-EncoderOptions="Настройки кодера x264 (разделённые пробелом)"
13
+None="(Нет)"
14
+EncoderOptions="Настройки x264 (разделённые пробелом)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/sk-SK.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/sk-SK.ini
Changed
10
1
2
Bitrate="Bitrate"
3
BufferSize="Veľkosť medzipamäte"
4
KeyframeIntervalSec="Kľúčová snímka každých (sekúnd, 0 = automaticky)"
5
-CPUPreset="Predvoľba využitia CPU (rýchlosť enkodéra)"
6
Profile="Profil"
7
Tune="Vyladenie"
8
-EncoderOptions="Možnosti x264 enkodéra (oddelené medzerou)"
9
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/sl-SI.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/sl-SI.ini
Changed
10
1
2
Bitrate="Bitrate"
3
BufferSize="Velikost medpolnilnika"
4
KeyframeIntervalSec="Okvirni Interval(sekunde, 0=avtomatsko)"
5
-CPUPreset="Prednastavitev porabe CPU (hitrost kodiranja)"
6
Profile="Profil"
7
Tune="Tune"
8
-EncoderOptions="Opcije x264 kodiranja (ločene z razmikom)"
9
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/sr-CS.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/sr-CS.ini
Changed
16
1
2
Bitrate="Protok"
3
+CustomBufsize="Koristi specifičnu veličinu bafera"
4
BufferSize="Veličina buffer-a"
5
+UseCBR="Koristi CBR"
6
+CRF="CRF"
7
KeyframeIntervalSec="Keyframe interval (sekunde, 0=automatski)"
8
-CPUPreset="Šablon iskorišćenja procesora (brzina enkodera)"
9
+CPUPreset="Koristi CPU šablon (veće = manje CPU-a)"
10
Profile="Profil"
11
Tune="Doterivanje"
12
-EncoderOptions="x264 enkoder opcije (odvojene razmakom)"
13
+None="(Nijedno)"
14
+EncoderOptions="x264 opcije (odvojene razmakom)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/sr-SP.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/sr-SP.ini
Changed
16
1
2
Bitrate="Проток"
3
+CustomBufsize="Користи специфичну величину бафера"
4
BufferSize="Величина buffer-а"
5
+UseCBR="Користи CBR"
6
+CRF="CRF"
7
KeyframeIntervalSec="Keyframe интервал (секунде, 0=аутоматски)"
8
-CPUPreset="Шаблон искоришћења процесора (брзина енкодера)"
9
+CPUPreset="Користи CPU шаблон (веће = мање CPU-а)"
10
Profile="Профил"
11
Tune="Дотеривање"
12
-EncoderOptions="x264 енкодер опције (одвојене размаком)"
13
+None="(Ниједно)"
14
+EncoderOptions="x264 опције (одвојене размаком)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/sv-SE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/sv-SE.ini
Changed
16
1
2
Bitrate="Bithastighet"
3
+CustomBufsize="Använd anpassad buffertstorlek"
4
BufferSize="Buffertstorlek"
5
+UseCBR="Använd CBR"
6
+CRF="CRF"
7
KeyframeIntervalSec="Keyframe-tidsintervall (i sek, 0=auto)"
8
-CPUPreset="CPU-förinställning (påverkar kodarhastighet)"
9
+CPUPreset="CPU-användning förinställning (högre = mindre CPU)"
10
Profile="Profil"
11
Tune="Tune"
12
-EncoderOptions="x264-kodningsinställningar (separera med mellanslag)"
13
+None="(Inga)"
14
+EncoderOptions="x264 inställningar (separerade med blanksteg)"
15
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/tr-TR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/tr-TR.ini
Changed
10
1
2
Bitrate="Bit hızı"
3
BufferSize="Arabellek Boyutu"
4
KeyframeIntervalSec="Anahtarkare Aralığı (saniye, 0=otomatik)"
5
-CPUPreset="CPU Kullanımı Hazır Ayarı (kodlayıcı hızı)"
6
Profile="Profil"
7
Tune="Ayarla"
8
-EncoderOptions="x264 Kodlayıcı Seçenekleri (boşlukla ayrılmış)"
9
10
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/zh-CN.ini
Added
14
1
2
+Bitrate="比特率"
3
+CustomBufsize="使用自定义缓存大小"
4
+BufferSize="缓冲大小"
5
+UseCBR="使用 CBR"
6
+CRF="CRF"
7
+KeyframeIntervalSec="关键帧间隔(秒, 0=自动)"
8
+CPUPreset="CPU 使用预设 (更高 = 较少的 CPU占用)"
9
+Profile="档案"
10
+Tune="曲调"
11
+None="(无)"
12
+EncoderOptions="x264 选项 (用空格分隔)"
13
+
14
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/data/locale/zh-TW.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/data/locale/zh-TW.ini
Changed
10
1
2
Bitrate="位元率"
3
BufferSize="緩衝區大小"
4
KeyframeIntervalSec="關鍵影格間隔 (秒,0 = 自動):"
5
-CPUPreset="CPU 預設(編碼速度)"
6
Profile="演算法"
7
Tune="最佳化"
8
-EncoderOptions="x264 編碼器參數(以空格分隔)"
9
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/obs-x264/obs-x264.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/obs-x264/obs-x264.c
Changed
108
1
2
3
static void obs_x264_defaults(obs_data_t *settings)
4
{
5
- obs_data_set_default_int (settings, "bitrate", 1000);
6
- obs_data_set_default_int (settings, "buffer_size", 1000);
7
+ obs_data_set_default_int (settings, "bitrate", 2500);
8
+ obs_data_set_default_bool (settings, "use_bufsize", false);
9
+ obs_data_set_default_int (settings, "buffer_size", 2500);
10
obs_data_set_default_int (settings, "keyint_sec", 0);
11
obs_data_set_default_int (settings, "crf", 23);
12
- obs_data_set_default_bool (settings, "cbr", false);
13
+ obs_data_set_default_bool (settings, "cbr", true);
14
15
obs_data_set_default_string(settings, "preset", "veryfast");
16
obs_data_set_default_string(settings, "profile", "");
17
18
}
19
20
#define TEXT_BITRATE obs_module_text("Bitrate")
21
+#define TEXT_CUSTOM_BUF obs_module_text("CustomBufsize")
22
#define TEXT_BUF_SIZE obs_module_text("BufferSize")
23
+#define TEXT_USE_CBR obs_module_text("UseCBR")
24
+#define TEXT_CRF obs_module_text("CRF")
25
#define TEXT_KEYINT_SEC obs_module_text("KeyframeIntervalSec")
26
#define TEXT_PRESET obs_module_text("CPUPreset")
27
#define TEXT_PROFILE obs_module_text("Profile")
28
#define TEXT_TUNE obs_module_text("Tune")
29
+#define TEXT_NONE obs_module_text("None")
30
#define TEXT_X264_OPTS obs_module_text("EncoderOptions")
31
32
+static bool use_bufsize_modified(obs_properties_t *ppts, obs_property_t *p,
33
+ obs_data_t *settings)
34
+{
35
+ bool use_bufsize = obs_data_get_bool(settings, "use_bufsize");
36
+ p = obs_properties_get(ppts, "buffer_size");
37
+ obs_property_set_visible(p, use_bufsize);
38
+ return true;
39
+}
40
+
41
+static bool use_cbr_modified(obs_properties_t *ppts, obs_property_t *p,
42
+ obs_data_t *settings)
43
+{
44
+ bool cbr = obs_data_get_bool(settings, "cbr");
45
+ p = obs_properties_get(ppts, "crf");
46
+ obs_property_set_visible(p, !cbr);
47
+ return true;
48
+}
49
+
50
static obs_properties_t *obs_x264_props(void *unused)
51
{
52
UNUSED_PARAMETER(unused);
53
54
obs_properties_t *props = obs_properties_create();
55
obs_property_t *list;
56
+ obs_property_t *p;
57
+
58
+ obs_properties_add_int(props, "bitrate", TEXT_BITRATE, 50, 10000000, 1);
59
+
60
+ p = obs_properties_add_bool(props, "use_bufsize", TEXT_CUSTOM_BUF);
61
+ obs_property_set_modified_callback(p, use_bufsize_modified);
62
+ obs_properties_add_int(props, "buffer_size", TEXT_BUF_SIZE, 0,
63
+ 10000000, 1);
64
65
- obs_properties_add_int(props, "bitrate", TEXT_BITRATE, 50, 100000, 1);
66
- obs_properties_add_int(props, "buffer_size", TEXT_BUF_SIZE, 50, 100000,
67
- 1);
68
obs_properties_add_int(props, "keyint_sec", TEXT_KEYINT_SEC, 0, 20, 1);
69
+ p = obs_properties_add_bool(props, "cbr", TEXT_USE_CBR);
70
+ obs_properties_add_int(props, "crf", TEXT_CRF, 0, 51, 1);
71
+
72
+ obs_property_set_modified_callback(p, use_cbr_modified);
73
74
list = obs_properties_add_list(props, "preset", TEXT_PRESET,
75
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
76
77
78
list = obs_properties_add_list(props, "profile", TEXT_PROFILE,
79
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
80
+ obs_property_list_add_string(list, TEXT_NONE, "");
81
obs_property_list_add_string(list, "baseline", "baseline");
82
obs_property_list_add_string(list, "main", "main");
83
obs_property_list_add_string(list, "high", "high");
84
85
list = obs_properties_add_list(props, "tune", TEXT_TUNE,
86
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
87
+ obs_property_list_add_string(list, TEXT_NONE, "");
88
add_strings(list, x264_tune_names);
89
90
obs_properties_add_text(props, "x264opts", TEXT_X264_OPTS,
91
92
int crf = (int)obs_data_get_int(settings, "crf");
93
int width = (int)obs_encoder_get_width(obsx264->encoder);
94
int height = (int)obs_encoder_get_height(obsx264->encoder);
95
+ bool use_bufsize = obs_data_get_bool(settings, "use_bufsize");
96
bool cbr = obs_data_get_bool(settings, "cbr");
97
98
if (keyint_sec)
99
obsx264->params.i_keyint_max =
100
keyint_sec * voi->fps_num / voi->fps_den;
101
102
+ if (!use_bufsize)
103
+ buffer_size = bitrate;
104
+
105
obsx264->params.b_vfr_input = false;
106
obsx264->params.rc.i_vbv_max_bitrate = bitrate;
107
obsx264->params.rc.i_vbv_buffer_size = buffer_size;
108
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/rtmp-services/data/locale/zh-CN.ini
Added
8
1
2
+StreamingServices="流媒体服务"
3
+CustomStreamingServer="自定义流媒体服务器"
4
+Service="服务"
5
+Server="服务器"
6
+StreamKey="流密钥"
7
+
8
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/rtmp-services/data/services.json -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/rtmp-services/data/services.json
Changed
100
1
2
"url": "rtmp://live.twitch.tv/app"
3
},
4
{
5
+ "name": "Asia: Hong Kong",
6
+ "url": "rtmp://live-hkg.twitch.tv/app"
7
+ },
8
+ {
9
+ "name": "Asia: Seoul, South Korea",
10
+ "url": "rtmp://live-sel.twitch.tv/app"
11
+ },
12
+ {
13
"name": "Asia: Singapore",
14
"url": "rtmp://live-sin-backup.twitch.tv/app"
15
},
16
{
17
+ "name": "Asia: Taipei, Taiwan",
18
+ "url": "rtmp://live-tpe.twitch.tv/app"
19
+ },
20
+ {
21
+ "name": "Asia: Tokyo, Japan",
22
+ "url": "rtmp://live-tyo.twitch.tv/app"
23
+ },
24
+ {
25
+ "name": "Australia: Sydney",
26
+ "url": "rtmp://live-syd.twitch.tv/app"
27
+ },
28
+ {
29
"name": "EU: Amsterdam, NL",
30
"url": "rtmp://live-ams.twitch.tv/app"
31
},
32
33
"url": "rtmp://live.hitbox.tv/push"
34
},
35
{
36
- "name": "EU-East",
37
+ "name": "EU-West: Frankfurt, Germany",
38
+ "url": "rtmp://live.fra.hitbox.tv/push"
39
+ },
40
+ {
41
+ "name": "EU-East: Vienna, Austria",
42
"url": "rtmp://live.vie.hitbox.tv/push"
43
},
44
{
45
- "name": "EU-Central",
46
- "url": "rtmp://live.nbg.hitbox.tv/push"
47
+ "name": "EU-North: London, United Kingdom",
48
+ "url": "rtmp://live.lhr.hitbox.tv/push"
49
},
50
{
51
- "name": "EU-West",
52
- "url": "rtmp://live.fra.hitbox.tv/push"
53
+ "name": "EU-Central: Nurnberg, Germany",
54
+ "url": "rtmp://live.nbg.hitbox.tv/push"
55
},
56
{
57
- "name": "EU-North",
58
- "url": "rtmp://live.ams.hitbox.tv/push"
59
+ "name": "Russia: Moscow",
60
+ "url": "rtmp://live.dme.hitbox.tv/push"
61
},
62
{
63
- "name": "US-East",
64
+ "name": "US-East: Washington",
65
"url": "rtmp://live.vgn.hitbox.tv/push"
66
},
67
{
68
- "name": "US-West",
69
+ "name": "US-Central: Denver",
70
+ "url": "rtmp://live.den.hitbox.tv/push"
71
+ },
72
+ {
73
+ "name": "US-West: Los Angeles",
74
"url": "rtmp://live.lax.hitbox.tv/push"
75
},
76
{
77
- "name": "South America",
78
+ "name": "South America: Sao Paulo, Brazil",
79
"url": "rtmp://live.gru.hitbox.tv/push"
80
},
81
{
82
- "name": "Asia",
83
+ "name": "South Korea: Seoul",
84
+ "url": "rtmp://live.icn.hitbox.tv/push"
85
+ },
86
+ {
87
+ "name": "Asia: Singapore",
88
"url": "rtmp://live.lax.hitbox.tv/push"
89
+ },
90
+ {
91
+ "name": "China: Hong Kong",
92
+ "url": "rtmp://live.hkg.hitbox.tv/push"
93
+ },
94
+ {
95
+ "name": "Oceania: Sydney, Australia",
96
+ "url": "rtmp://live.syd.hitbox.tv/push"
97
}
98
],
99
"recommended": {
100
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/rtmp-services/rtmp-common.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/rtmp-services/rtmp-common.c
Changed
52
1
2
obs_data_release(settings);
3
}
4
5
-static void initialize_output(struct rtmp_common *service, obs_output_t *output,
6
- json_t *root)
7
+static void initialize_output(struct rtmp_common *service, json_t *root,
8
+ obs_encoder_t *video_encoder, obs_encoder_t *audio_encoder)
9
{
10
- obs_encoder_t *video_encoder = obs_output_get_video_encoder(output);
11
- obs_encoder_t *audio_encoder = obs_output_get_audio_encoder(output);
12
json_t *json_service = find_service(root, service->service);
13
json_t *recommended;
14
15
16
apply_audio_encoder_settings(audio_encoder, recommended);
17
}
18
19
-static bool rtmp_common_initialize(void *data, obs_output_t *output)
20
+static void rtmp_common_apply_settings(void *data,
21
+ obs_encoder_t *video_encoder, obs_encoder_t *audio_encoder)
22
{
23
struct rtmp_common *service = data;
24
char *file;
25
26
if (file) {
27
json_t *root = open_json_file(file);
28
if (root) {
29
- initialize_output(service, output, root);
30
+ initialize_output(service, root, video_encoder,
31
+ audio_encoder);
32
json_decref(root);
33
}
34
bfree(file);
35
}
36
-
37
- return true;
38
}
39
40
static const char *rtmp_common_url(void *data)
41
42
.create = rtmp_common_create,
43
.destroy = rtmp_common_destroy,
44
.update = rtmp_common_update,
45
- .initialize = rtmp_common_initialize,
46
.get_properties = rtmp_common_properties,
47
.get_url = rtmp_common_url,
48
- .get_key = rtmp_common_key
49
+ .get_key = rtmp_common_key,
50
+ .apply_encoder_settings = rtmp_common_apply_settings,
51
};
52
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/text-freetype2/data/locale/de-DE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/text-freetype2/data/locale/de-DE.ini
Changed
10
1
2
Color2="Farbe 2"
3
Outline="Umrandung"
4
DropShadow="Schlagschatten"
5
-ReadFromFile="Lesen aus Datei"
6
+ReadFromFile="Aus Datei lesen"
7
CustomWidth="Benutzerdefinierte Textbreite"
8
WordWrap="Zeilenumbruch"
9
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/text-freetype2/data/locale/fi-FI.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/text-freetype2/data/locale/fi-FI.ini
Changed
10
1
2
ChatLogMode="Keskustelun lokitila (6 viimeistä riviä)"
3
Color1="Väri 1"
4
Color2="Väri 2"
5
-Outline="Ulkoreuna"
6
+Outline="Reunaviiva"
7
DropShadow="Varjo"
8
ReadFromFile="Lue tiedostosta"
9
CustomWidth="Mukautettu tekstin pituus"
10
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/text-freetype2/data/locale/zh-CN.ini
Added
15
1
2
+Font="字体"
3
+Text="文本"
4
+TextFile="文本文件(UTF-8 或 UTF-16)"
5
+TextFileFilter="文本文件(*.txt);;"
6
+ChatLogMode="聊天日志模式 (最后 6 行)"
7
+Color1="颜色 1"
8
+Color2="颜色 2"
9
+Outline="大纲"
10
+DropShadow="下拉阴影"
11
+ReadFromFile="从文件读取"
12
+CustomWidth="自定义文本宽度"
13
+WordWrap="自动换行"
14
+
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/text-freetype2/find-font-windows.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/text-freetype2/find-font-windows.c
Changed
16
1
2
return NULL;
3
4
utf16_len = MultiByteToWideChar(code_page, 0,
5
- sfnt_name->string, sfnt_name->string_len, NULL, 0);
6
+ (char*)sfnt_name->string, sfnt_name->string_len,
7
+ NULL, 0);
8
if (utf16_len) {
9
utf16_str = malloc((utf16_len + 1) * sizeof(wchar_t));
10
utf16_len = MultiByteToWideChar(code_page, 0,
11
- sfnt_name->string, sfnt_name->string_len,
12
+ (char*)sfnt_name->string, sfnt_name->string_len,
13
utf16_str, (int)utf16_len);
14
15
if (utf16_len) {
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/CMakeLists.txt -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/CMakeLists.txt
Changed
10
1
2
target_link_libraries(win-capture
3
libobs
4
ipc-util
5
- psapi.lib)
6
+ psapi)
7
8
install_obs_plugin_with_data(win-capture data)
9
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/cursor-capture.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/cursor-capture.c
Changed
18
1
2
3
static inline bool cursor_capture_icon(struct cursor_data *data, HICON icon)
4
{
5
- bool success = false;
6
uint8_t *bitmap;
7
uint32_t height;
8
uint32_t width;
9
10
bitmap = cursor_capture_icon_bitmap(&ii, &width, &height);
11
if (bitmap) {
12
data->texture = gs_texture_create(width, height, GS_BGRA,
13
- 1, &bitmap, 0);
14
+ 1, (const uint8_t**)&bitmap, 0);
15
bfree(bitmap);
16
17
data->x_hotspot = ii.xHotspot;
18
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/d3d8-api/d3d8types.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/d3d8-api/d3d8types.h
Changed
24
1
2
#if _MSC_VER >= 1200
3
#pragma warning(push)
4
#endif
5
+
6
+#ifdef _MSC_VER
7
#pragma warning(disable:4201) // anonymous unions warning
8
+#endif
9
+
10
#if defined(_X86_) || defined(_IA64_)
11
#pragma pack(4)
12
#endif
13
14
#if _MSC_VER >= 1200
15
#pragma warning(pop)
16
#else
17
+#ifdef _MSC_VER
18
#pragma warning(default:4201)
19
#endif
20
+#endif
21
22
#endif /* (DIRECT3D_VERSION >= 0x0800) */
23
#endif /* _D3D8TYPES(P)_H_ */
24
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/da-DK.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/da-DK.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Eksekverbare Navn"
3
CaptureCursor="Indfang markøren"
4
Compatibility="Multi-adapter kompatibilitet"
5
+AllowTransparency="Tillad gennemsigtighed"
6
Monitor="Skærm"
7
PrimaryMonitor="Primære skærm"
8
+GameCapture="Spil optager"
9
+GameCapture.AnyFullscreen="Optag ethvert fuldskærms program"
10
+GameCapture.ForceScaling="Tving skalering"
11
+GameCapture.ScaleRes="Skalere opløsning"
12
+GameCapture.LimitFramerate="Begræns optagelses framerate"
13
+GameCapture.CaptureOverlays="Optag fra tredjepart overlays (såsom Steam)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/de-DE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/de-DE.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Name der ausführbaren Datei"
3
CaptureCursor="Mauszeiger aufnehmen"
4
Compatibility="Multi-Adapter-Kompatibilität"
5
+AllowTransparency="Erlaube Transparenz"
6
Monitor="Monitor"
7
PrimaryMonitor="Hauptmonitor"
8
+GameCapture="Spielaufnahme"
9
+GameCapture.AnyFullscreen="Nehme beliebige Vollbild-Anwendung auf"
10
+GameCapture.ForceScaling="Erzwinge Skalierung"
11
+GameCapture.ScaleRes="Skaliere Auflösung"
12
+GameCapture.LimitFramerate="Limitiere FPS der Aufnahme"
13
+GameCapture.CaptureOverlays="Aufnahme von Drittanbieter Overlays (z.B. Steam)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/el-GR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/el-GR.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Όνομα Εκτελέσιμου Αρχείου"
3
CaptureCursor="Σύλληψη Δρομέα"
4
Compatibility="Συμβατότητα με Πολυ-Προσαρμογείς"
5
+AllowTransparency="Επιτροπή Διαφάνειας"
6
Monitor="Οθόνη"
7
PrimaryMonitor="Κύρια Oθόνη"
8
+GameCapture="Καταγραφή Παιχνιδιού"
9
+GameCapture.AnyFullscreen="Καταγραφή οποιασδήποτε εφαρμογής πλήρους οθόνης"
10
+GameCapture.ForceScaling="Εξανάγκαση Κλιμάκωσης"
11
+GameCapture.ScaleRes="Κλιμάκωση Ανάλυσης"
12
+GameCapture.LimitFramerate="Περιορισμός των frame καταγραφής"
13
+GameCapture.CaptureOverlays="Καταγραφή επικαλύψεων τρίτου προσώπου (όπως π.χ. steam)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/es-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/es-ES.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Nombre del archivo ejecutable"
3
CaptureCursor="Captura de Cursor"
4
Compatibility="Compatibilidad multi adaptador"
5
+AllowTransparency="Permitir transparencia"
6
Monitor="Monitor"
7
PrimaryMonitor="Monitor principal"
8
+GameCapture="Capturar Juego"
9
+GameCapture.AnyFullscreen="Capturar cualquier aplicación a pantalla completa"
10
+GameCapture.ForceScaling="Forzar escalado"
11
+GameCapture.ScaleRes="Resolución de la escala"
12
+GameCapture.LimitFramerate="Limitar ratio de captura"
13
+GameCapture.CaptureOverlays="Capturar capas de aplicaciones externas (tales como Steam)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/eu-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/eu-ES.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Exekutagarri Izena"
3
CaptureCursor="Hartu Kurtsorea"
4
Compatibility="Egokitzaile-anitz Bateragarritasuna"
5
+AllowTransparency="Ahalbidetu Gardentasuna"
6
Monitor="Monitorea"
7
PrimaryMonitor="Lehen Monitorea"
8
+GameCapture="Bideojoko Harpena"
9
+GameCapture.AnyFullscreen="Hartu edozein ikusleiho-osoko aplikazio"
10
+GameCapture.ForceScaling="Behartu Eskalatzea"
11
+GameCapture.ScaleRes="Bereizmen Eskalatua"
12
+GameCapture.LimitFramerate="Mugatu harpen frameneurria"
13
+GameCapture.CaptureOverlays="Hartu hirugarrenen gainjarpenak (steam bezalakoak)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/fi-FI.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/fi-FI.ini
Changed
23
1
2
-MonitorCapture="Ruudunkaappaus"
3
-WindowCapture="Ikkunakaappaus"
4
+MonitorCapture="Kaappaa monitori"
5
+WindowCapture="Kaappaa ikkuna"
6
WindowCapture.Window="Ikkuna"
7
WindowCapture.Priority="Ikkunan valintaperuste"
8
WindowCapture.Priority.Title="Ikkunan otsikko"
9
10
WindowCapture.Priority.Exe="Suoritetun tiedoston nimi"
11
CaptureCursor="Kaappaa kursori"
12
Compatibility="Usean sovittimen tuki"
13
+AllowTransparency="Salli läpinäkyvyys"
14
Monitor="Näyttö"
15
PrimaryMonitor="Ensisijainen näyttö"
16
+GameCapture="Kaappaa peli"
17
+GameCapture.AnyFullscreen="Kaappaa mitä tahansa kokoruudun sovellusta"
18
+GameCapture.ForceScaling="Pakota skaalaus"
19
+GameCapture.ScaleRes="Skaalaa resoluutio"
20
+GameCapture.LimitFramerate="Rajoita kaappauksen ruudunpäivitysnopeutta"
21
+GameCapture.CaptureOverlays="Kaappaa kolmannen osapuolen \"overlay\" (kuten Steam)"
22
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/fr-FR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/fr-FR.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Nom de l'exécutable"
3
CaptureCursor="Enregistrer le Curseur"
4
Compatibility="Compatibilité Multi-adaptateur"
5
+AllowTransparency="Permettre la transparence"
6
Monitor="Moniteur"
7
PrimaryMonitor="Moniteur Principal"
8
+GameCapture="Capture de jeu"
9
+GameCapture.AnyFullscreen="Capturer toute application en plein écran"
10
+GameCapture.ForceScaling="Forcer la mise à l'échelle"
11
+GameCapture.ScaleRes="Résolution mise à l'échelle"
12
+GameCapture.LimitFramerate="Limiter la fréquence d'images de la capture"
13
+GameCapture.CaptureOverlays="Capturer les surcouches tierces (comme Steam)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/gl-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/gl-ES.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Nome do ficheiro executable"
3
CaptureCursor="Captura de cursor"
4
Compatibility="Compatibilidade do multiadaptador"
5
+AllowTransparency="Permitir transparencia"
6
Monitor="Monitor"
7
PrimaryMonitor="Monitor principal"
8
+GameCapture="Capturar xogo"
9
+GameCapture.AnyFullscreen="Capturar calquera aplicativo a pantalla completa"
10
+GameCapture.ForceScaling="Forzar dimensionamento"
11
+GameCapture.ScaleRes="Resolución da escala"
12
+GameCapture.LimitFramerate="Limitar a ratio da captura"
13
+GameCapture.CaptureOverlays="Capturar capas de aplicativos externos (tales como Steam)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/hr-HR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/hr-HR.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Ime izvršne datoteke"
3
CaptureCursor="Snimaj kursor"
4
Compatibility="Višeadapterska kompatibilnost"
5
+AllowTransparency="Omogući providnost"
6
Monitor="Monitor"
7
PrimaryMonitor="Primarni monitor"
8
+GameCapture="Ulaz sa igre"
9
+GameCapture.AnyFullscreen="Ulaz sa bilo koje aplikacije koja je preko celog ekrana"
10
+GameCapture.ForceScaling="Prisilno skaliranje"
11
+GameCapture.ScaleRes="Skalirana rezolucija"
12
+GameCapture.LimitFramerate="Ograniči framerate snimanja"
13
+GameCapture.CaptureOverlays="Snimaj overlay treće strane (kao što je steam)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/hu-HU.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/hu-HU.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Végrehajtható Fájl Neve"
3
CaptureCursor="Kurzor Rögztítése"
4
Compatibility="Több Adapteres Kompatibilitás"
5
+AllowTransparency="Áttetszőség Engedélyezése"
6
Monitor="Képernyő"
7
PrimaryMonitor="Elsődleges Képernyő"
8
+GameCapture="Játék Felvétel"
9
+GameCapture.AnyFullscreen="Teljes képernyős alkalmazás felvétele"
10
+GameCapture.ForceScaling="Skálázás Kényszerítése"
11
+GameCapture.ScaleRes="Skálázott Felbontás"
12
+GameCapture.LimitFramerate="Felvételi képkockasebesség korlátozása"
13
+GameCapture.CaptureOverlays="Külső overlay felvétele (mint például steam)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/ja-JP.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/ja-JP.ini
Changed
15
1
2
WindowCapture.Priority.Exe="実行ファイル名"
3
CaptureCursor="カーソルをキャプチャ"
4
Compatibility="マルチアダプターの互換性"
5
+AllowTransparency="透過を許可"
6
Monitor="モニター"
7
PrimaryMonitor="プライマリ モニター"
8
+GameCapture="ゲームキャプチャ"
9
+GameCapture.AnyFullscreen="フルスクリーンアプリケーションをキャプチャ"
10
+GameCapture.ForceScaling="強制的にスケーリングする"
11
+GameCapture.ScaleRes="出力解像度"
12
+GameCapture.LimitFramerate="キャプチャのフレーム レートを制限する"
13
+GameCapture.CaptureOverlays="(steamなどの)サードパーティ製のオーバーレイをキャプチャする"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/ko-KR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/ko-KR.ini
Changed
15
1
2
WindowCapture.Priority.Exe="실행 파일 이름"
3
CaptureCursor="커서 캡쳐"
4
Compatibility="다중 어댑터 호환성"
5
+AllowTransparency="투명도 허용"
6
Monitor="모니터"
7
PrimaryMonitor="기본 모니터"
8
+GameCapture="게임 캡쳐"
9
+GameCapture.AnyFullscreen="어떤 전체화면 응용 프로그램이건 캡쳐"
10
+GameCapture.ForceScaling="강제 크기 조정"
11
+GameCapture.ScaleRes="조정된 해상도:"
12
+GameCapture.LimitFramerate="캡처 프레임 속도 제한"
13
+GameCapture.CaptureOverlays="서드-파티 오버레이 (스팀과 같은) 캡쳐"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/nb-NO.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/nb-NO.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Navn på kjørbar fil"
3
CaptureCursor="Ta opp musepeker"
4
Compatibility="Multiadapter kompatibilitet"
5
+AllowTransparency="Tillat gjennomsiktighet"
6
Monitor="Skjerm"
7
PrimaryMonitor="Hovedskjerm"
8
+GameCapture="Spillopptak"
9
+GameCapture.AnyFullscreen="Opptak av fullskjermapplikasjon"
10
+GameCapture.ForceScaling="Tving skalering"
11
+GameCapture.ScaleRes="Skaler oppløsning"
12
+GameCapture.LimitFramerate="Begrens opptakets bildefrekvens"
13
+GameCapture.CaptureOverlays="Ta opp tredjeparts overlag (som Steam)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/nl-NL.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/nl-NL.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Executable-naam"
3
CaptureCursor="Cursor Opnemen"
4
Compatibility="Multi-adapter Compatibiliteit"
5
+AllowTransparency="Transparantie Toestaan"
6
Monitor="Monitor"
7
PrimaryMonitor="Primaire Monitor"
8
+GameCapture="Gamecapture"
9
+GameCapture.AnyFullscreen="Capture elke full-screen applicatie"
10
+GameCapture.ForceScaling="Forceer Schalen"
11
+GameCapture.ScaleRes="Geschaalde resolutie"
12
+GameCapture.LimitFramerate="Begrens frame rate van de opname"
13
+GameCapture.CaptureOverlays="Capture overlays van derde partijen (zoals Steam)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/ro-RO.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/ro-RO.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Numele executabilului"
3
CaptureCursor="Capturează cursorul"
4
Compatibility="Compatibilitate pentru Multi-adaptoare"
5
+AllowTransparency="Permite transparenţa"
6
Monitor="Monitor"
7
PrimaryMonitor="Monitorul principal"
8
+GameCapture="Captura Jocului"
9
+GameCapture.AnyFullscreen="Captureaza orice aplicaţie pe tot ecranul"
10
+GameCapture.ForceScaling="Scalare Forţata"
11
+GameCapture.ScaleRes="Scalează Rezoluţia"
12
+GameCapture.LimitFramerate="Limitează framerate-ul capturii"
13
+GameCapture.CaptureOverlays="Captureaza overlay-uri terţiare(cum ar fi cel al Steam-ului)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/ru-RU.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/ru-RU.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Имя исполняемого файла"
3
CaptureCursor="Захват курсора"
4
Compatibility="Совместимость с мульти-адаптером"
5
+AllowTransparency="Разрешить прозрачность"
6
Monitor="Монитор"
7
PrimaryMonitor="Основной монитор"
8
+GameCapture="Захват игры"
9
+GameCapture.AnyFullscreen="Захват любого полноэкранного приложения"
10
+GameCapture.ForceScaling="Принудительное масштабирование"
11
+GameCapture.ScaleRes="Разрешение масштабирования"
12
+GameCapture.LimitFramerate="Ограничивать частоту кадров"
13
+GameCapture.CaptureOverlays="Захват сторонних оверлеев (например, Steam)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/sr-CS.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/sr-CS.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Ime izvršne datoteke"
3
CaptureCursor="Snimaj kursor"
4
Compatibility="Višeadapterska kompatibilnost"
5
+AllowTransparency="Omogući providnost"
6
Monitor="Monitor"
7
PrimaryMonitor="Primarni monitor"
8
+GameCapture="Ulaz sa igre"
9
+GameCapture.AnyFullscreen="Ulaz sa bilo koje aplikacije koja je preko celog ekrana"
10
+GameCapture.ForceScaling="Prisilno skaliranje"
11
+GameCapture.ScaleRes="Skalirana rezolucija"
12
+GameCapture.LimitFramerate="Ograniči framerate snimanja"
13
+GameCapture.CaptureOverlays="Snimaj overlay treće strane (kao što je steam)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/sr-SP.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/sr-SP.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Име извршнe datoteke"
3
CaptureCursor="Снимај курсор"
4
Compatibility="Вишеадаптерска компатибилност"
5
+AllowTransparency="Омогући провидност"
6
Monitor="Монитор"
7
PrimaryMonitor="Примарни монитор"
8
+GameCapture="Улаз са игре"
9
+GameCapture.AnyFullscreen="Улаз са било које апликације која је преко целог екрана"
10
+GameCapture.ForceScaling="Присилно скалирање"
11
+GameCapture.ScaleRes="Скалирана резолуција"
12
+GameCapture.LimitFramerate="Ограничи framerate снимања"
13
+GameCapture.CaptureOverlays="Снимај overlay треће стране (као што је steam)"
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/data/locale/sv-SE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/sv-SE.ini
Changed
15
1
2
WindowCapture.Priority.Exe="Filnamn"
3
CaptureCursor="Visa muspekare"
4
Compatibility="Kompatibilitetsläge för flera grafikkort"
5
+AllowTransparency="Tillåt opacitet"
6
+Monitor="Bildskärm"
7
+PrimaryMonitor="Primära bildskärmen"
8
+GameCapture="Spelintagning"
9
+GameCapture.AnyFullscreen="Spela in alla program i fullskärm"
10
+GameCapture.ForceScaling="Tvinga skalning"
11
+GameCapture.ScaleRes="Skala upplösning"
12
+GameCapture.LimitFramerate="Begränsa inspelad bildhastighet"
13
+GameCapture.CaptureOverlays="Spela in tredje part överlägg (som Steam)"
14
15
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/data/locale/zh-CN.ini
Added
21
1
2
+MonitorCapture="显示器捕获"
3
+WindowCapture="窗口捕获"
4
+WindowCapture.Window="窗口"
5
+WindowCapture.Priority="窗口匹配优先级"
6
+WindowCapture.Priority.Title="窗口标题"
7
+WindowCapture.Priority.Class="窗口种类"
8
+WindowCapture.Priority.Exe="可执行文件名称"
9
+CaptureCursor="捕捉光标"
10
+Compatibility="多适配器的兼容性"
11
+AllowTransparency="允许透明度"
12
+Monitor="显示器"
13
+PrimaryMonitor="主监视器"
14
+GameCapture="游戏捕获"
15
+GameCapture.AnyFullscreen="捕获任何全屏应用程序"
16
+GameCapture.ForceScaling="强制缩放"
17
+GameCapture.ScaleRes="缩放分辨率"
18
+GameCapture.LimitFramerate="限制捕获帧速率"
19
+GameCapture.CaptureOverlays="捕获第三方 (如: steam) 覆盖"
20
+
21
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/duplicator-monitor-capture.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/duplicator-monitor-capture.c
Changed
34
1
2
gs_enable_color(true, true, true, false);
3
4
if (rot != 0) {
5
- float x;
6
- float y;
7
+ float x = 0.0f;
8
+ float y = 0.0f;
9
10
switch (rot) {
11
case 90:
12
x = (float)capture->height;
13
- y = 0.0f;
14
break;
15
case 180:
16
x = (float)capture->width;
17
y = (float)capture->height;
18
break;
19
case 270:
20
- x = 0.0f;
21
y = (float)capture->width;
22
break;
23
}
24
25
"monitor", TEXT_MONITOR,
26
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
27
28
- obs_property_t *capture_cursor = obs_properties_add_bool(props,
29
- "capture_cursor", TEXT_CAPTURE_CURSOR);
30
+ obs_properties_add_bool(props, "capture_cursor", TEXT_CAPTURE_CURSOR);
31
32
obs_enter_graphics();
33
34
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/funchook.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/funchook.h
Changed
10
1
2
#ifdef __cplusplus
3
extern "C" {
4
#else
5
-#ifndef inline
6
+#if defined(_MSC_VER) && !defined(inline)
7
#define inline __inline
8
#endif
9
#endif
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/game-capture.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/game-capture.c
Changed
269
1
2
bool error_acquiring : 1;
3
bool dwm_capture : 1;
4
bool initial_config : 1;
5
+ bool convert_16bit : 1;
6
7
struct game_capture_config config;
8
9
10
const char *name, DWORD process_id)
11
{
12
char new_name[128];
13
- sprintf(new_name, "%s%d", name, process_id);
14
+ sprintf(new_name, "%s%lu", name, process_id);
15
return CreateEventA(NULL, manual_reset, initial_state, new_name);
16
}
17
18
static inline HANDLE open_event_id(const char *name, DWORD process_id)
19
{
20
char new_name[128];
21
- sprintf(new_name, "%s%d", name, process_id);
22
+ sprintf(new_name, "%s%lu", name, process_id);
23
return OpenEventA(EVENT_ALL_ACCESS, false, new_name);
24
}
25
26
27
static inline bool init_pipe(struct game_capture *gc)
28
{
29
char name[64];
30
- sprintf(name, "%s%d", PIPE_NAME, gc->process_id);
31
+ sprintf(name, "%s%lu", PIPE_NAME, gc->process_id);
32
33
if (!ipc_pipe_server_start(&gc->pipe, name, pipe_log, gc)) {
34
warn("init_pipe: failed to start pipe");
35
36
37
if (!gc->thread_id || !gc->process_id) {
38
warn("error acquiring, failed to get window "
39
- "thread/process ids: %d",
40
+ "thread/process ids: %lu",
41
GetLastError());
42
gc->error_acquiring = true;
43
return;
44
45
return true;
46
}
47
48
+#define PIXEL_16BIT_SIZE 2
49
+#define PIXEL_32BIT_SIZE 4
50
+
51
+static inline uint32_t convert_5_to_8bit(uint16_t val)
52
+{
53
+ return (uint32_t)((double)(val & 0x1F) * (255.0/31.0));
54
+}
55
+
56
+static inline uint32_t convert_6_to_8bit(uint16_t val)
57
+{
58
+ return (uint32_t)((double)(val & 0x3F) * (255.0/63.0));
59
+}
60
+
61
+static void copy_b5g6r5_tex(struct game_capture *gc, int cur_texture,
62
+ uint8_t *data, uint32_t pitch)
63
+{
64
+ uint8_t *input = gc->texture_buffers[cur_texture];
65
+ uint32_t gc_cx = gc->cx;
66
+ uint32_t gc_cy = gc->cy;
67
+ uint32_t gc_pitch = gc->pitch;
68
+
69
+ for (uint32_t y = 0; y < gc_cy; y++) {
70
+ register uint8_t *in = input + (gc_pitch * y);
71
+ register uint8_t *end = input + (gc_cx * PIXEL_16BIT_SIZE);
72
+ register uint8_t *out = data + pitch;
73
+
74
+ while (in < end) {
75
+ register uint16_t in_pix = *(uint16_t*)in;
76
+ register uint32_t out_pix = 0xFF000000;
77
+
78
+ out_pix |= convert_5_to_8bit(in_pix);
79
+ in_pix >>= 5;
80
+ out_pix |= convert_6_to_8bit(in_pix) << 8;
81
+ in_pix >>= 6;
82
+ out_pix |= convert_5_to_8bit(in_pix) << 16;
83
+
84
+ *(uint32_t*)out = out_pix;
85
+
86
+ in += PIXEL_16BIT_SIZE;
87
+ out += PIXEL_32BIT_SIZE;
88
+ }
89
+ }
90
+}
91
+
92
+static void copy_b5g5r5a1_tex(struct game_capture *gc, int cur_texture,
93
+ uint8_t *data, uint32_t pitch)
94
+{
95
+ uint8_t *input = gc->texture_buffers[cur_texture];
96
+ uint32_t gc_cx = gc->cx;
97
+ uint32_t gc_cy = gc->cy;
98
+ uint32_t gc_pitch = gc->pitch;
99
+
100
+ for (uint32_t y = 0; y < gc_cy; y++) {
101
+ register uint8_t *in = input + (gc_pitch * y);
102
+ register uint8_t *end = input + (gc_cx * PIXEL_16BIT_SIZE);
103
+ register uint8_t *out = data + pitch;
104
+
105
+ while (in < end) {
106
+ register uint16_t in_pix = *(uint16_t*)in;
107
+ register uint32_t out_pix = 0;
108
+
109
+ out_pix |= convert_5_to_8bit(in_pix);
110
+ in_pix >>= 5;
111
+ out_pix |= convert_5_to_8bit(in_pix) << 8;
112
+ in_pix >>= 5;
113
+ out_pix |= convert_5_to_8bit(in_pix) << 16;
114
+ in_pix >>= 5;
115
+ out_pix |= (in_pix * 255) << 24;
116
+
117
+ *(uint32_t*)out = out_pix;
118
+
119
+ in += PIXEL_16BIT_SIZE;
120
+ out += PIXEL_32BIT_SIZE;
121
+ }
122
+ }
123
+}
124
+
125
+static inline void copy_16bit_tex(struct game_capture *gc, int cur_texture,
126
+ uint8_t *data, uint32_t pitch)
127
+{
128
+ if (gc->global_hook_info->format == DXGI_FORMAT_B5G5R5A1_UNORM) {
129
+ copy_b5g5r5a1_tex(gc, cur_texture, data, pitch);
130
+
131
+ } else if (gc->global_hook_info->format == DXGI_FORMAT_B5G6R5_UNORM) {
132
+ copy_b5g6r5_tex(gc, cur_texture, data, pitch);
133
+ }
134
+}
135
+
136
static void copy_shmem_tex(struct game_capture *gc)
137
{
138
int cur_texture = gc->shmem_data->last_tex;
139
140
}
141
142
if (gs_texture_map(gc->texture, &data, &pitch)) {
143
- if (pitch == gc->pitch) {
144
+ if (gc->convert_16bit) {
145
+ copy_16bit_tex(gc, cur_texture, data, pitch);
146
+
147
+ } else if (pitch == gc->pitch) {
148
memcpy(data, gc->texture_buffers[cur_texture],
149
pitch * gc->cy);
150
} else {
151
152
ReleaseMutex(mutex);
153
}
154
155
+static inline bool is_16bit_format(uint32_t format)
156
+{
157
+ return format == DXGI_FORMAT_B5G5R5A1_UNORM ||
158
+ format == DXGI_FORMAT_B5G6R5_UNORM;
159
+}
160
+
161
static inline bool init_shmem_capture(struct game_capture *gc)
162
{
163
+ enum gs_color_format format;
164
+
165
gc->texture_buffers[0] =
166
(uint8_t*)gc->data + gc->shmem_data->tex1_offset;
167
gc->texture_buffers[1] =
168
(uint8_t*)gc->data + gc->shmem_data->tex2_offset;
169
170
+ gc->convert_16bit = is_16bit_format(gc->global_hook_info->format);
171
+ format = gc->convert_16bit ?
172
+ GS_BGRA : convert_format(gc->global_hook_info->format);
173
+
174
obs_enter_graphics();
175
gs_texture_destroy(gc->texture);
176
- gc->texture = gs_texture_create(gc->cx, gc->cy,
177
- convert_format(gc->global_hook_info->format),
178
- 1, NULL, GS_DYNAMIC);
179
+ gc->texture = gs_texture_create(gc->cx, gc->cy, format, 1, NULL,
180
+ GS_DYNAMIC);
181
obs_leave_graphics();
182
183
if (!gc->texture) {
184
185
return true;
186
}
187
188
+static inline bool capture_valid(struct game_capture *gc)
189
+{
190
+ if (!gc->dwm_capture && !IsWindow(gc->window))
191
+ return false;
192
+
193
+ return !object_signalled(gc->target_process);
194
+}
195
+
196
static void game_capture_tick(void *data, float seconds)
197
{
198
struct game_capture *gc = data;
199
200
close_handle(&gc->injector_process);
201
202
if (exit_code != 0) {
203
- warn("inject process failed: %d", exit_code);
204
+ warn("inject process failed: %lu", exit_code);
205
gc->error_acquiring = true;
206
207
} else if (!gc->capturing) {
208
209
}
210
}
211
} else {
212
- if (!IsWindow(gc->window) && !gc->dwm_capture ||
213
- object_signalled(gc->target_process)) {
214
+ if (!capture_valid(gc)) {
215
info("capture window no longer exists, "
216
"terminating capture");
217
stop_capture(gc);
218
219
!gc->global_hook_info->base_cy)
220
return;
221
222
- ClientToScreen((HWND)gc->global_hook_info->window, &p);
223
+ ClientToScreen((HWND)(uintptr_t)gc->global_hook_info->window, &p);
224
225
float x_scale = (float)gc->global_hook_info->cx /
226
(float)gc->global_hook_info->base_cx;
227
228
static bool window_changed_callback(obs_properties_t *ppts, obs_property_t *p,
229
obs_data_t *settings)
230
{
231
- const char *active_window = obs_data_get_string(settings,
232
- SETTING_ACTIVE_WINDOW);
233
const char *cur_val;
234
bool match = false;
235
size_t i = 0;
236
237
return true;
238
}
239
240
+ UNUSED_PARAMETER(ppts);
241
return false;
242
}
243
244
245
LPRECT rc, LPARAM data)
246
{
247
*(HMONITOR*)data = monitor;
248
+
249
+ UNUSED_PARAMETER(hdc);
250
+ UNUSED_PARAMETER(rc);
251
return false;
252
}
253
254
static obs_properties_t *game_capture_properties(void *data)
255
{
256
- struct game_capture *gc = data;
257
HMONITOR monitor;
258
uint32_t cx = 1920;
259
uint32_t cy = 1080;
260
261
obs_properties_add_bool(ppts, SETTING_CAPTURE_OVERLAYS,
262
TEXT_CAPTURE_OVERLAYS);
263
264
+ obs_properties_add_bool(ppts, SETTING_CURSOR, TEXT_CAPTURE_CURSOR);
265
+
266
UNUSED_PARAMETER(data);
267
return ppts;
268
}
269
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/get-graphics-offsets/get-graphics-offsets.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/get-graphics-offsets/get-graphics-offsets.c
Changed
28
1
2
get_dxgi_offsets(&dxgi);
3
4
printf("[d3d8]\n");
5
- printf("present=0x%"PRIxPTR"\n", d3d8.present);
6
- printf("reset=0x%"PRIxPTR"\n", d3d8.reset);
7
+ printf("present=0x%"PRIx32"\n", d3d8.present);
8
+ printf("reset=0x%"PRIx32"\n", d3d8.reset);
9
printf("[d3d9]\n");
10
- printf("present=0x%"PRIxPTR"\n", d3d9.present);
11
- printf("present_ex=0x%"PRIxPTR"\n", d3d9.present_ex);
12
- printf("present_swap=0x%"PRIxPTR"\n", d3d9.present_swap);
13
- printf("reset=0x%"PRIxPTR"\n", d3d9.reset);
14
- printf("reset_ex=0x%"PRIxPTR"\n", d3d9.reset_ex);
15
+ printf("present=0x%"PRIx32"\n", d3d9.present);
16
+ printf("present_ex=0x%"PRIx32"\n", d3d9.present_ex);
17
+ printf("present_swap=0x%"PRIx32"\n", d3d9.present_swap);
18
+ printf("reset=0x%"PRIx32"\n", d3d9.reset);
19
+ printf("reset_ex=0x%"PRIx32"\n", d3d9.reset_ex);
20
printf("[dxgi]\n");
21
- printf("present=0x%"PRIxPTR"\n", dxgi.present);
22
- printf("resize=0x%"PRIxPTR"\n", dxgi.resize);
23
+ printf("present=0x%"PRIx32"\n", dxgi.present);
24
+ printf("resize=0x%"PRIx32"\n", dxgi.resize);
25
26
(void)argc;
27
(void)argv;
28
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/get-graphics-offsets/get-graphics-offsets.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/get-graphics-offsets/get-graphics-offsets.h
Changed
10
1
2
#ifdef __cplusplus
3
extern "C" {
4
#else
5
-#ifndef inline
6
+#if defined(_MSC_VER) && !defined(inline)
7
#define inline __inline
8
#endif
9
#endif
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/graphics-hook-info.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/graphics-hook-info.h
Changed
10
1
2
{
3
HANDLE handle;
4
char new_name[64];
5
- sprintf(new_name, "%s%d", SHMEM_HOOK_INFO, id);
6
+ sprintf(new_name, "%s%lu", SHMEM_HOOK_INFO, id);
7
8
handle = CreateFileMappingA(INVALID_HANDLE_VALUE, NULL,
9
PAGE_READWRITE, 0, sizeof(struct hook_info), new_name);
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/graphics-hook/CMakeLists.txt -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/graphics-hook/CMakeLists.txt
Changed
18
1
2
../funchook.c
3
../obfuscate.c
4
gl-capture.c
5
+ d3d8-capture.cpp
6
d3d9-capture.cpp
7
dxgi-capture.cpp
8
d3d10-capture.cpp
9
10
${graphics-hook_HEADERS})
11
12
target_link_libraries(graphics-hook
13
- ipc-util)
14
+ ipc-util psapi)
15
16
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
17
set(_output_suffix "64")
18
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/graphics-hook/d3d10-capture.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/graphics-hook/d3d10-capture.cpp
Changed
19
1
2
};
3
};
4
5
-struct d3d10_data data = {};
6
+static struct d3d10_data data = {};
7
8
void d3d10_free(void)
9
{
10
11
}
12
if (!capture_init_shtex(&data.shtex_info, window,
13
data.base_cx, data.base_cy, data.cx, data.cy,
14
- data.format, false, (uint32_t)data.handle)) {
15
+ data.format, false, (uintptr_t)data.handle)) {
16
return false;
17
}
18
19
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/graphics-hook/d3d11-capture.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/graphics-hook/d3d11-capture.cpp
Changed
19
1
2
};
3
};
4
5
-struct d3d11_data data = {};
6
+static struct d3d11_data data = {};
7
8
void d3d11_free(void)
9
{
10
11
}
12
if (!capture_init_shtex(&data.shtex_info, window,
13
data.base_cx, data.base_cy, data.cx, data.cy,
14
- data.format, false, (uint32_t)data.handle)) {
15
+ data.format, false, (uintptr_t)data.handle)) {
16
return false;
17
}
18
19
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/graphics-hook/d3d8-capture.cpp
Added
304
1
2
+#define _CRT_SECURE_NO_WARNINGS
3
+#include <dxgi.h>
4
+
5
+#include "../d3d8-api/d3d8.h"
6
+#include "graphics-hook.h"
7
+#include "../funchook.h"
8
+
9
+typedef HRESULT(STDMETHODCALLTYPE *reset_t)(IDirect3DDevice8*,
10
+ D3DPRESENT_PARAMETERS*);
11
+typedef HRESULT(STDMETHODCALLTYPE *present_t)(IDirect3DDevice8*,
12
+ CONST RECT*, CONST RECT*, HWND, CONST RGNDATA*);
13
+
14
+static struct func_hook present;
15
+static struct func_hook reset;
16
+
17
+struct d3d8_data {
18
+ HMODULE d3d8;
19
+ uint32_t cx;
20
+ uint32_t cy;
21
+ D3DFORMAT d3d8_format;
22
+ DXGI_FORMAT dxgi_format;
23
+
24
+ struct shmem_data *shmem_info;
25
+ HWND window;
26
+ uint32_t pitch;
27
+ IDirect3DSurface8 *copy_surfaces[NUM_BUFFERS];
28
+ bool surface_locked[NUM_BUFFERS];
29
+ int cur_surface;
30
+ int copy_wait;
31
+};
32
+
33
+static d3d8_data data = {};
34
+
35
+static DXGI_FORMAT d3d8_to_dxgi_format(D3DFORMAT format)
36
+{
37
+ switch ((unsigned long)format) {
38
+ case D3DFMT_X1R5G5B5:
39
+ case D3DFMT_A1R5G5B5: return DXGI_FORMAT_B5G5R5A1_UNORM;
40
+ case D3DFMT_R5G6B5: return DXGI_FORMAT_B5G6R5_UNORM;
41
+ case D3DFMT_A8R8G8B8: return DXGI_FORMAT_B8G8R8A8_UNORM;
42
+ case D3DFMT_X8R8G8B8: return DXGI_FORMAT_B8G8R8X8_UNORM;
43
+ }
44
+
45
+ return DXGI_FORMAT_UNKNOWN;
46
+}
47
+
48
+static IDirect3DSurface8 *d3d8_get_backbuffer(IDirect3DDevice8 *device)
49
+{
50
+ IDirect3DSurface8 *backbuffer;
51
+ HRESULT hr;
52
+
53
+ hr = device->GetRenderTarget(&backbuffer);
54
+ if (FAILED(hr)) {
55
+ hlog_hr("d3d8_get_backbuffer: Failed to get backbuffer", hr);
56
+ backbuffer = nullptr;
57
+ }
58
+
59
+ return backbuffer;
60
+}
61
+
62
+static bool d3d8_get_window_handle(IDirect3DDevice8 *device)
63
+{
64
+ D3DDEVICE_CREATION_PARAMETERS parameters;
65
+ HRESULT hr;
66
+ hr = device->GetCreationParameters(¶meters);
67
+ if (FAILED(hr)) {
68
+ hlog_hr("d3d8_get_window_handle: Failed to get "
69
+ "device creation parameters", hr);
70
+ return false;
71
+ }
72
+
73
+ data.window = parameters.hFocusWindow;
74
+
75
+ return true;
76
+}
77
+
78
+static bool d3d8_init_format_backbuffer(IDirect3DDevice8 *device)
79
+{
80
+ IDirect3DSurface8 *backbuffer;
81
+ D3DSURFACE_DESC desc;
82
+ HRESULT hr;
83
+
84
+ if (!d3d8_get_window_handle(device))
85
+ return false;
86
+
87
+ backbuffer = d3d8_get_backbuffer(device);
88
+ if (!backbuffer)
89
+ return false;
90
+
91
+ hr = backbuffer->GetDesc(&desc);
92
+ backbuffer->Release();
93
+ if (FAILED(hr)) {
94
+ hlog_hr("d3d8_init_format_backbuffer: Failed to get "
95
+ "backbuffer descriptor", hr);
96
+ return false;
97
+ }
98
+
99
+ data.d3d8_format = desc.Format;
100
+ data.dxgi_format = d3d8_to_dxgi_format(desc.Format);
101
+ data.cx = desc.Width;
102
+ data.cy = desc.Height;
103
+
104
+ return true;
105
+}
106
+
107
+static bool d3d8_shmem_init_buffer(IDirect3DDevice8 *device, int idx)
108
+{
109
+ HRESULT hr;
110
+
111
+ hr = device->CreateImageSurface(data.cx, data.cy,
112
+ data.d3d8_format, &data.copy_surfaces[idx]);
113
+ if (FAILED(hr)) {
114
+ hlog_hr("d3d8_shmem_init_buffer: Failed to create surface", hr);
115
+ return false;
116
+ }
117
+
118
+ if (idx == 0) {
119
+ D3DLOCKED_RECT rect;
120
+ hr = data.copy_surfaces[0]->LockRect(&rect, nullptr,
121
+ D3DLOCK_READONLY);
122
+ if (FAILED(hr)) {
123
+ hlog_hr("d3d8_shmem_init_buffer: Failed to lock buffer", hr);
124
+ return false;
125
+ }
126
+
127
+ data.pitch = rect.Pitch;
128
+ data.copy_surfaces[0]->UnlockRect();
129
+ }
130
+
131
+ return true;
132
+}
133
+
134
+static bool d3d8_shmem_init(IDirect3DDevice8 *device)
135
+{
136
+ for (int i = 0; i < NUM_BUFFERS; i++) {
137
+ if (!d3d8_shmem_init_buffer(device, i)) {
138
+ return false;
139
+ }
140
+ }
141
+ if (!capture_init_shmem(&data.shmem_info, data.window, data.cx, data.cy,
142
+ data.cx, data.cy, data.pitch, data.dxgi_format,
143
+ false)) {
144
+ return false;
145
+ }
146
+
147
+ hlog("d3d8 memory capture successfull");
148
+ return true;
149
+}
150
+
151
+static void d3d8_free()
152
+{
153
+ capture_free();
154
+
155
+ for (size_t i = 0; i < NUM_BUFFERS; i++) {
156
+ if (data.copy_surfaces[i]) {
157
+ if (data.surface_locked[i])
158
+ data.copy_surfaces[i]->UnlockRect();
159
+ data.copy_surfaces[i]->Release();
160
+ }
161
+ }
162
+
163
+ memset(&data, 0, sizeof(data));
164
+
165
+ hlog("----------------- d3d8 capture freed -----------------");
166
+}
167
+
168
+static void d3d8_init(IDirect3DDevice8 *device)
169
+{
170
+ data.d3d8 = get_system_module("d3d8.dll");
171
+
172
+ if (!d3d8_init_format_backbuffer(device))
173
+ return;
174
+
175
+ if (!d3d8_shmem_init(device))
176
+ d3d8_free();
177
+}
178
+
179
+static void d3d8_shmem_capture_copy(int idx)
180
+{
181
+ IDirect3DSurface8 *target = data.copy_surfaces[idx];
182
+ D3DLOCKED_RECT rect;
183
+ HRESULT hr;
184
+
185
+ if (data.surface_locked[idx])
186
+ return;
187
+
188
+ hr = target->LockRect(&rect, nullptr, D3DLOCK_READONLY);
189
+ if (SUCCEEDED(hr)) {
190
+ shmem_copy_data(idx, rect.pBits);
191
+ }
192
+}
193
+
194
+static void d3d8_shmem_capture(IDirect3DDevice8 *device,
195
+ IDirect3DSurface8 *backbuffer)
196
+{
197
+ int cur_surface;
198
+ int next_surface;
199
+ HRESULT hr;
200
+
201
+ cur_surface = data.cur_surface;
202
+ next_surface = (cur_surface == NUM_BUFFERS - 1) ? 0 : cur_surface + 1;
203
+
204
+ if (data.copy_wait < NUM_BUFFERS - 1) {
205
+ data.copy_wait++;
206
+ } else {
207
+ IDirect3DSurface8 *src = backbuffer;
208
+ IDirect3DSurface8 *dst = data.copy_surfaces[cur_surface];
209
+
210
+ if (shmem_texture_data_lock(next_surface)) {
211
+ dst->UnlockRect();
212
+ data.surface_locked[next_surface] = false;
213
+ shmem_texture_data_unlock(next_surface);
214
+ }
215
+
216
+ hr = device->CopyRects(src, nullptr, 0, dst, nullptr);
217
+ if (SUCCEEDED(hr)) {
218
+ d3d8_shmem_capture_copy(cur_surface);
219
+ }
220
+ }
221
+
222
+ data.cur_surface = next_surface;
223
+}
224
+
225
+static void d3d8_capture(IDirect3DDevice8 *device,
226
+ IDirect3DSurface8 *backbuffer)
227
+{
228
+ if (capture_should_stop()) {
229
+ d3d8_free();
230
+ }
231
+ if (capture_should_init()) {
232
+ d3d8_init(device);
233
+ }
234
+ if (capture_ready()) {
235
+ d3d8_shmem_capture(device, backbuffer);
236
+ }
237
+}
238
+
239
+
240
+static HRESULT STDMETHODCALLTYPE hook_reset(IDirect3DDevice8 *device,
241
+ D3DPRESENT_PARAMETERS *parameters)
242
+{
243
+ HRESULT hr;
244
+
245
+ if (capture_active())
246
+ d3d8_free();
247
+
248
+ unhook(&reset);
249
+ reset_t call = (reset_t)reset.call_addr;
250
+ hr = call(device, parameters);
251
+ rehook(&reset);
252
+
253
+ return hr;
254
+}
255
+
256
+static HRESULT STDMETHODCALLTYPE hook_present(IDirect3DDevice8 *device,
257
+ CONST RECT *src_rect, CONST RECT *dst_rect,
258
+ HWND override_window, CONST RGNDATA *dirty_region)
259
+{
260
+ IDirect3DSurface8 *backbuffer;
261
+ HRESULT hr;
262
+
263
+ backbuffer = d3d8_get_backbuffer(device);
264
+ if (backbuffer) {
265
+ d3d8_capture(device, backbuffer);
266
+ backbuffer->Release();
267
+ }
268
+
269
+ unhook(&present);
270
+ present_t call = (present_t)present.call_addr;
271
+ hr = call(device, src_rect, dst_rect, override_window, dirty_region);
272
+ rehook(&present);
273
+
274
+ return hr;
275
+}
276
+
277
+bool hook_d3d8(void)
278
+{
279
+ HMODULE d3d8_module = get_system_module("d3d8.dll");
280
+ void *present_addr;
281
+ void *reset_addr;
282
+
283
+ if (!d3d8_module) {
284
+ return false;
285
+ }
286
+
287
+ present_addr = get_offset_addr(d3d8_module,
288
+ global_hook_info->offsets.d3d8.present);
289
+ reset_addr = get_offset_addr(d3d8_module,
290
+ global_hook_info->offsets.d3d8.reset);
291
+
292
+ hook_init(&present, present_addr, (void*)hook_present,
293
+ "IDirect3DDevice8::Present");
294
+ hook_init(&reset, reset_addr, (void*)hook_reset,
295
+ "IDirect3DDevice8::Reset");
296
+
297
+ rehook(&present);
298
+ rehook(&reset);
299
+
300
+ hlog("Hooked D3D8");
301
+
302
+ return true;
303
+}
304
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/graphics-hook/d3d9-capture.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/graphics-hook/d3d9-capture.cpp
Changed
62
1
2
3
static DXGI_FORMAT d3d9_to_dxgi_format(D3DFORMAT format)
4
{
5
- switch (format) {
6
+ switch ((unsigned long)format) {
7
case D3DFMT_A2B10G10R10: return DXGI_FORMAT_R10G10B10A2_UNORM;
8
case D3DFMT_A8R8G8B8: return DXGI_FORMAT_B8G8R8A8_UNORM;
9
case D3DFMT_X8R8G8B8: return DXGI_FORMAT_B8G8R8X8_UNORM;
10
11
}
12
if (!capture_init_shtex(&data.shtex_info, window, cx, cy,
13
data.cx, data.cy, data.dxgi_format, false,
14
- (uint32_t)data.handle)) {
15
+ (uintptr_t)data.handle)) {
16
return false;
17
}
18
19
20
return true;
21
}
22
23
-static bool d3d9_init_format_swapchain(uint32_t cx, uint32_t cy, HWND window)
24
+static bool d3d9_init_format_swapchain(uint32_t &cx, uint32_t &cy, HWND &window)
25
{
26
D3DPRESENT_PARAMETERS pp;
27
28
29
{
30
IDirect3DDevice9Ex *d3d9ex = nullptr;
31
bool success;
32
- uint32_t cx;
33
- uint32_t cy;
34
- HWND window;
35
+ uint32_t cx = 0;
36
+ uint32_t cy = 0;
37
+ HWND window = nullptr;
38
HRESULT hr;
39
40
data.d3d9 = get_system_module("d3d9.dll");
41
42
reset_ex_addr = get_offset_addr(d3d9_module,
43
global_hook_info->offsets.d3d9.reset_ex);
44
45
- hook_init(&present, present_addr, hook_present,
46
+ hook_init(&present, present_addr, (void*)hook_present,
47
"IDirect3DDevice9::Present");
48
- hook_init(&present_ex, present_ex_addr, hook_present_ex,
49
+ hook_init(&present_ex, present_ex_addr, (void*)hook_present_ex,
50
"IDirect3DDevice9Ex::PresentEx");
51
- hook_init(&present_swap, present_swap_addr, hook_present_swap,
52
+ hook_init(&present_swap, present_swap_addr, (void*)hook_present_swap,
53
"IDirect3DSwapChain9::Present");
54
- hook_init(&reset, reset_addr, hook_reset,
55
+ hook_init(&reset, reset_addr, (void*)hook_reset,
56
"IDirect3DDevice9::Reset");
57
- hook_init(&reset_ex, reset_ex_addr, hook_reset_ex,
58
+ hook_init(&reset_ex, reset_ex_addr, (void*)hook_reset_ex,
59
"IDirect3DDevice9Ex::ResetEx");
60
61
rehook(&reset_ex);
62
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/graphics-hook/d3d9-patches.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/graphics-hook/d3d9-patches.hpp
Changed
50
1
2
3
#include <stdint.h>
4
5
+#ifdef __MINGW32__
6
+#include <excpt.h>
7
+#ifndef TRYLEVEL_NONE
8
+#ifndef __MINGW64__
9
+#define NO_SEH_MINGW
10
+#endif
11
+#ifndef __try
12
+#define __try
13
+#endif
14
+#ifndef __except
15
+#define __except(x) if (0)
16
+#endif
17
+#endif
18
+#endif
19
+
20
static inline int safe_memcmp(const void *p1, const void *p2, size_t size)
21
{
22
- __try {
23
+
24
+// Disabled exceptions on mingw-w64 as it is broken
25
+#ifndef __MINGW32__
26
+#ifdef NO_SEH_MINGW
27
+ __try1(EXCEPTION_EXECUTE_HANDLER)
28
+#else
29
+ __try
30
+#endif
31
+#endif
32
+ {
33
return memcmp(p1, p2, size);
34
- } __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION) {
35
+ }
36
+// Disabled exceptions on mingw-w64 as it is broken
37
+#ifndef __MINGW32__
38
+#ifdef NO_SEH_MINGW
39
+ __except1
40
+#else
41
+ __except(EXCEPTION_EXECUTE_HANDLER)
42
+#endif
43
+ {
44
return -1;
45
}
46
+#endif
47
}
48
49
struct patch_info {
50
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/graphics-hook/dxgi-capture.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/graphics-hook/dxgi-capture.cpp
Changed
13
1
2
resize_addr = get_offset_addr(dxgi_module,
3
global_hook_info->offsets.dxgi.resize);
4
5
- hook_init(&present, present_addr, hook_present,
6
+ hook_init(&present, present_addr, (void*)hook_present,
7
"IDXGISwapChain::Present");
8
- hook_init(&resize_buffers, resize_addr, hook_resize_buffers,
9
+ hook_init(&resize_buffers, resize_addr, (void*)hook_resize_buffers,
10
"IDXGISwapChain::ResizeBuffers");
11
12
rehook(&resize_buffers);
13
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/graphics-hook/dxgi-helpers.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/graphics-hook/dxgi-helpers.hpp
Changed
10
1
2
3
static inline DXGI_FORMAT fix_dxgi_format(DXGI_FORMAT format)
4
{
5
- switch (format) {
6
+ switch ((unsigned long)format) {
7
case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
8
return DXGI_FORMAT_B8G8R8A8_UNORM;
9
case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/graphics-hook/gl-capture.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/graphics-hook/gl-capture.c
Changed
38
1
2
#define _CRT_SECURE_NO_WARNINGS
3
+
4
+#ifdef _MSC_VER
5
#pragma warning(disable : 4214) /* nonstandard extension, non-int bitfield */
6
#pragma warning(disable : 4054) /* function pointer to data pointer */
7
+#endif
8
+
9
#include <windows.h>
10
11
#define COBJMACROS
12
13
14
typedef HRESULT (WINAPI *create_dxgi_factory1_t)(REFIID, void **);
15
16
-const static D3D_FEATURE_LEVEL feature_levels[] =
17
+static const D3D_FEATURE_LEVEL feature_levels[] =
18
{
19
D3D_FEATURE_LEVEL_11_0,
20
D3D_FEATURE_LEVEL_10_1,
21
22
}
23
if (!capture_init_shtex(&data.shtex_info, window,
24
data.base_cx, data.base_cy, data.cx, data.cy,
25
- data.format, true, (uint32_t)data.handle)) {
26
+ data.format, true, (uintptr_t)data.handle)) {
27
return false;
28
}
29
30
31
{
32
static bool functions_initialized = false;
33
static bool critical_failure = false;
34
- static bool reacquireing = false;
35
36
if (critical_failure) {
37
return;
38
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/graphics-hook/gl-decs.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/graphics-hook/gl-decs.h
Changed
16
1
2
static GLDRAWBUFFERPROC glDrawBuffer = NULL;
3
static GLGETINTEGERVPROC glGetIntegerv = NULL;
4
static GLGETERRORPROC glGetError = NULL;
5
-static WGLSWAPLAYERBUFFERSPROC jimglSwapLayerBuffers = NULL;
6
-static WGLSWAPBUFFERSPROC jimglSwapBuffers = NULL;
7
-static WGLDELETECONTEXTPROC jimglDeleteContext = NULL;
8
static WGLGETPROCADDRESSPROC jimglGetProcAddress = NULL;
9
static WGLMAKECURRENTPROC jimglMakeCurrent = NULL;
10
static WGLGETCURRENTDCPROC jimglGetCurrentDC = NULL;
11
static WGLGETCURRENTCONTEXTPROC jimglGetCurrentContext = NULL;
12
-static WGLCREATECONTEXTPROC jimglCreateContext = NULL;
13
static GLBUFFERDATAARBPROC glBufferData = NULL;
14
static GLDELETEBUFFERSARBPROC glDeleteBuffers = NULL;
15
static GLDELETETEXTURESPROC glDeleteTextures = NULL;
16
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/graphics-hook/graphics-hook.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/graphics-hook/graphics-hook.c
Changed
292
1
2
#include <windows.h>
3
#include <shlobj.h>
4
#include <psapi.h>
5
-#include <ipc-util/pipe.h>
6
#include "graphics-hook.h"
7
#include "../obfuscate.h"
8
#include "../funchook.h"
9
10
volatile bool locked_textures[NUM_BUFFERS];
11
};
12
13
-static ipc_pipe_client_t pipe = {0};
14
-static HANDLE signal_restart = NULL;
15
-static HANDLE signal_stop = NULL;
16
-static HANDLE signal_ready = NULL;
17
-static HANDLE signal_exit = NULL;
18
-static HANDLE tex_mutexes[2] = {NULL, NULL};
19
+ipc_pipe_client_t pipe = {0};
20
+HANDLE signal_restart = NULL;
21
+HANDLE signal_stop = NULL;
22
+HANDLE signal_ready = NULL;
23
+HANDLE signal_exit = NULL;
24
+HANDLE tex_mutexes[2] = {NULL, NULL};
25
static HANDLE filemap_hook_info = NULL;
26
27
static volatile bool stop_loop = false;
28
static HANDLE capture_thread = NULL;
29
-static char system_path[MAX_PATH] = {0};
30
-static char process_name[MAX_PATH] = {0};
31
-static char keepalive_name[64] = {0};
32
+char system_path[MAX_PATH] = {0};
33
+char process_name[MAX_PATH] = {0};
34
+char keepalive_name[64] = {0};
35
36
static unsigned int shmem_id_counter = 0;
37
static void *shmem_info = NULL;
38
39
}
40
}
41
42
-static inline bool init_pipe(void)
43
+bool init_pipe(void)
44
{
45
char new_name[64];
46
- sprintf(new_name, "%s%d", PIPE_NAME, GetCurrentProcessId());
47
+ sprintf(new_name, "%s%lu", PIPE_NAME, GetCurrentProcessId());
48
49
if (!ipc_pipe_client_open(&pipe, new_name)) {
50
DbgOut("Failed to open pipe\n");
51
52
char new_name[64];
53
HANDLE handle;
54
55
- sprintf(new_name, "%s%d", name, pid);
56
+ sprintf(new_name, "%s%lu", name, pid);
57
58
handle = OpenMutexA(MUTEX_ALL_ACCESS, false, new_name);
59
if (!handle)
60
61
{
62
wait_for_dll_main_finish(thread_handle);
63
64
- sprintf(keepalive_name, "%s%d", EVENT_HOOK_KEEPALIVE,
65
+ sprintf(keepalive_name, "%s%lu", EVENT_HOOK_KEEPALIVE,
66
GetCurrentProcessId());
67
68
if (!init_pipe()) {
69
70
71
static inline bool attempt_hook(void)
72
{
73
- static bool ddraw_hooked = false;
74
+ //static bool ddraw_hooked = false;
75
static bool d3d8_hooked = false;
76
static bool d3d9_hooked = false;
77
static bool dxgi_hooked = false;
78
79
rehook_gl();*/
80
}
81
82
- /*if (!d3d8_hooked) {
83
+ if (!d3d8_hooked) {
84
if (!d3d8_hookable()) {
85
d3d8_hooked = true;
86
} else {
87
88
}
89
}
90
91
- if (!ddraw_hooked) {
92
+ /*if (!ddraw_hooked) {
93
if (!ddraw_hookable()) {
94
ddraw_hooked = true;
95
} else {
96
97
}
98
}
99
100
-inline const char *get_process_name(void)
101
-{
102
- return process_name;
103
-}
104
-
105
-inline HMODULE get_system_module(const char *module)
106
-{
107
- char base_path[MAX_PATH];
108
-
109
- strcpy(base_path, system_path);
110
- strcat(base_path, "\\");
111
- strcat(base_path, module);
112
- return GetModuleHandleA(module);
113
-}
114
-
115
-inline HMODULE load_system_library(const char *name)
116
-{
117
- char base_path[MAX_PATH];
118
- HMODULE module;
119
-
120
- strcpy(base_path, system_path);
121
- strcat(base_path, "\\");
122
- strcat(base_path, name);
123
-
124
- module = GetModuleHandleA(base_path);
125
- if (module)
126
- return module;
127
-
128
- return LoadLibraryA(base_path);
129
-}
130
-
131
-static inline bool capture_alive(void)
132
-{
133
- HANDLE event = OpenEventA(EVENT_ALL_ACCESS, false, keepalive_name);
134
- if (event) {
135
- CloseHandle(event);
136
- return true;
137
- }
138
-
139
- return false;
140
-}
141
-
142
-inline bool capture_active(void)
143
-{
144
- return active;
145
-}
146
-
147
-static inline bool capture_stopped(void)
148
-{
149
- return WaitForSingleObject(signal_stop, 0) == WAIT_OBJECT_0;
150
-}
151
-
152
-static inline bool capture_restarted(void)
153
-{
154
- return WaitForSingleObject(signal_restart, 0) == WAIT_OBJECT_0;
155
-}
156
-
157
-inline bool capture_should_stop(void)
158
-{
159
- bool stop_requested = false;
160
-
161
- if (capture_active())
162
- stop_requested = capture_stopped() || !capture_alive();
163
-
164
- return stop_requested;
165
-}
166
-
167
-inline bool capture_should_init(void)
168
-{
169
- if (!capture_active() && capture_restarted()) {
170
- if (capture_alive()) {
171
- if (!ipc_pipe_client_valid(&pipe)) {
172
- init_pipe();
173
- }
174
- return true;
175
- }
176
- }
177
-
178
- return false;
179
-}
180
-
181
static inline uint64_t get_clockfreq(void)
182
{
183
static bool have_clockfreq = false;
184
185
return (uint64_t)time_val;
186
}
187
188
-inline int try_lock_shmem_tex(int id)
189
+static inline int try_lock_shmem_tex(int id)
190
{
191
int next = id == 0 ? 1 : 0;
192
193
194
return -1;
195
}
196
197
-inline void unlock_shmem_tex(int id)
198
+static inline void unlock_shmem_tex(int id)
199
{
200
if (id != -1) {
201
ReleaseMutex(tex_mutexes[id]);
202
}
203
}
204
205
-static inline bool frame_ready(uint64_t interval)
206
-{
207
- static uint64_t last_time = 0;
208
- uint64_t elapsed;
209
- uint64_t t;
210
-
211
- if (!interval) {
212
- return true;
213
- }
214
-
215
- t = os_gettime_ns();
216
- elapsed = t - last_time;
217
-
218
- if (elapsed < interval) {
219
- return false;
220
- }
221
-
222
- last_time = (elapsed > interval * 2) ? t : last_time + interval;
223
- return true;
224
-}
225
-
226
-inline bool capture_ready(void)
227
-{
228
- return capture_active() &&
229
- frame_ready(global_hook_info->frame_interval);
230
-}
231
-
232
static inline bool init_shared_info(size_t size)
233
{
234
char name[64];
235
236
237
bool capture_init_shtex(struct shtex_data **data, HWND window,
238
uint32_t base_cx, uint32_t base_cy, uint32_t cx, uint32_t cy,
239
- uint32_t format, bool flip, uint32_t handle)
240
+ uint32_t format, bool flip, uintptr_t handle)
241
{
242
if (!init_shared_info(sizeof(struct shtex_data))) {
243
hlog("capture_init_shtex: Failed to initialize memory");
244
245
}
246
247
*data = shmem_info;
248
- (*data)->tex_handle = handle;
249
+ (*data)->tex_handle = (uint32_t)handle;
250
251
- global_hook_info->window = (uint32_t)window;
252
+ global_hook_info->window = (uint32_t)(uintptr_t)window;
253
global_hook_info->type = CAPTURE_TYPE_TEXTURE;
254
global_hook_info->format = format;
255
global_hook_info->flip = flip;
256
257
return 0;
258
}
259
260
-inline void shmem_copy_data(size_t idx, void *volatile data)
261
+void shmem_copy_data(size_t idx, void *volatile data)
262
{
263
EnterCriticalSection(&thread_data.data_mutex);
264
thread_data.cur_tex = (int)idx;
265
266
SetEvent(thread_data.copy_event);
267
}
268
269
-inline bool shmem_texture_data_lock(int idx)
270
+bool shmem_texture_data_lock(int idx)
271
{
272
bool locked;
273
274
275
return false;
276
}
277
278
-inline void shmem_texture_data_unlock(int idx)
279
+void shmem_texture_data_unlock(int idx)
280
{
281
EnterCriticalSection(&thread_data.data_mutex);
282
thread_data.locked_textures[idx] = false;
283
284
(*data)->tex1_offset = (uint32_t)align_pos;
285
(*data)->tex2_offset = (*data)->tex1_offset + aligned_tex;
286
287
- global_hook_info->window = (uint32_t)window;
288
+ global_hook_info->window = (uint32_t)(uintptr_t)window;
289
global_hook_info->type = CAPTURE_TYPE_MEMORY;
290
global_hook_info->format = format;
291
global_hook_info->flip = flip;
292
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/graphics-hook/graphics-hook.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/graphics-hook/graphics-hook.h
Changed
189
1
2
#pragma once
3
4
+#ifdef _MSC_VER
5
/* conversion from data/function pointer */
6
#pragma warning(disable: 4152)
7
+#endif
8
9
#include "../graphics-hook-info.h"
10
+#include <ipc-util/pipe.h>
11
12
#ifdef __cplusplus
13
extern "C" {
14
#else
15
-#ifndef inline
16
+#if defined(_MSC_VER) && !defined(inline)
17
#define inline __inline
18
#endif
19
#endif
20
21
22
extern void hlog(const char *format, ...);
23
extern void hlog_hr(const char *text, HRESULT hr);
24
-extern inline const char *get_process_name(void);
25
-extern inline HMODULE get_system_module(const char *module);
26
-extern inline HMODULE load_system_library(const char *module);
27
+static inline const char *get_process_name(void);
28
+static inline HMODULE get_system_module(const char *module);
29
+static inline HMODULE load_system_library(const char *module);
30
extern uint64_t os_gettime_ns(void);
31
32
-extern inline bool capture_active(void);
33
-extern inline bool capture_ready(void);
34
-extern inline bool capture_should_stop(void);
35
-extern inline bool capture_should_init(void);
36
+static inline bool capture_active(void);
37
+static inline bool capture_ready(void);
38
+static inline bool capture_should_stop(void);
39
+static inline bool capture_should_init(void);
40
41
-extern inline void shmem_copy_data(size_t idx, void *volatile data);
42
-extern inline bool shmem_texture_data_lock(int idx);
43
-extern inline void shmem_texture_data_unlock(int idx);
44
+extern void shmem_copy_data(size_t idx, void *volatile data);
45
+extern bool shmem_texture_data_lock(int idx);
46
+extern void shmem_texture_data_unlock(int idx);
47
48
extern bool hook_ddraw(void);
49
extern bool hook_d3d8(void);
50
51
52
extern bool capture_init_shtex(struct shtex_data **data, HWND window,
53
uint32_t base_cx, uint32_t base_cy, uint32_t cx, uint32_t cy,
54
- uint32_t format, bool flip, uint32_t handle);
55
+ uint32_t format, bool flip, uintptr_t handle);
56
extern bool capture_init_shmem(struct shmem_data **data, HWND window,
57
uint32_t base_cx, uint32_t base_cy, uint32_t cx, uint32_t cy,
58
uint32_t pitch, uint32_t format, bool flip);
59
60
return (void*)((uintptr_t)module + (uintptr_t)offset);
61
}
62
63
+/* ------------------------------------------------------------------------- */
64
+
65
+extern ipc_pipe_client_t pipe;
66
+extern HANDLE signal_restart;
67
+extern HANDLE signal_stop;
68
+extern HANDLE signal_ready;
69
+extern HANDLE signal_exit;
70
+extern HANDLE tex_mutexes[2];
71
+extern char system_path[MAX_PATH];
72
+extern char process_name[MAX_PATH];
73
+extern char keepalive_name[64];
74
+extern volatile bool active;
75
+
76
+static inline const char *get_process_name(void)
77
+{
78
+ return process_name;
79
+}
80
+
81
+static inline HMODULE get_system_module(const char *module)
82
+{
83
+ char base_path[MAX_PATH];
84
+
85
+ strcpy(base_path, system_path);
86
+ strcat(base_path, "\\");
87
+ strcat(base_path, module);
88
+ return GetModuleHandleA(module);
89
+}
90
+
91
+static inline HMODULE load_system_library(const char *name)
92
+{
93
+ char base_path[MAX_PATH];
94
+ HMODULE module;
95
+
96
+ strcpy(base_path, system_path);
97
+ strcat(base_path, "\\");
98
+ strcat(base_path, name);
99
+
100
+ module = GetModuleHandleA(base_path);
101
+ if (module)
102
+ return module;
103
+
104
+ return LoadLibraryA(base_path);
105
+}
106
+
107
+static inline bool capture_alive(void)
108
+{
109
+ HANDLE event = OpenEventA(EVENT_ALL_ACCESS, false, keepalive_name);
110
+ if (event) {
111
+ CloseHandle(event);
112
+ return true;
113
+ }
114
+
115
+ return false;
116
+}
117
+
118
+static inline bool capture_active(void)
119
+{
120
+ return active;
121
+}
122
+
123
+static inline bool frame_ready(uint64_t interval)
124
+{
125
+ static uint64_t last_time = 0;
126
+ uint64_t elapsed;
127
+ uint64_t t;
128
+
129
+ if (!interval) {
130
+ return true;
131
+ }
132
+
133
+ t = os_gettime_ns();
134
+ elapsed = t - last_time;
135
+
136
+ if (elapsed < interval) {
137
+ return false;
138
+ }
139
+
140
+ last_time = (elapsed > interval * 2) ? t : last_time + interval;
141
+ return true;
142
+}
143
+
144
+static inline bool capture_ready(void)
145
+{
146
+ return capture_active() &&
147
+ frame_ready(global_hook_info->frame_interval);
148
+}
149
+
150
+static inline bool capture_stopped(void)
151
+{
152
+ return WaitForSingleObject(signal_stop, 0) == WAIT_OBJECT_0;
153
+}
154
+
155
+static inline bool capture_restarted(void)
156
+{
157
+ return WaitForSingleObject(signal_restart, 0) == WAIT_OBJECT_0;
158
+}
159
+
160
+static inline bool capture_should_stop(void)
161
+{
162
+ bool stop_requested = false;
163
+
164
+ if (capture_active())
165
+ stop_requested = capture_stopped() || !capture_alive();
166
+
167
+ return stop_requested;
168
+}
169
+
170
+extern bool init_pipe(void);
171
+
172
+static inline bool capture_should_init(void)
173
+{
174
+ if (!capture_active() && capture_restarted()) {
175
+ if (capture_alive()) {
176
+ if (!ipc_pipe_client_valid(&pipe)) {
177
+ init_pipe();
178
+ }
179
+ return true;
180
+ }
181
+ }
182
+
183
+ return false;
184
+}
185
+
186
#ifdef __cplusplus
187
}
188
#endif
189
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/hook-helpers.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/hook-helpers.h
Changed
18
1
2
static inline HANDLE get_event_plus_id(const char *name, DWORD id)
3
{
4
char new_name[64];
5
- sprintf(new_name, "%s%d", name, id);
6
+ sprintf(new_name, "%s%lu", name, id);
7
return get_event(new_name);
8
}
9
10
static inline HANDLE get_mutex_plus_id(const char *name, DWORD id)
11
{
12
char new_name[64];
13
- sprintf(new_name, "%s%d", name, id);
14
+ sprintf(new_name, "%s%lu", name, id);
15
return get_mutex(new_name);
16
}
17
18
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/inject-helper/inject-helper.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/inject-helper/inject-helper.c
Changed
18
1
2
static void load_debug_privilege(void)
3
{
4
const DWORD flags = TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY;
5
- bool success = false;
6
TOKEN_PRIVILEGES tp;
7
HANDLE token;
8
LUID val;
9
10
tp.Privileges[0].Luid = val;
11
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
12
13
- success = !!AdjustTokenPrivileges(token, false, &tp,
14
+ AdjustTokenPrivileges(token, false, &tp,
15
sizeof(tp), NULL, NULL);
16
}
17
18
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/load-graphics-offsets.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/load-graphics-offsets.c
Changed
22
1
2
return false;
3
}
4
5
+ offsets->d3d8.present =
6
+ (uint32_t)config_get_uint(config, "d3d8", "present");
7
+ offsets->d3d8.reset =
8
+ (uint32_t)config_get_uint(config, "d3d8", "reset");
9
+
10
offsets->d3d9.present =
11
(uint32_t)config_get_uint(config, "d3d9", "present");
12
offsets->d3d9.present_ex =
13
14
}
15
16
for (;;) {
17
- size_t len = os_process_pipe_read(pp, data, 128);
18
+ size_t len = os_process_pipe_read(pp, (uint8_t*)data, 128);
19
if (!len)
20
break;
21
22
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/monitor-capture.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/monitor-capture.c
Changed
15
1
2
"monitor", TEXT_MONITOR,
3
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
4
5
- obs_property_t *compatmode = obs_properties_add_bool(props,
6
- "compatibility", TEXT_COMPATIBILITY);
7
-
8
- obs_property_t *capture_cursor = obs_properties_add_bool(props,
9
- "capture_cursor", TEXT_CAPTURE_CURSOR);
10
+ obs_properties_add_bool(props, "compatibility", TEXT_COMPATIBILITY);
11
+ obs_properties_add_bool(props, "capture_cursor", TEXT_CAPTURE_CURSOR);
12
13
EnumDisplayMonitors(NULL, NULL, enum_monitor_props, (LPARAM)monitors);
14
15
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/obfuscate.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/obfuscate.c
Changed
11
1
2
#define _CRT_SECURE_NO_WARNINGS
3
+
4
+#ifdef _MSC_VER
5
#pragma warning(disable : 4152) /* casting func ptr to void */
6
+#endif
7
+
8
#include <stdbool.h>
9
#include <windows.h>
10
#include "obfuscate.h"
11
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-capture/window-helpers.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-capture/window-helpers.c
Changed
10
1
2
#include "window-helpers.h"
3
#include "obfuscate.h"
4
5
-#define inline __inline
6
-
7
static inline void encode_dstr(struct dstr *str)
8
{
9
dstr_replace(str, "#", "#22");
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/CMakeLists.txt -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/CMakeLists.txt
Changed
12
1
2
${libdshowcapture_HEADERS})
3
target_link_libraries(win-dshow
4
libobs
5
- strmiids.lib
6
+ strmiids
7
+ ksuser
8
+ wmcodecdspuuid
9
${FFMPEG_LIBRARIES})
10
11
install_obs_plugin_with_data(win-dshow data)
12
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/ar-SA.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/ar-SA.ini
Changed
14
1
2
ConfigureCrossbar="تكوين العارضة"
3
ResFPSType="نوع الأبعاد/FPS"
4
ResFPSType.Custom="مخصص"
5
-ResFPSType.DevPreferred="الجهاز المفضل"
6
FPS.Matching="تطابق إخراج FPS"
7
FPS.Highest="أعلى FPS"
8
Resolution="الأبعاد"
9
10
VideoFormat.Any="أي"
11
VideoFormat.Unknown="المجهول (%1)"
12
13
+
14
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/bg-BG.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/bg-BG.ini
Changed
12
1
2
Device="Устройство"
3
ConfigureVideo="Настрой видео"
4
ResFPSType.Custom="По избор"
5
-ResFPSType.DevPreferred="Предпочитано устройство"
6
Resolution="Резолюция"
7
VideoFormat="Видео формат"
8
VideoFormat.Any="Всичко"
9
VideoFormat.Unknown="Неизвестно (%1)"
10
11
+
12
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/da-DK.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/da-DK.ini
Changed
30
1
2
VideoCaptureDevice="Video Optagelsesenhed"
3
Device="Enhed"
4
+ColorSpace.Default="Standard"
5
+ColorRange="YUV farveområde"
6
+ColorRange.Partial="Delvis"
7
+ColorRange.Full="Fuld"
8
ConfigureAudio="Konfigurere lyd"
9
ConfigureVideo="Konfigurere Video"
10
ConfigureCrossbar="Konfigurere overligger"
11
ResFPSType="Opløsning/FPS Type"
12
ResFPSType.Custom="Brugerdefineret"
13
-ResFPSType.DevPreferred="Fortrukken Enhed"
14
+ResFPSType.DevPreferred="Enhedens standard"
15
FPS.Matching="Match Udgang FPS"
16
FPS.Highest="Højeste FPS"
17
Resolution="Opløsning"
18
19
VideoFormat.Unknown="Ukendt (%1)"
20
UseCustomAudioDevice="Brug brugerdefinerede lydenhed"
21
AudioDevice="Lydenhed"
22
+Buffering="Buffering"
23
+Buffering.Enable="Slå til"
24
+Buffering.Disable="Slå fra"
25
+Activate="Aktivér"
26
+Deactivate="Deaktivér"
27
+
28
+Bitrate="Bitrate"
29
30
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/de-DE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/de-DE.ini
Changed
35
1
2
-VideoCaptureDevice="Videogerät"
3
+VideoCaptureDevice="Videoaufnahmegerät"
4
Device="Gerät"
5
+ColorSpace="YUV-Farbraum"
6
+ColorSpace.Default="Standard"
7
+ColorRange="YUV Farbpalette"
8
+ColorRange.Partial="Teilweise"
9
+ColorRange.Full="Voll"
10
ConfigureAudio="Audio konfigurieren"
11
ConfigureVideo="Video konfigurieren"
12
ConfigureCrossbar="Crossbar konfigurieren"
13
ResFPSType="Auflösung/FPS Typ"
14
ResFPSType.Custom="Benutzerdefiniert"
15
-ResFPSType.DevPreferred="Bevorzugte Einstellungen des Geräts benutzen"
16
+ResFPSType.DevPreferred="Gerätestandard"
17
FPS.Matching="Ausgang FPS benutzen"
18
FPS.Highest="Höchstmögliche FPS"
19
Resolution="Auflösung"
20
21
VideoFormat.Unknown="Unbekannt (%1)"
22
UseCustomAudioDevice="Verwende eigenes Audiogerät"
23
AudioDevice="Audiogerät"
24
+Buffering="Pufferung"
25
+Buffering.AutoDetect="Automatisch erkennen"
26
+Buffering.Enable="Aktivieren"
27
+Buffering.Disable="Deaktivieren"
28
+Activate="Aktivieren"
29
+Deactivate="Deaktivieren"
30
+
31
+Bitrate="Bitrate"
32
+Encoder.C985="AVerMedia C985 Encoder"
33
+Encoder.C353="AVerMedia C353 Encoder"
34
35
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/el-GR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/el-GR.ini
Changed
23
1
2
ConfigureCrossbar="Ρύθμιση Crossbar"
3
ResFPSType="Τύπος Ανάλυσης/FPS"
4
ResFPSType.Custom="Προσαρμοσμένο"
5
-ResFPSType.DevPreferred="Προτίμηση Συσκευής"
6
+ResFPSType.DevPreferred="Προεπιλεγμένη Συσκευή"
7
FPS.Matching="Ταίριασμα FPS Εξόδου"
8
FPS.Highest="Υψηλότατο FPS"
9
Resolution="Ανάλυση"
10
11
VideoFormat.Unknown="Άγνωστο (%1)"
12
UseCustomAudioDevice="Χρήση προσαρμοσμένης συσκευής ήχου"
13
AudioDevice="Συσκευή Ήχου"
14
+Buffering="Γίνεται φόρτωση"
15
+Buffering.AutoDetect="Αυτόματος εντοπισμός"
16
+Buffering.Enable="Ενεργοποίηση"
17
+Buffering.Disable="Απενεργοποίηση"
18
+Activate="Ενεργοποίηση"
19
+Deactivate="Απενεργοποίηση"
20
+
21
+Bitrate="Ρυθμός μετάδοσης bit"
22
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/en-US.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/en-US.ini
Changed
21
1
2
# video capture device text
3
VideoCaptureDevice="Video Capture Device"
4
Device="Device"
5
+ColorSpace="YUV Color Space"
6
+ColorSpace.Default="Default"
7
+ColorRange="YUV Color Range"
8
+ColorRange.Partial="Partial"
9
+ColorRange.Full="Full"
10
ConfigureAudio="Configure Audio"
11
ConfigureVideo="Configure Video"
12
ConfigureCrossbar="Configure Crossbar"
13
14
15
# encoder text
16
Bitrate="Bitrate"
17
-Encoder.C985="AverMedia C985 Hardware Encoder"
18
-Encoder.C353="AverMedia C353 Hardware Encoder"
19
+Encoder.C985="AVerMedia C985 Encoder"
20
+Encoder.C353="AVerMedia C353 Encoder"
21
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/es-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/es-ES.ini
Changed
23
1
2
ConfigureCrossbar="Configurar la barra fija"
3
ResFPSType="Tipo de resolución/FPS"
4
ResFPSType.Custom="Personalizado"
5
-ResFPSType.DevPreferred="Dispositivo preferido"
6
+ResFPSType.DevPreferred="Dispositivo predeterminado"
7
FPS.Matching="Emparejar los FPS de salida"
8
FPS.Highest="FPS máximos"
9
Resolution="Resolución"
10
11
VideoFormat.Unknown="Desconocido (%1)"
12
UseCustomAudioDevice="Utilizar dispositivo de audio personalizado"
13
AudioDevice="Dispositivo de audio"
14
+Buffering="Almacenando en buffer"
15
+Buffering.AutoDetect="Autodetectar"
16
+Buffering.Enable="Habilitar"
17
+Buffering.Disable="Deshabilitar"
18
+Activate="Activar"
19
+Deactivate="Desactivar"
20
+
21
+Bitrate="Tasa de bits"
22
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/eu-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/eu-ES.ini
Changed
23
1
2
ConfigureCrossbar="Itxuratu Zeharbarra"
3
ResFPSType="Bereizmen/FS-ko Mota"
4
ResFPSType.Custom="Norberea"
5
-ResFPSType.DevPreferred="Hobetsitako Gailua"
6
+ResFPSType.DevPreferred="Berezko Gailua"
7
FPS.Matching="Berdindu Irteerako FS-koa"
8
FPS.Highest="FS-ko Handiena"
9
Resolution="Bereizmena"
10
11
VideoFormat.Unknown="Ezezaguna (%1)"
12
UseCustomAudioDevice="Erabili norbere audio gailua"
13
AudioDevice="Audio Gailua"
14
+Buffering="Bufferrereratzen"
15
+Buffering.AutoDetect="Berez-Atzeman"
16
+Buffering.Enable="Gaitu"
17
+Buffering.Disable="Ezgaitu"
18
+Activate="Gaitu"
19
+Deactivate="Desgaitu"
20
+
21
+Bitrate="Bitneurria"
22
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/fi-FI.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/fi-FI.ini
Changed
14
1
2
VideoFormat.Unknown="Tuntematon (%1)"
3
UseCustomAudioDevice="Käytä mukautettua äänilaitetta"
4
AudioDevice="Äänilaite"
5
+Buffering="Puskurointi"
6
+Buffering.AutoDetect="Automaattinen tunnistus"
7
+Buffering.Enable="Ota käyttöön"
8
+Buffering.Disable="Poista käytöstä"
9
+Activate="Ota käyttöön"
10
+Deactivate="Poista käytöstä"
11
+
12
+Bitrate="Bitrate"
13
14
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/fr-FR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/fr-FR.ini
Changed
32
1
2
VideoCaptureDevice="Périphérique de Capture Vidéo"
3
Device="Appareil"
4
+ColorSpace="Espace de couleur YUV"
5
+ColorSpace.Default="Par défaut"
6
+ColorRange="Gamme de couleurs YUV"
7
+ColorRange.Partial="Partielle"
8
+ColorRange.Full="Complète"
9
ConfigureAudio="Configurer l'audio"
10
ConfigureVideo="Configurer la Vidéo"
11
ConfigureCrossbar="Configurer la Crossbar"
12
ResFPSType="Type de Résolution/FPS"
13
ResFPSType.Custom="Personnalisé"
14
-ResFPSType.DevPreferred="Appareil préféré"
15
+ResFPSType.DevPreferred="Paramètres par défaut du périphérique"
16
FPS.Matching="Associer les FPS Sortants"
17
FPS.Highest="FPS Maximum"
18
Resolution="Résolution"
19
20
VideoFormat.Unknown="Inconnu (%1)"
21
UseCustomAudioDevice="Utiliser un périphérique audio personnalisé"
22
AudioDevice="Périphérique audio"
23
+Buffering="Mise en mémoire tampon"
24
+Buffering.AutoDetect="Détecter automatiquement"
25
+Buffering.Enable="Activer"
26
+Buffering.Disable="Désactiver"
27
+Activate="Activer"
28
+Deactivate="Désactiver"
29
+
30
+Bitrate="Débit"
31
32
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/gl-ES.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/gl-ES.ini
Changed
23
1
2
ConfigureCrossbar="Configurar a barra fixa"
3
ResFPSType="Tipo de resolución/FPS"
4
ResFPSType.Custom="Personalizado"
5
-ResFPSType.DevPreferred="Dispositivo preferido"
6
+ResFPSType.DevPreferred="Dispositivo predefinido"
7
FPS.Matching="Emparellar os FPS de saída"
8
FPS.Highest="FPS máximos"
9
Resolution="Resolución"
10
11
VideoFormat.Unknown="Descoñecido (%1)"
12
UseCustomAudioDevice="Utilizar o dispositivo de audio personalizado"
13
AudioDevice="Dispositivo de audio"
14
+Buffering="Almacenamento no búfer"
15
+Buffering.AutoDetect="Detección automática"
16
+Buffering.Enable="Activar"
17
+Buffering.Disable="Desactivar"
18
+Activate="Activar"
19
+Deactivate="Desactivar"
20
+
21
+Bitrate="Velocidade de bits"
22
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/hr-HR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/hr-HR.ini
Changed
23
1
2
ConfigureCrossbar="Podesi crossbar"
3
ResFPSType="Rezolucija/FPS tip"
4
ResFPSType.Custom="Prilagođeno"
5
-ResFPSType.DevPreferred="Određeno uređajem"
6
+ResFPSType.DevPreferred="Podrazumevano za uređaj"
7
FPS.Matching="Prilagodi izlaznom FPS-u"
8
FPS.Highest="Najviši FPS"
9
Resolution="Rezolucija"
10
11
VideoFormat.Unknown="Nepoznato (%1)"
12
UseCustomAudioDevice="Koristi specifičan uređaj za zvuk"
13
AudioDevice="Uređaj za zvuk"
14
+Buffering="Baferovanje"
15
+Buffering.AutoDetect="Automatsko-otkrivanje"
16
+Buffering.Enable="Omogući"
17
+Buffering.Disable="Onemogući"
18
+Activate="Aktiviraj"
19
+Deactivate="Deaktiviraj"
20
+
21
+Bitrate="Bitrate"
22
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/hu-HU.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/hu-HU.ini
Changed
23
1
2
ConfigureCrossbar="Keresztsor Konfigurálása"
3
ResFPSType="Felbontás/FPS típusa"
4
ResFPSType.Custom="Egyedi"
5
-ResFPSType.DevPreferred="Preferált Eszköz"
6
+ResFPSType.DevPreferred="Alapértelmezett eszköz"
7
FPS.Matching="Kimeneti FPS Megfeleltetés"
8
FPS.Highest="Legmagasabb FPS"
9
Resolution="Felbontás"
10
11
VideoFormat.Unknown="Ismeretlen (%1)"
12
UseCustomAudioDevice="Egyedi Audioeszköz használata"
13
AudioDevice="Audió Eszköz"
14
+Buffering="Pufferelés"
15
+Buffering.AutoDetect="Automatikus felismerés"
16
+Buffering.Enable="Engedélyezés"
17
+Buffering.Disable="Letiltás"
18
+Activate="Aktiválás"
19
+Deactivate="Kikapcsolás"
20
+
21
+Bitrate="Bitráta"
22
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/it-IT.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/it-IT.ini
Changed
14
1
2
ConfigureCrossbar="Configura la crossbar"
3
ResFPSType="Tipo risoluzione/FPS"
4
ResFPSType.Custom="Personalizzato"
5
-ResFPSType.DevPreferred="Dispositivo predefinito"
6
FPS.Matching="Corrispondenza FPS in uscita"
7
FPS.Highest="FPS elevati"
8
Resolution="Risoluzione"
9
10
UseCustomAudioDevice="Usa il dispositivo audio personalizzato"
11
AudioDevice="Dispositivo audio"
12
13
+
14
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/ja-JP.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/ja-JP.ini
Changed
23
1
2
ConfigureCrossbar="クロスバーを構成"
3
ResFPSType="解像度/FPS タイプ"
4
ResFPSType.Custom="カスタム"
5
-ResFPSType.DevPreferred="優先デバイス"
6
+ResFPSType.DevPreferred="デバイスの既定値"
7
FPS.Matching="出力FPSにあわせる"
8
FPS.Highest="最高FPS"
9
Resolution="解像度"
10
11
VideoFormat.Unknown="不明 (%1)"
12
UseCustomAudioDevice="カスタム音声デバイスを使用する"
13
AudioDevice="音声デバイス"
14
+Buffering="バッファリング"
15
+Buffering.AutoDetect="自動検出"
16
+Buffering.Enable=" 有効にする"
17
+Buffering.Disable="無効にする"
18
+Activate="有効化"
19
+Deactivate="無効化"
20
+
21
+Bitrate="ビットレート"
22
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/ko-KR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/ko-KR.ini
Changed
23
1
2
ConfigureCrossbar="크로스바 설정"
3
ResFPSType="해상도/FPS 유형"
4
ResFPSType.Custom="사용자 정의"
5
-ResFPSType.DevPreferred="선호 장치"
6
+ResFPSType.DevPreferred="기본 설정 사용"
7
FPS.Matching="출력FPS에 맞춤"
8
FPS.Highest="최고 FPS"
9
Resolution="해상도"
10
11
VideoFormat.Unknown="알 수 없음 (%1)"
12
UseCustomAudioDevice="사용자 지정 오디오 장치 사용"
13
AudioDevice="오디오 장치"
14
+Buffering="버퍼링"
15
+Buffering.AutoDetect="자동-감지"
16
+Buffering.Enable="사용"
17
+Buffering.Disable="사용 안 함"
18
+Activate="활성화"
19
+Deactivate="비활성화"
20
+
21
+Bitrate="품질(비트레이트)"
22
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/nb-NO.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/nb-NO.ini
Changed
34
1
2
VideoCaptureDevice="Videoopptaksenhet"
3
Device="Enhet"
4
+ColorSpace="YUV fargerom"
5
+ColorSpace.Default="Standard"
6
+ColorRange="YUV fargespekter"
7
+ColorRange.Partial="Delvis"
8
+ColorRange.Full="Full"
9
ConfigureAudio="Konfigurer lyd"
10
ConfigureVideo="Konfigurer video"
11
ConfigureCrossbar="Konfigurer bildemikser"
12
ResFPSType="Oppløsning/bilder per sekund type"
13
ResFPSType.Custom="Egendefinert"
14
-ResFPSType.DevPreferred="Foretrukket enhet"
15
+ResFPSType.DevPreferred="Enhetsstandard"
16
FPS.Matching="Match utgangs bilder per sekund"
17
FPS.Highest="Høyeste antall bilder per sekund"
18
Resolution="Oppløsning"
19
20
VideoFormat.Unknown="Ukjent (%1)"
21
UseCustomAudioDevice="Bruk egendefinert lydenhet"
22
AudioDevice="Lydenhet"
23
+Buffering="Bufring"
24
+Buffering.AutoDetect="Automatisk søk"
25
+Buffering.Enable="Aktiver"
26
+Buffering.Disable="Deaktiver"
27
+Activate="Aktiver"
28
+Deactivate="Deaktiver"
29
+
30
+Bitrate="Bitrate"
31
+Encoder.C985="AVerMedia C985 koder"
32
+Encoder.C353="AVerMedia C353 koder"
33
34
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/nl-NL.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/nl-NL.ini
Changed
23
1
2
ConfigureCrossbar="Crossbar Instellen"
3
ResFPSType="Resolutie/FPS Type"
4
ResFPSType.Custom="Aangepast"
5
-ResFPSType.DevPreferred="Voorkeur van het apparaat"
6
+ResFPSType.DevPreferred="Standaard van apparaat"
7
FPS.Matching="Gelijk aan Uitvoer-FPS"
8
FPS.Highest="Hoogste FPS"
9
Resolution="Resolutie"
10
11
VideoFormat.Unknown="Onbekend (%1)"
12
UseCustomAudioDevice="Gebruik aangepast audioapparaat"
13
AudioDevice="Audioapparaat"
14
+Buffering="Bufferen"
15
+Buffering.AutoDetect="Automatisch detecteren"
16
+Buffering.Enable="Inschakelen"
17
+Buffering.Disable="Uitschakelen"
18
+Activate="Activeren"
19
+Deactivate="Deactiveren"
20
+
21
+Bitrate="Bitrate"
22
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/pl-PL.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/pl-PL.ini
Changed
14
1
2
ConfigureCrossbar="Konfiguruj wejścia"
3
ResFPSType="Rozdzielczość / Tryb FPS"
4
ResFPSType.Custom="Własny"
5
-ResFPSType.DevPreferred="Preferowany przez urządzenie"
6
FPS.Matching="Dopasuj do wyjściowego FPS"
7
FPS.Highest="Najwyższy FPS"
8
Resolution="Rozdzielczość"
9
10
UseCustomAudioDevice="Użyj własnego wyjścia audio"
11
AudioDevice="Urządzenie audio"
12
13
+
14
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/pt-BR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/pt-BR.ini
Changed
14
1
2
ConfigureCrossbar="Configurar Crossbar"
3
ResFPSType="Tipo de Resolução/FPS"
4
ResFPSType.Custom="Personalizado"
5
-ResFPSType.DevPreferred="Dispositivo Padrão"
6
FPS.Matching="Igualar FPS de Saída"
7
FPS.Highest="Maior FPS possível"
8
Resolution="Resolução"
9
10
UseCustomAudioDevice="Utilizar dispositivo de áudio personalizado"
11
AudioDevice="Dispositivo de Áudio"
12
13
+
14
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/pt-PT.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/pt-PT.ini
Changed
14
1
2
ConfigureCrossbar="Configurar Crossbar"
3
ResFPSType="Tipo de Resolução/Quadro"
4
ResFPSType.Custom="Personalizado"
5
-ResFPSType.DevPreferred="Dispositivo preferido"
6
FPS.Matching="Igualar Quadros de Saída"
7
FPS.Highest="Limite de Quadros"
8
Resolution="Resolução"
9
10
VideoFormat.Any="Qualquer"
11
VideoFormat.Unknown="Desconhecido (%1)"
12
13
+
14
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/ro-RO.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/ro-RO.ini
Changed
23
1
2
ConfigureCrossbar="Configuraţi bara transversală"
3
ResFPSType="Tip rezoluție/FPS"
4
ResFPSType.Custom="Personalizat"
5
-ResFPSType.DevPreferred="Dispozitiv Preferat"
6
+ResFPSType.DevPreferred="Dispozitiv implicit"
7
FPS.Matching="Potrivește FPS ieșire"
8
FPS.Highest="Cel mai mare FPS"
9
Resolution="Rezoluţie"
10
11
VideoFormat.Unknown="Necunoscut (%1)"
12
UseCustomAudioDevice="Folosește dispozitivul audio personalizat"
13
AudioDevice="Dispozitiv audio"
14
+Buffering="Buffering"
15
+Buffering.AutoDetect="Detectare automată"
16
+Buffering.Enable="Activează"
17
+Buffering.Disable="Dezactivează"
18
+Activate="Activează"
19
+Deactivate="Dezactivează"
20
+
21
+Bitrate="Bitrate"
22
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/ru-RU.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/ru-RU.ini
Changed
32
1
2
VideoCaptureDevice="Устройство захвата видео"
3
Device="Устройство"
4
+ColorSpace="Цветовое пространство YUV"
5
+ColorSpace.Default="По умолчанию"
6
+ColorRange="Цветовой диапазон YUV"
7
+ColorRange.Partial="Частичный"
8
+ColorRange.Full="Полный"
9
ConfigureAudio="Настроить звук"
10
ConfigureVideo="Настройка видео"
11
ConfigureCrossbar="Настройка кроссбара"
12
ResFPSType="Разрешение/Частота кадров"
13
ResFPSType.Custom="Пользовательское"
14
-ResFPSType.DevPreferred="Рекомендуемое устройством"
15
+ResFPSType.DevPreferred="Стандартные значения устройства"
16
FPS.Matching="Согласовать с выходной частотой кадров"
17
FPS.Highest="Наибольшая частота кадров"
18
Resolution="Разрешение"
19
20
VideoFormat.Unknown="Неизвестный (%1)"
21
UseCustomAudioDevice="Использовать пользовательское аудиоустройство"
22
AudioDevice="Аудиоустройство"
23
+Buffering="Буферизация"
24
+Buffering.AutoDetect="Авто-обнаружение"
25
+Buffering.Enable="Включить"
26
+Buffering.Disable="Отключить"
27
+Activate="Активировать"
28
+Deactivate="Деактивировать"
29
+
30
+Bitrate="Битрейт"
31
32
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/sk-SK.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/sk-SK.ini
Changed
6
1
2
UseCustomAudioDevice="Použiť vlastné audio zariadenie"
3
AudioDevice="Audio zariadenie"
4
5
+
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/sl-SI.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/sl-SI.ini
Changed
14
1
2
ConfigureCrossbar="Konfiguriranje stičišče vratnice in prečke"
3
ResFPSType="Vrsta Resolucije/FPS"
4
ResFPSType.Custom="Po meri"
5
-ResFPSType.DevPreferred="Po izbiri naprave"
6
FPS.Matching="Usklajaj se z Izhodnim FPS"
7
FPS.Highest="Najvišji FPS"
8
Resolution="Resolucija"
9
10
UseCustomAudioDevice="Uporabi zvočno napravo po meri"
11
AudioDevice="Zvočna naprava"
12
13
+
14
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/sr-CS.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/sr-CS.ini
Changed
23
1
2
ConfigureCrossbar="Podesi crossbar"
3
ResFPSType="Rezolucija/FPS tip"
4
ResFPSType.Custom="Prilagođeno"
5
-ResFPSType.DevPreferred="Određeno uređajem"
6
+ResFPSType.DevPreferred="Podrazumevano za uređaj"
7
FPS.Matching="Prilagodi izlaznom FPS-u"
8
FPS.Highest="Najviši FPS"
9
Resolution="Rezolucija"
10
11
VideoFormat.Unknown="Nepoznato (%1)"
12
UseCustomAudioDevice="Koristi specifičan uređaj za zvuk"
13
AudioDevice="Uređaj za zvuk"
14
+Buffering="Baferovanje"
15
+Buffering.AutoDetect="Automatsko-otkrivanje"
16
+Buffering.Enable="Omogući"
17
+Buffering.Disable="Onemogući"
18
+Activate="Aktiviraj"
19
+Deactivate="Deaktiviraj"
20
+
21
+Bitrate="Bitrate"
22
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/sr-SP.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/sr-SP.ini
Changed
23
1
2
ConfigureCrossbar="Подеси crossbar"
3
ResFPSType="Резолуција/FPS тип"
4
ResFPSType.Custom="Прилагођено"
5
-ResFPSType.DevPreferred="Одређено уређајем"
6
+ResFPSType.DevPreferred="Подразумевано за уређај"
7
FPS.Matching="Прилагоди излазном FPS-у"
8
FPS.Highest="Највиши FPS"
9
Resolution="Резолуција"
10
11
VideoFormat.Unknown="Непознато (%1)"
12
UseCustomAudioDevice="Користи специфичан уређај за звук"
13
AudioDevice="Уређај за звук"
14
+Buffering="Баферовање"
15
+Buffering.AutoDetect="Аутоматско-откривање"
16
+Buffering.Enable="Омогући"
17
+Buffering.Disable="Онемогући"
18
+Activate="Активирај"
19
+Deactivate="Деактивирај"
20
+
21
+Bitrate="Bitrate"
22
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/sv-SE.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/sv-SE.ini
Changed
23
1
2
ConfigureCrossbar="Öppna Crossbar"
3
ResFPSType="Val av upplösning och bildhastighet"
4
ResFPSType.Custom="Anpassad"
5
-ResFPSType.DevPreferred="Förslag från enhet"
6
+ResFPSType.DevPreferred="Enhetsstandard"
7
FPS.Matching="Matcha utmatningsbildhastighet"
8
FPS.Highest="Högsta tillgängliga bildhastighet"
9
Resolution="Upplösning"
10
11
VideoFormat.Unknown="Okänd (%1)"
12
UseCustomAudioDevice="Använd anpassad ljudenhet"
13
AudioDevice="Ljudenhet"
14
+Buffering="Buffrar"
15
+Buffering.AutoDetect="Upptäck automatiskt"
16
+Buffering.Enable="Aktivera"
17
+Buffering.Disable="Avaktivera"
18
+Activate="Aktivera"
19
+Deactivate="Inaktivera"
20
+
21
+Bitrate="Bithastighet"
22
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/th-TH.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/th-TH.ini
Changed
6
1
2
Resolution="ความละเอียด"
3
VideoFormat="ฟอร์แมทวีดีโอ"
4
5
+
6
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/tr-TR.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/tr-TR.ini
Changed
14
1
2
ConfigureCrossbar="Crossbarı Ayarla"
3
ResFPSType="Çözünürlük/FPS Türü"
4
ResFPSType.Custom="Özel"
5
-ResFPSType.DevPreferred="Tercih Edilen Aygıt"
6
FPS.Matching="Çıkış FPS'ini Eşleştir"
7
FPS.Highest="En Yüksek FPS"
8
Resolution="Çözünürlük"
9
10
UseCustomAudioDevice="Özel ses aygıtını kullan"
11
AudioDevice="Ses Aygıtı"
12
13
+
14
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/zh-CN.ini
Added
34
1
2
+VideoCaptureDevice="视频捕获设备"
3
+Device="设备"
4
+ColorSpace="YUV 颜色空间"
5
+ColorSpace.Default="默认"
6
+ColorRange="YUV 颜色范围"
7
+ColorRange.Partial="局部"
8
+ColorRange.Full="全部"
9
+ConfigureAudio="配置音频"
10
+ConfigureVideo="配置视频"
11
+ConfigureCrossbar="配置Crossbar"
12
+ResFPSType="分辨率/帧率 类型"
13
+ResFPSType.Custom="自定义"
14
+ResFPSType.DevPreferred="设备默认"
15
+FPS.Matching="匹配输出帧率"
16
+FPS.Highest="最高帧率"
17
+Resolution="分辨率"
18
+VideoFormat="视频格式"
19
+VideoFormat.Any="任意"
20
+VideoFormat.Unknown="未知(%1)"
21
+UseCustomAudioDevice="使用自定义的音频设备"
22
+AudioDevice="音频设备"
23
+Buffering="正在缓冲"
24
+Buffering.AutoDetect="自动检测"
25
+Buffering.Enable="启用"
26
+Buffering.Disable="停用"
27
+Activate="激活"
28
+Deactivate="取消激活"
29
+
30
+Bitrate="比特率"
31
+Encoder.C985="AVerMedia C985 编码器"
32
+Encoder.C353="AVerMedia C353编码器"
33
+
34
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/data/locale/zh-TW.ini -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/data/locale/zh-TW.ini
Changed
14
1
2
ConfigureCrossbar="設定影像格式"
3
ResFPSType="解析度/FPS 類型"
4
ResFPSType.Custom="自訂"
5
-ResFPSType.DevPreferred="裝置建議值"
6
FPS.Matching="符合輸出 FPS"
7
FPS.Highest="最大化 FPS"
8
Resolution="解析度"
9
10
VideoFormat.Any="任何格式"
11
VideoFormat.Unknown="未知 (%1)"
12
13
+
14
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/ffmpeg-decode.c -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/ffmpeg-decode.c
Changed
23
1
2
packet.size = (int)size;
3
4
if (!decode->frame) {
5
- decode->frame = avcodec_alloc_frame();
6
+ decode->frame = av_frame_alloc();
7
if (!decode->frame)
8
return -1;
9
- } else {
10
- avcodec_get_frame_defaults(decode->frame);
11
}
12
13
len = avcodec_decode_audio4(decode->decoder, decode->frame, &got_frame,
14
15
packet.flags |= AV_PKT_FLAG_KEY;
16
17
if (!decode->frame) {
18
- decode->frame = avcodec_alloc_frame();
19
+ decode->frame = av_frame_alloc();
20
if (!decode->frame)
21
return -1;
22
}
23
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/ffmpeg-decode.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/ffmpeg-decode.h
Changed
19
1
2
3
#include <obs.h>
4
5
-#ifdef _WIN32
6
+#ifdef _MSC_VER
7
#pragma warning(push)
8
#pragma warning(disable : 4244)
9
#pragma warning(disable : 4204)
10
11
#include <libavcodec/avcodec.h>
12
#include <libavutil/log.h>
13
14
-#ifdef _WIN32
15
+#ifdef _MSC_VER
16
#pragma warning(pop)
17
#endif
18
19
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/dshowcapture.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/dshowcapture.hpp
Changed
10
1
2
3
#define DSHOWCAPTURE_VERSION_MAJOR 0
4
#define DSHOWCAPTURE_VERSION_MINOR 4
5
-#define DSHOWCAPTURE_VERSION_PATCH 2
6
+#define DSHOWCAPTURE_VERSION_PATCH 3
7
8
#define MAKE_DSHOWCAPTURE_VERSION(major, minor, patch) \
9
( (major << 24) | \
10
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/ComPtr.hpp
Added
138
1
2
+/*
3
+ * Copyright (c) 2013 Hugh Bailey <obs.jim@gmail.com>
4
+ *
5
+ * Permission to use, copy, modify, and distribute this software for any
6
+ * purpose with or without fee is hereby granted, provided that the above
7
+ * copyright notice and this permission notice appear in all copies.
8
+ *
9
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16
+ */
17
+
18
+#pragma once
19
+
20
+/* Oh no I have my own com pointer class, the world is ending, how dare you
21
+ * write your own! */
22
+
23
+template<class T> class ComPtr {
24
+
25
+protected:
26
+ T *ptr;
27
+
28
+ inline void Kill()
29
+ {
30
+ if (ptr)
31
+ ptr->Release();
32
+ }
33
+
34
+ inline void Replace(T *p)
35
+ {
36
+ if (ptr != p) {
37
+ if (p) p->AddRef();
38
+ if (ptr) ptr->Release();
39
+ ptr = p;
40
+ }
41
+ }
42
+
43
+public:
44
+ inline ComPtr() : ptr(NULL) {}
45
+ inline ComPtr(T *p) : ptr(p) {if (ptr) ptr->AddRef();}
46
+ inline ComPtr(const ComPtr<T> &c) : ptr(c.ptr) {if (ptr) ptr->AddRef();}
47
+ inline ComPtr(ComPtr<T> &&c) : ptr(c.ptr) {c.ptr = NULL;}
48
+ inline ~ComPtr() {Kill();}
49
+
50
+ inline void Clear()
51
+ {
52
+ if (ptr) {
53
+ ptr->Release();
54
+ ptr = NULL;
55
+ }
56
+ }
57
+
58
+ inline ComPtr<T> &operator=(T *p)
59
+ {
60
+ Replace(p);
61
+ return *this;
62
+ }
63
+
64
+ inline ComPtr<T> &operator=(const ComPtr<T> &c)
65
+ {
66
+ Replace(c.ptr);
67
+ return *this;
68
+ }
69
+
70
+ inline ComPtr<T> &operator=(ComPtr<T> &&c)
71
+ {
72
+ if (this != &c) {
73
+ Kill();
74
+ ptr = c.ptr;
75
+ c.ptr = NULL;
76
+ }
77
+
78
+ return *this;
79
+ }
80
+
81
+ inline T *Detach()
82
+ {
83
+ T *out = ptr;
84
+ ptr = nullptr;
85
+ return out;
86
+ }
87
+
88
+ inline void CopyTo(T **out)
89
+ {
90
+ if (out) {
91
+ if (ptr) ptr->AddRef();
92
+ *out = ptr;
93
+ }
94
+ }
95
+
96
+ inline ULONG Release()
97
+ {
98
+ ULONG ref;
99
+
100
+ if (!ptr) return 0;
101
+ ref = ptr->Release();
102
+ ptr = nullptr;
103
+ return ref;
104
+ }
105
+
106
+ inline T **Assign() {Clear(); return &ptr;}
107
+ inline void Set(T *p) {Kill(); ptr = p;}
108
+
109
+ inline T *Get() const {return ptr;}
110
+
111
+ inline T **operator&() {return Assign();}
112
+
113
+ inline operator T*() const {return ptr;}
114
+ inline T *operator->() const {return ptr;}
115
+
116
+ inline bool operator==(T *p) const {return ptr == p;}
117
+ inline bool operator!=(T *p) const {return ptr != p;}
118
+
119
+ inline bool operator!() const {return !ptr;}
120
+};
121
+
122
+template<class T> class ComQIPtr : public ComPtr<T> {
123
+
124
+public:
125
+ inline ComQIPtr(IUnknown *unk)
126
+ {
127
+ this->ptr = nullptr;
128
+ unk->QueryInterface(__uuidof(T), (void**)&this->ptr);
129
+ }
130
+
131
+ inline ComPtr<T> &operator=(IUnknown *unk)
132
+ {
133
+ ComPtr<T>::Clear();
134
+ unk->QueryInterface(__uuidof(T), (void**)&this->ptr);
135
+ return *this;
136
+ }
137
+};
138
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/IVideoCaptureFilter.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/IVideoCaptureFilter.h
Changed
109
1
2
=============================================================================*/
3
4
//! Video Capture device type
5
-typedef enum VIDEO_CAPTURE_FILTER_DEVICE_TYPE
6
+enum VIDEO_CAPTURE_FILTER_DEVICE_TYPE
7
{
8
VIDEO_CAPTURE_FILTER_DEVICE_TYPE_INVALID = 0, //!< Invalid
9
VIDEO_CAPTURE_FILTER_DEVICE_TYPE_GAME_CAPTURE_HD = 2, //!< Game Capture HD (VID: 0x0fd9 PID: 0x0044, 0x004e, 0x0051)
10
11
};
12
13
//! Input device
14
-typedef enum VIDEO_CAPTURE_FILTER_INPUT_DEVICE
15
+enum VIDEO_CAPTURE_FILTER_INPUT_DEVICE
16
{
17
VIDEO_CAPTURE_FILTER_INPUT_DEVICE_INVALID = 0, //!< Invalid
18
VIDEO_CAPTURE_FILTER_INPUT_DEVICE_XBOX360 = 1, //!< Microsoft Xbox 360
19
20
};
21
22
//! Video inputs
23
-typedef enum VIDEO_CAPTURE_FILTER_VIDEO_INPUT
24
+enum VIDEO_CAPTURE_FILTER_VIDEO_INPUT
25
{
26
VIDEO_CAPTURE_FILTER_VIDEO_INPUT_INVALID = 0, //!< Invalid
27
VIDEO_CAPTURE_FILTER_VIDEO_INPUT_COMPOSITE = 1, //!< Composite
28
29
};
30
31
//! Video encoder profile
32
-typedef enum VIDEO_CAPTURE_FILTER_VID_ENC_PROFILE
33
+enum VIDEO_CAPTURE_FILTER_VID_ENC_PROFILE
34
{
35
VIDEO_CAPTURE_FILTER_VID_ENC_PROFILE_INVALID = 0x00000000, //!< Invalid
36
VIDEO_CAPTURE_FILTER_VID_ENC_PROFILE_240 = 0x00000001, //!< 320x240
37
38
};
39
40
//! Color range
41
-typedef enum VIDEO_CAPTURE_FILTER_COLOR_RANGE
42
+enum VIDEO_CAPTURE_FILTER_COLOR_RANGE
43
{
44
VIDEO_CAPTURE_FILTER_COLOR_RANGE_INVALID = 0, //!< Invalid
45
VIDEO_CAPTURE_FILTER_COLOR_RANGE_FULL = 1, //!< 0-255
46
47
};
48
49
//! Settings
50
-typedef struct _VIDEO_CAPTURE_FILTER_SETTINGS
51
+struct VIDEO_CAPTURE_FILTER_SETTINGS
52
{
53
TCHAR deviceName[256]; //!< Device name (get only)
54
VIDEO_CAPTURE_FILTER_INPUT_DEVICE inputDevice; //!< Input device (e.g. Xbox360)
55
56
int digitalAudioGain; //!< Digital audio gain (-60 - 12 dB)
57
BOOL preserveInputFormat; //!< Input Format will be preserved (e.g. do not convert interlaced to progressive)
58
BOOL stretchStandardDefinitionInput; //!< Stretch SD input to 16:9
59
-}VIDEO_CAPTURE_FILTER_SETTINGS, *PVIDEO_CAPTURE_FILTER_SETTINGS;
60
-typedef const VIDEO_CAPTURE_FILTER_SETTINGS* PCVIDEO_CAPTURE_FILTER_SETTINGS;
61
+};
62
63
//! Interface
64
DECLARE_INTERFACE_(IElgatoVideoCaptureFilter2, IElgatoVideoCaptureFilter)
65
{
66
// Get current settings
67
- STDMETHOD(GetSettings)(THIS_ PVIDEO_CAPTURE_FILTER_SETTINGS pSettings) PURE;
68
+ STDMETHOD(GetSettings)(THIS_ VIDEO_CAPTURE_FILTER_SETTINGS *pSettings) PURE;
69
70
// Set settings
71
- STDMETHOD(SetSettings)(THIS_ PCVIDEO_CAPTURE_FILTER_SETTINGS pcSettings) PURE;
72
+ STDMETHOD(SetSettings)(THIS_ const VIDEO_CAPTURE_FILTER_SETTINGS *pcSettings) PURE;
73
};
74
75
/*=============================================================================
76
77
=============================================================================*/
78
79
//! Messages
80
-typedef enum VIDEO_CAPTURE_FILTER_NOTIFICATION
81
+enum VIDEO_CAPTURE_FILTER_NOTIFICATION
82
{
83
//! Description: Delay of the device has changed. Call GetDelayMs() to get the new delay.
84
VIDEO_CAPTURE_FILTER_NOTIFICATION_DEVICE_DELAY_CHANGED = 110, //!< Data: none
85
86
=============================================================================*/
87
88
//! Extended Settings
89
-typedef struct _VIDEO_CAPTURE_FILTER_SETTINGS_EX
90
+struct VIDEO_CAPTURE_FILTER_SETTINGS_EX
91
{
92
VIDEO_CAPTURE_FILTER_SETTINGS Settings;
93
BOOL enableFullFrameRate; //!< Enable full frame rate (50/60 fps)
94
BYTE reserved[20 * 1024];
95
-}VIDEO_CAPTURE_FILTER_SETTINGS_EX, *PVIDEO_CAPTURE_FILTER_SETTINGS_EX;
96
-typedef const VIDEO_CAPTURE_FILTER_SETTINGS_EX* PCVIDEO_CAPTURE_FILTER_SETTINGS_EX;
97
+};
98
99
DECLARE_INTERFACE_(IElgatoVideoCaptureFilter5, IElgatoVideoCaptureFilter4)
100
{
101
//! Get current settings
102
- STDMETHOD(GetSettingsEx)(THIS_ PVIDEO_CAPTURE_FILTER_SETTINGS_EX pSettings) PURE;
103
+ STDMETHOD(GetSettingsEx)(THIS_ VIDEO_CAPTURE_FILTER_SETTINGS_EX *pSettings) PURE;
104
105
//! Set settings
106
- STDMETHOD(SetSettingsEx)(THIS_ PCVIDEO_CAPTURE_FILTER_SETTINGS_EX pcSettings) PURE;
107
+ STDMETHOD(SetSettingsEx)(THIS_ const VIDEO_CAPTURE_FILTER_SETTINGS_EX *pcSettings) PURE;
108
};
109
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/avermedia-encode.h -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/avermedia-encode.h
Changed
73
1
2
-///////////////////////////////////////////////////////////////////////////////
3
-//
4
-// Copyright (c) 2014 AVerMedia Inc.
5
-// All rights reserved.
6
-//
7
-// Description:
8
-// This property is provide to 3rd party AP to use our HW encode function.
9
-//
10
-///////////////////////////////////////////////////////////////////////////////
11
-
12
+/*
13
+ * aver_prophwencode.h -- This header filer is provide to 3rd party AP
14
+ * to use the HW encode function of AVerMedia.
15
+ *
16
+ * Copyright (C) 2014 AVerMedia TECHNOLOGIES, Inc.
17
+ *
18
+ * Authors: Morris Pan, AVerMedia TECHNOLOGIES, Inc. <morris.pan@avermedia.com>
19
+ *
20
+ * This content is released under the MIT License
21
+ * (http://opensource.org/licenses/MIT).
22
+ *
23
+ */
24
#pragma once
25
26
static const GUID AVER_HW_ENCODE_PROPERTY =
27
{0x1bd55918, 0xbaf5, 0x4781, {0x8d, 0x76, 0xe0, 0xa0, 0xa5, 0xe1, 0xd2, 0xb8}};
28
29
enum {
30
+ // @brief PropertySet Enumeration
31
+ // param AVER_PARAMETERS
32
PROPERTY_HW_ENCODE_PARAMETER = 0
33
};
34
35
enum {
36
+ // property to set/get the encode frame rate
37
+ // ulParam1 = Frames per second
38
AVER_PARAMETER_ENCODE_FRAME_RATE = 0,
39
+
40
+ // property to set/get the encode bit rate
41
+ // ulParam1 = Bitrate (kb/s)
42
AVER_PARAMETER_ENCODE_BIT_RATE = 1,
43
+
44
+ // property to get the output resolution
45
+ // ulParam1 = Resolution width
46
+ // ulParam2 = Resolution height
47
AVER_PARAMETER_CURRENT_RESOLUTION = 2,
48
+
49
+ // property to set the output resolution
50
+ // ulParam1 = Resolution width
51
+ // ulParam2 = Resolution height
52
AVER_PARAMETER_ENCODE_RESOLUTION = 3,
53
+
54
+ // property to set/get the encode GOP
55
+ // ulParam1 = GOP length
56
AVER_PARAMETER_ENCODE_GOP = 4,
57
+
58
+ // property to insert an I frame to the encoded stream
59
AVER_PARAMETER_INSERT_I_FRAME = 6
60
};
61
62
struct AVER_PARAMETERS {
63
+ // @brief Use the PROPERTY_PARAMETER Property to Get or Set the
64
+ // Device Parameter.
65
+ //
66
+ // param ulIndex Parameter Index (AVER_PARAMETER_*)
67
+ // param ulParam1 Parameter 1 (if any)
68
+ // param ulParam2 Parameter 2 (if any)
69
+ // param ulParam3 Parameter 3 (if any)
70
ULONG ulIndex;
71
ULONG ulParam1;
72
ULONG ulParam2;
73
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/capture-filter.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/capture-filter.cpp
Changed
78
1
2
connectedMediaType->majortype = info.expectedMajorType;
3
}
4
5
+CapturePin::~CapturePin()
6
+{
7
+}
8
+
9
STDMETHODIMP CapturePin::QueryInterface(REFIID riid, void **ppv)
10
{
11
if (riid == IID_IUnknown) {
12
13
return NOERROR;
14
}
15
16
+#define CAPTURE_PIN_NAME L"Capture Pin"
17
+
18
STDMETHODIMP CapturePin::QueryId(LPWSTR *lpId)
19
{
20
- *lpId = L"Capture Pin";
21
+ wchar_t *str = (wchar_t*)CoTaskMemAlloc(sizeof(CAPTURE_PIN_NAME));
22
+ memcpy(str, CAPTURE_PIN_NAME, sizeof(CAPTURE_PIN_NAME));
23
+ *lpId = str;
24
return S_OK;
25
}
26
27
28
29
public:
30
inline MiscFlagsHandler() {}
31
+ virtual ~MiscFlagsHandler() {}
32
33
STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
34
{
35
36
{
37
}
38
39
+CaptureFilter::~CaptureFilter()
40
+{
41
+}
42
+
43
// IUnknown methods
44
STDMETHODIMP CaptureFilter::QueryInterface(REFIID riid, void **ppv)
45
{
46
47
// ============================================================================
48
49
CaptureEnumPins::CaptureEnumPins(CaptureFilter *filter_, CaptureEnumPins *pEnum)
50
- : filter (filter_),
51
- refCount (1)
52
+ : filter (filter_)
53
{
54
curPin = (pEnum != nullptr) ? pEnum->curPin : 0;
55
}
56
57
+CaptureEnumPins::~CaptureEnumPins()
58
+{
59
+}
60
+
61
// IUnknown
62
STDMETHODIMP CaptureEnumPins::QueryInterface(REFIID riid, void **ppv)
63
{
64
65
// ============================================================================
66
67
CaptureEnumMediaTypes::CaptureEnumMediaTypes(CapturePin *pin_)
68
- : pin (pin_),
69
- refCount (1)
70
+ : pin (pin_)
71
+{
72
+}
73
+
74
+CaptureEnumMediaTypes::~CaptureEnumMediaTypes()
75
{
76
}
77
78
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/capture-filter.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/capture-filter.hpp
Changed
68
1
2
volatile long refCount;
3
4
PinCaptureInfo captureInfo;
5
- CComPtr<IPin> connectedPin;
6
+ ComPtr<IPin> connectedPin;
7
CaptureFilter *filter;
8
MediaType connectedMediaType;
9
volatile bool flushing = false;
10
11
12
public:
13
CapturePin(CaptureFilter *filter, const PinCaptureInfo &info);
14
+ virtual ~CapturePin();
15
16
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
17
STDMETHODIMP_(ULONG) AddRef();
18
19
20
volatile long refCount;
21
FILTER_STATE state;
22
- CComPtr<IFilterGraph> graph;
23
- CComPtr<CapturePin> pin;
24
+ ComPtr<IFilterGraph> graph;
25
+ ComPtr<CapturePin> pin;
26
27
- CComPtr<IAMFilterMiscFlags> misc;
28
+ ComPtr<IAMFilterMiscFlags> misc;
29
30
public:
31
CaptureFilter(const PinCaptureInfo &info);
32
+ virtual ~CaptureFilter();
33
34
// IUnknown methods
35
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
36
37
};
38
39
class CaptureEnumPins : public IEnumPins {
40
- volatile long refCount;
41
- CComPtr<CaptureFilter> filter;
42
+ volatile long refCount = 1;
43
+ ComPtr<CaptureFilter> filter;
44
UINT curPin;
45
46
public:
47
CaptureEnumPins(CaptureFilter *filter, CaptureEnumPins *pEnum);
48
+ virtual ~CaptureEnumPins();
49
50
// IUnknown
51
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
52
53
};
54
55
class CaptureEnumMediaTypes : public IEnumMediaTypes {
56
- volatile long refCount;
57
- CComPtr<CapturePin> pin;
58
+ volatile long refCount = 1;
59
+ ComPtr<CapturePin> pin;
60
UINT curMT = 0;
61
62
public:
63
CaptureEnumMediaTypes(CapturePin *pin);
64
+ virtual ~CaptureEnumMediaTypes();
65
66
// IUnknown
67
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
68
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/device.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/device.cpp
Changed
124
1
2
bool HDevice::SetupExceptionVideoCapture(IBaseFilter *filter,
3
VideoConfig &config)
4
{
5
- CComPtr<IPin> pin;
6
+ ComPtr<IPin> pin;
7
8
if (GetPinByName(filter, PINDIR_OUTPUT, L"656", &pin))
9
return SetupEncodedVideoCapture(filter, config, HD_PVR2);
10
11
12
static bool GetPinMediaType(IPin *pin, MediaType &mt)
13
{
14
- CComPtr<IEnumMediaTypes> mediaTypes;
15
+ ComPtr<IEnumMediaTypes> mediaTypes;
16
17
if (SUCCEEDED(pin->EnumMediaTypes(&mediaTypes))) {
18
MediaTypePtr curMT;
19
20
21
bool HDevice::SetupVideoCapture(IBaseFilter *filter, VideoConfig &config)
22
{
23
- CComPtr<IPin> pin;
24
+ ComPtr<IPin> pin;
25
HRESULT hr;
26
bool success;
27
28
29
}
30
}
31
32
- CComQIPtr<IAMStreamConfig> pinConfig(pin);
33
+ ComQIPtr<IAMStreamConfig> pinConfig(pin);
34
if (pinConfig == NULL) {
35
Error(L"Could not get IAMStreamConfig for device");
36
return false;
37
38
39
bool HDevice::SetVideoConfig(VideoConfig *config)
40
{
41
- CComPtr<IBaseFilter> filter;
42
+ ComPtr<IBaseFilter> filter;
43
44
if (!EnsureInitialized(L"SetVideoConfig") ||
45
!EnsureInactive(L"SetVideoConfig"))
46
47
48
bool HDevice::SetupExceptionAudioCapture(IPin *pin)
49
{
50
- CComPtr<IEnumMediaTypes> enumMediaTypes;
51
+ ComPtr<IEnumMediaTypes> enumMediaTypes;
52
ULONG count = 0;
53
HRESULT hr;
54
MediaTypePtr mt;
55
56
57
bool HDevice::SetupAudioCapture(IBaseFilter *filter, AudioConfig &config)
58
{
59
- CComPtr<IPin> pin;
60
+ ComPtr<IPin> pin;
61
MediaTypePtr defaultMT;
62
bool success;
63
HRESULT hr;
64
65
return false;
66
}
67
68
- CComQIPtr<IAMStreamConfig> pinConfig(pin);
69
+ ComQIPtr<IAMStreamConfig> pinConfig(pin);
70
71
if (config.useDefaultConfig) {
72
MediaTypePtr defaultMT;
73
74
75
bool HDevice::SetAudioConfig(AudioConfig *config)
76
{
77
- CComPtr<IBaseFilter> filter;
78
+ ComPtr<IBaseFilter> filter;
79
80
if (!EnsureInitialized(L"SetAudioConfig") ||
81
!EnsureInactive(L"SetAudioConfig"))
82
83
config->name.c_str(), config->path.c_str(),
84
&filter);
85
if (!success) {
86
- Error(L"Audio device '%s': %s not found", config->name,
87
- config->path);
88
+ Error(L"Audio device '%s': %s not found", config->name.c_str(),
89
+ config->path.c_str());
90
return false;
91
}
92
}
93
94
IBaseFilter *filter, CaptureFilter *capture)
95
{
96
HRESULT hr;
97
- CComPtr<IPin> filterPin;
98
+ ComPtr<IPin> filterPin;
99
100
if (!EnsureInitialized(L"HDevice::ConnectPins") ||
101
!EnsureInactive(L"HDevice::ConnectPins"))
102
103
104
void HDevice::DisconnectFilters()
105
{
106
- CComPtr<IEnumFilters> filterEnum;
107
+ ComPtr<IEnumFilters> filterEnum;
108
HRESULT hr;
109
110
if (!graph)
111
112
if (FAILED(hr))
113
return;
114
115
- CComPtr<IBaseFilter> filter;
116
+ ComPtr<IBaseFilter> filter;
117
while (filterEnum->Next(1, &filter, nullptr) == S_OK) {
118
graph->RemoveFilter(filter);
119
filterEnum->Reset();
120
- filter.Release();
121
}
122
}
123
124
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/device.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/device.hpp
Changed
26
1
2
};
3
4
struct HDevice {
5
- CComPtr<IGraphBuilder> graph;
6
- CComPtr<ICaptureGraphBuilder2> builder;
7
- CComPtr<IMediaControl> control;
8
-
9
- CComPtr<IBaseFilter> videoFilter;
10
- CComPtr<IBaseFilter> audioFilter;
11
- CComPtr<CaptureFilter> videoCapture;
12
- CComPtr<CaptureFilter> audioCapture;
13
- CComPtr<IBaseFilter> rocketEncoder;
14
+ ComPtr<IGraphBuilder> graph;
15
+ ComPtr<ICaptureGraphBuilder2> builder;
16
+ ComPtr<IMediaControl> control;
17
+
18
+ ComPtr<IBaseFilter> videoFilter;
19
+ ComPtr<IBaseFilter> audioFilter;
20
+ ComPtr<CaptureFilter> videoCapture;
21
+ ComPtr<CaptureFilter> audioCapture;
22
+ ComPtr<IBaseFilter> rocketEncoder;
23
MediaType videoMediaType;
24
MediaType audioMediaType;
25
VideoConfig videoConfig;
26
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/dshow-base.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/dshow-base.cpp
Changed
231
1
2
bool CreateFilterGraph(IGraphBuilder **pgraph, ICaptureGraphBuilder2 **pbuilder,
3
IMediaControl **pcontrol)
4
{
5
- CComPtr<IGraphBuilder> graph;
6
- CComPtr<ICaptureGraphBuilder2> builder;
7
- CComPtr<IMediaControl> control;
8
+ ComPtr<IGraphBuilder> graph;
9
+ ComPtr<ICaptureGraphBuilder2> builder;
10
+ ComPtr<IMediaControl> control;
11
HRESULT hr;
12
13
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
14
15
16
void LogFilters(IGraphBuilder *graph)
17
{
18
- CComPtr<IEnumFilters> filterEnum;
19
- CComPtr<IBaseFilter> filter;
20
+ ComPtr<IEnumFilters> filterEnum;
21
+ ComPtr<IBaseFilter> filter;
22
HRESULT hr;
23
24
hr = graph->EnumFilters(&filterEnum);
25
26
27
Debug(L"\t%s", filterInfo.achName);
28
}
29
-
30
- filter.Release();
31
}
32
}
33
34
struct DeviceFilterCallbackInfo {
35
- CComPtr<IBaseFilter> filter;
36
+ ComPtr<IBaseFilter> filter;
37
const wchar_t *name;
38
const wchar_t *path;
39
};
40
41
static bool PinConfigHasMajorType(IPin *pin, const GUID &type)
42
{
43
HRESULT hr;
44
- CComPtr<IAMStreamConfig> config;
45
+ ComPtr<IAMStreamConfig> config;
46
int count, size;
47
48
hr = pin->QueryInterface(IID_IAMStreamConfig, (void**)&config);
49
50
{
51
HRESULT hr;
52
MediaTypePtr mt;
53
- CComPtr<IEnumMediaTypes> mediaEnum;
54
+ ComPtr<IEnumMediaTypes> mediaEnum;
55
56
/* first, check the config caps. */
57
if (PinConfigHasMajorType(pin, type))
58
59
if (!pin)
60
return E_POINTER;
61
62
- CComQIPtr<IKsPropertySet> propertySet(pin);
63
+ ComQIPtr<IKsPropertySet> propertySet(pin);
64
DWORD size;
65
66
if (propertySet == NULL)
67
68
bool GetFilterPin(IBaseFilter *filter, const GUID &type, const GUID &category,
69
PIN_DIRECTION dir, IPin **pin)
70
{
71
- CComPtr<IPin> curPin;
72
- CComPtr<IEnumPins> pinsEnum;
73
+ ComPtr<IPin> curPin;
74
+ ComPtr<IEnumPins> pinsEnum;
75
ULONG num;
76
77
if (!filter)
78
79
(*pin)->AddRef();
80
return true;
81
}
82
-
83
- curPin.Release();
84
}
85
86
return false;
87
88
bool GetPinByName(IBaseFilter *filter, PIN_DIRECTION dir, const wchar_t *name,
89
IPin **pin)
90
{
91
- CComPtr<IPin> curPin;
92
- CComPtr<IEnumPins> pinsEnum;
93
+ ComPtr<IPin> curPin;
94
+ ComPtr<IEnumPins> pinsEnum;
95
ULONG num;
96
97
if (!filter)
98
99
*pin = curPin.Detach();
100
return true;
101
}
102
-
103
- curPin.Release();
104
}
105
106
return false;
107
108
109
bool GetPinByMedium(IBaseFilter *filter, REGPINMEDIUM &medium, IPin **pin)
110
{
111
- CComPtr<IPin> curPin;
112
- CComPtr<IEnumPins> pinsEnum;
113
+ ComPtr<IPin> curPin;
114
+ ComPtr<IEnumPins> pinsEnum;
115
ULONG num;
116
117
if (!filter)
118
119
*pin = curPin.Detach();
120
return true;
121
}
122
-
123
- curPin.Release();
124
}
125
126
return false;
127
128
static bool GetFilterByMediumFromMoniker(IMoniker *moniker,
129
REGPINMEDIUM &medium, IBaseFilter **filter)
130
{
131
- CComPtr<IBaseFilter> curFilter;
132
+ ComPtr<IBaseFilter> curFilter;
133
HRESULT hr;
134
135
hr = moniker->BindToObject(nullptr, nullptr, IID_IBaseFilter,
136
(void**)&curFilter);
137
if (SUCCEEDED(hr)) {
138
- CComPtr<IPin> pin;
139
+ ComPtr<IPin> pin;
140
if (GetPinByMedium(curFilter, medium, &pin)) {
141
*filter = curFilter.Detach();
142
return true;
143
144
bool GetFilterByMedium(const CLSID &id, REGPINMEDIUM &medium,
145
IBaseFilter **filter)
146
{
147
- CComPtr<ICreateDevEnum> deviceEnum;
148
- CComPtr<IEnumMoniker> enumMoniker;
149
- CComPtr<IMoniker> moniker;
150
+ ComPtr<ICreateDevEnum> deviceEnum;
151
+ ComPtr<IEnumMoniker> enumMoniker;
152
+ ComPtr<IMoniker> moniker;
153
DWORD count = 0;
154
HRESULT hr;
155
156
157
while (enumMoniker->Next(1, &moniker, &count) == S_OK) {
158
if (GetFilterByMediumFromMoniker(moniker, medium, filter))
159
return true;
160
-
161
- moniker.Release();
162
}
163
164
return false;
165
166
167
bool GetPinMedium(IPin *pin, REGPINMEDIUM &medium)
168
{
169
- CComQIPtr<IKsPin> ksPin(pin);
170
+ ComQIPtr<IKsPin> ksPin(pin);
171
CoTaskMemPtr<KSMULTIPLE_ITEM> items;
172
173
if (!ksPin)
174
175
176
static inline bool PinIsConnected(IPin *pin)
177
{
178
- CComPtr<IPin> connectedPin;
179
+ ComPtr<IPin> connectedPin;
180
return SUCCEEDED(pin->ConnectedTo(&connectedPin));
181
}
182
183
static bool DirectConnectOutputPin(IFilterGraph *graph, IPin *pin,
184
IBaseFilter *filterIn)
185
{
186
- CComPtr<IPin> curPin;
187
- CComPtr<IEnumPins> pinsEnum;
188
+ ComPtr<IPin> curPin;
189
+ ComPtr<IEnumPins> pinsEnum;
190
ULONG num;
191
192
if (!graph || !filterIn || !pin)
193
194
if (graph->ConnectDirect(pin, curPin, nullptr) == S_OK)
195
return true;
196
}
197
-
198
- curPin.Release();
199
}
200
201
return false;
202
203
bool DirectConnectFilters(IFilterGraph *graph, IBaseFilter *filterOut,
204
IBaseFilter *filterIn)
205
{
206
- CComPtr<IPin> curPin;
207
- CComPtr<IEnumPins> pinsEnum;
208
+ ComPtr<IPin> curPin;
209
+ ComPtr<IEnumPins> pinsEnum;
210
ULONG num;
211
bool connected = false;
212
213
214
if (DirectConnectOutputPin(graph, curPin, filterIn))
215
connected = true;
216
}
217
-
218
- curPin.Release();
219
}
220
221
return connected;
222
223
224
HRESULT MapPinToPacketID(IPin *pin, ULONG packetID)
225
{
226
- CComQIPtr<IMPEG2PIDMap> pidMap(pin);
227
+ ComQIPtr<IMPEG2PIDMap> pidMap(pin);
228
if (!pidMap)
229
return E_NOINTERFACE;
230
231
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/dshow-base.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/dshow-base.hpp
Changed
17
1
2
#define WIN32_MEAN_AND_LEAN
3
#define __STREAMS__
4
#include <windows.h>
5
-#include <atlbase.h>
6
#include <dshow.h>
7
#include <ks.h>
8
#include <ksmedia.h>
9
10
#include <Amaudio.h>
11
#include <Dvdmedia.h>
12
13
+#include "ComPtr.hpp"
14
#include "CoTaskMemPtr.hpp"
15
16
#include <string>
17
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/dshow-demux.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/dshow-demux.cpp
Changed
59
1
2
long width, long height, long long frameTime,
3
VideoFormat format)
4
{
5
- CComQIPtr<IMpeg2Demultiplexer> demuxer(demuxFilter);
6
+ ComQIPtr<IMpeg2Demultiplexer> demuxer(demuxFilter);
7
if (!demuxer) {
8
Warning(L"CreateDemuxVideoPin: Failed to get "
9
L"IMpeg2Demultiplexer from filter");
10
return false;
11
}
12
13
- CComPtr<IPin> pin;
14
+ ComPtr<IPin> pin;
15
HRESULT hr;
16
17
VIDEOINFOHEADER *vih = mt.AllocFormat<VIDEOINFOHEADER>();
18
19
mt->formattype = FORMAT_VideoInfo;
20
mt->bTemporalCompression = true;
21
22
- hr = demuxer->CreateOutputPin(mt, DEMUX_VIDEO_PIN, &pin);
23
+ wchar_t *name = (wchar_t*)CoTaskMemAlloc(sizeof(DEMUX_VIDEO_PIN));
24
+ memcpy(name, DEMUX_VIDEO_PIN, sizeof(DEMUX_VIDEO_PIN));
25
+
26
+ hr = demuxer->CreateOutputPin(mt, name, &pin);
27
if (FAILED(hr)) {
28
WarningHR(L"CreateDemuxVideoPin: Failed to create video pin "
29
L"on demuxer", hr);
30
31
DWORD samplesPerSec, WORD bitsPerSample, WORD channels,
32
AudioFormat format)
33
{
34
- CComQIPtr<IMpeg2Demultiplexer> demuxer(demuxFilter);
35
+ ComQIPtr<IMpeg2Demultiplexer> demuxer(demuxFilter);
36
if (!demuxer) {
37
Warning(L"CreateDemuxAudioPin: Failed to get "
38
L"IMpeg2Demultiplexer from filter");
39
return false;
40
}
41
42
- CComPtr<IPin> pin;
43
+ ComPtr<IPin> pin;
44
HRESULT hr;
45
46
WAVEFORMATEX *wfex = mt.AllocFormat<WAVEFORMATEX>();
47
48
mt->formattype = FORMAT_WaveFormatEx;
49
mt->bTemporalCompression = true;
50
51
- hr = demuxer->CreateOutputPin(mt, DEMUX_AUDIO_PIN, &pin);
52
+ wchar_t *name = (wchar_t*)CoTaskMemAlloc(sizeof(DEMUX_AUDIO_PIN));
53
+ memcpy(name, DEMUX_AUDIO_PIN, sizeof(DEMUX_AUDIO_PIN));
54
+
55
+ hr = demuxer->CreateOutputPin(mt, name, &pin);
56
if (FAILED(hr)) {
57
WarningHR(L"CreateDemuxAudioPin: Failed to create audio pin "
58
L"on demuxer", hr);
59
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/dshow-encoded-device.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/dshow-encoded-device.cpp
Changed
43
1
2
IBaseFilter **crossbar, IBaseFilter **encoder,
3
IBaseFilter **demuxer)
4
{
5
- CComPtr<IPin> inputPin;
6
- CComPtr<IPin> outputPin;
7
+ ComPtr<IPin> inputPin;
8
+ ComPtr<IPin> outputPin;
9
REGPINMEDIUM inMedium;
10
REGPINMEDIUM outMedium;
11
bool hasOutMedium;
12
13
14
static inline bool MapPacketIDs(IBaseFilter *demuxer, ULONG video, ULONG audio)
15
{
16
- CComPtr<IPin> videoPin, audioPin;
17
+ ComPtr<IPin> videoPin, audioPin;
18
HRESULT hr;
19
20
if (!GetPinByName(demuxer, PINDIR_OUTPUT, DEMUX_VIDEO_PIN, &videoPin)) {
21
22
RocketInstStruct rocketInstance = {};
23
RocketPropStruct rocketProperty = {};
24
25
- CComQIPtr<IKsPropertySet> propertySet(encoder);
26
+ ComQIPtr<IKsPropertySet> propertySet(encoder);
27
if (!propertySet)
28
return false;
29
30
31
VideoConfig &config,
32
const EncodedDevice &info)
33
{
34
- CComPtr<IBaseFilter> crossbar;
35
- CComPtr<IBaseFilter> encoder;
36
- CComPtr<IBaseFilter> demuxer;
37
+ ComPtr<IBaseFilter> crossbar;
38
+ ComPtr<IBaseFilter> encoder;
39
+ ComPtr<IBaseFilter> demuxer;
40
MediaType mtVideo;
41
MediaType mtAudio;
42
43
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/dshow-enum.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/dshow-enum.cpp
Changed
108
1
2
3
static void EnumElgatoCaps(IPin *pin, EnumCapsCallback callback, void *param)
4
{
5
- CComPtr<IEnumMediaTypes> mediaTypes;
6
+ ComPtr<IEnumMediaTypes> mediaTypes;
7
8
if (SUCCEEDED(pin->EnumMediaTypes(&mediaTypes))) {
9
MediaTypePtr mt;
10
11
static bool EnumPinCaps(IPin *pin, EnumCapsCallback callback, void *param)
12
{
13
HRESULT hr;
14
- CComQIPtr<IAMStreamConfig> config(pin);
15
+ ComQIPtr<IAMStreamConfig> config(pin);
16
int count, size;
17
18
if (config == NULL)
19
20
long long bestVal;
21
bool found;
22
23
+ ClosestVideoData &operator=(ClosestVideoData const&) = delete;
24
+ ClosestVideoData &operator=(ClosestVideoData&&) = delete;
25
+
26
inline ClosestVideoData(VideoConfig &config, MediaType &mt)
27
: config (config),
28
mt (mt),
29
30
bool GetClosestVideoMediaType(IBaseFilter *filter, VideoConfig &config,
31
MediaType &mt)
32
{
33
- CComPtr<IPin> pin;
34
+ ComPtr<IPin> pin;
35
ClosestVideoData data(config, mt);
36
bool success;
37
38
39
int bestVal;
40
bool found;
41
42
+ ClosestAudioData &operator=(ClosestAudioData const&) = delete;
43
+ ClosestAudioData &operator=(ClosestAudioData&&) = delete;
44
+
45
inline ClosestAudioData(AudioConfig &config, MediaType &mt)
46
: config (config),
47
mt (mt),
48
49
static bool ClosestAudioMTCallback(ClosestAudioData &data,
50
const AM_MEDIA_TYPE &mt, const BYTE *capData)
51
{
52
- AudioInfo info;
53
+ AudioInfo info = {};
54
55
if (mt.formattype == FORMAT_WaveFormatEx)
56
Get_FORMAT_WaveFormatEx_Data(info, mt, capData);
57
58
bool GetClosestAudioMediaType(IBaseFilter *filter, AudioConfig &config,
59
MediaType &mt)
60
{
61
- CComPtr<IPin> pin;
62
+ ComPtr<IPin> pin;
63
ClosestAudioData data(config, mt);
64
bool success;
65
66
67
static bool EnumDevice(IMoniker *deviceInfo, EnumDeviceCallback callback,
68
void *param)
69
{
70
- CComPtr<IPropertyBag> propertyData;
71
- CComPtr<IBaseFilter> filter;
72
+ ComPtr<IPropertyBag> propertyData;
73
+ ComPtr<IBaseFilter> filter;
74
HRESULT hr;
75
76
hr = deviceInfo->BindToStorage(0, 0, IID_IPropertyBag,
77
78
79
static bool EnumExceptionVideoDevices(EnumDeviceCallback callback, void *param)
80
{
81
- CComPtr<IBaseFilter> filter;
82
+ ComPtr<IBaseFilter> filter;
83
HRESULT hr;
84
85
hr = CoCreateInstance(CLSID_ElgatoVideoCaptureFilter, nullptr,
86
87
88
bool EnumDevices(const GUID &type, EnumDeviceCallback callback, void *param)
89
{
90
- CComPtr<ICreateDevEnum> deviceEnum;
91
- CComPtr<IEnumMoniker> enumMoniker;
92
- CComPtr<IMoniker> deviceInfo;
93
+ ComPtr<ICreateDevEnum> deviceEnum;
94
+ ComPtr<IEnumMoniker> enumMoniker;
95
+ ComPtr<IMoniker> deviceInfo;
96
HRESULT hr;
97
DWORD count = 0;
98
99
100
while (enumMoniker->Next(1, &deviceInfo, &count) == S_OK) {
101
if (!EnumDevice(deviceInfo, callback, param))
102
return true;
103
-
104
- deviceInfo.Release();
105
}
106
}
107
108
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/dshow-formats.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/dshow-formats.cpp
Changed
19
1
2
#include "dshow-formats.hpp"
3
#include "dshow-media-type.hpp"
4
5
+#ifndef __MINGW32__
6
+
7
const GUID MEDIASUBTYPE_RAW_AAC1 =
8
{0x000000FF, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
9
10
11
const GUID MEDIASUBTYPE_DVM =
12
{0x00002000, 0x0000, 0x0010, {0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}};
13
14
+#endif
15
+
16
namespace DShow {
17
18
static bool GetFourCCVFormat(DWORD fourCC, VideoFormat &format)
19
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/dshowcapture.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/dshowcapture.cpp
Changed
59
1
2
if (!propertyObject)
3
return;
4
5
- CComQIPtr<ISpecifyPropertyPages> pages(propertyObject);
6
+ ComQIPtr<ISpecifyPropertyPages> pages(propertyObject);
7
CAUUID cauuid;
8
9
if (pages != NULL) {
10
11
12
void Device::OpenDialog(void *hwnd, DialogType type) const
13
{
14
- CComPtr<IUnknown> ptr;
15
+ ComPtr<IUnknown> ptr;
16
HRESULT hr;
17
18
if (type == DialogType::ConfigVideo) {
19
20
}
21
22
if (ptr != NULL && type == DialogType::ConfigCrossbar2) {
23
- CComQIPtr<IAMCrossbar> xbar(ptr);
24
- CComQIPtr<IBaseFilter> filter(xbar);
25
+ ComQIPtr<IAMCrossbar> xbar(ptr);
26
+ ComQIPtr<IBaseFilter> filter(xbar);
27
28
hr = context->builder->FindInterface(
29
&LOOK_UPSTREAM_ONLY,
30
31
const wchar_t *deviceName,
32
const wchar_t *devicePath)
33
{
34
- CComPtr<IPin> pin;
35
+ ComPtr<IPin> pin;
36
37
if (GetPinByName(filter, PINDIR_OUTPUT, L"656", &pin))
38
EnumEncodedVideo(devices, deviceName, devicePath, HD_PVR2);
39
40
const wchar_t *deviceName,
41
const wchar_t *devicePath)
42
{
43
- CComPtr<IPin> pin;
44
- CComPtr<IPin> audioPin;
45
+ ComPtr<IPin> pin;
46
+ ComPtr<IPin> audioPin;
47
VideoDevice info;
48
49
if (wcsstr(deviceName, L"Hauppauge HD PVR Capture") != nullptr) {
50
51
const wchar_t *deviceName,
52
const wchar_t *devicePath)
53
{
54
- CComPtr<IPin> pin;
55
+ ComPtr<IPin> pin;
56
AudioDevice info;
57
58
bool success = GetFilterPin(filter, MEDIATYPE_Audio,
59
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/encoder.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/encoder.cpp
Changed
78
1
2
3
HVideoEncoder::~HVideoEncoder()
4
{
5
- CComPtr<IEnumFilters> filterEnum;
6
+ ComPtr<IEnumFilters> filterEnum;
7
IBaseFilter *filter;
8
HRESULT hr;
9
10
11
12
bool HVideoEncoder::ConnectFilters()
13
{
14
- CComPtr<IPin> deviceIn;
15
- CComPtr<IPin> deviceOut;
16
- CComPtr<IPin> encoderIn;
17
- CComPtr<IPin> encoderOut;
18
+ ComPtr<IPin> deviceIn;
19
+ ComPtr<IPin> deviceOut;
20
+ ComPtr<IPin> encoderIn;
21
+ ComPtr<IPin> encoderOut;
22
bool success;
23
HRESULT hr;
24
25
26
27
static bool GetPinFirstMediaType(IPin *pin, AM_MEDIA_TYPE **mt)
28
{
29
- CComPtr<IEnumMediaTypes> mediaEnum;
30
+ ComPtr<IEnumMediaTypes> mediaEnum;
31
HRESULT hr;
32
ULONG fetched;
33
34
35
36
bool HVideoEncoder::SetupCrossbar()
37
{
38
- CComPtr<IBaseFilter> crossbar;
39
- CComPtr<IPin> pin;
40
+ ComPtr<IBaseFilter> crossbar;
41
+ ComPtr<IPin> pin;
42
REGPINMEDIUM medium;
43
44
/* C353 has no crossbar */
45
46
47
bool HVideoEncoder::SetupEncoder(IBaseFilter *filter)
48
{
49
- CComPtr<IBaseFilter> deviceFilter;
50
- CComPtr<IPin> inputPin;
51
- CComPtr<IPin> outputPin;
52
+ ComPtr<IBaseFilter> deviceFilter;
53
+ ComPtr<IPin> inputPin;
54
+ ComPtr<IPin> outputPin;
55
REGPINMEDIUM medium;
56
MediaTypePtr mtRaw;
57
MediaTypePtr mtEncoded;
58
59
{
60
HRESULT hr;
61
62
- CComQIPtr<IKsPropertySet> propertySet(encoder);
63
+ ComQIPtr<IKsPropertySet> propertySet(encoder);
64
if (!propertySet) {
65
Warning(L"Could not get IKsPropertySet for encoder");
66
return false;
67
68
69
bool HVideoEncoder::SetConfig(VideoEncoderConfig &config)
70
{
71
- CComPtr<IBaseFilter> filter;
72
- CComPtr<IBaseFilter> crossbar;
73
+ ComPtr<IBaseFilter> filter;
74
+ ComPtr<IBaseFilter> crossbar;
75
76
if (config.name.empty() && config.path.empty()) {
77
Warning(L"No video encoder name or path specified");
78
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/encoder.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/encoder.hpp
Changed
24
1
2
namespace DShow {
3
4
struct HVideoEncoder {
5
- CComPtr<IGraphBuilder> graph;
6
- CComPtr<ICaptureGraphBuilder2> builder;
7
- CComPtr<IMediaControl> control;
8
-
9
- CComPtr<IBaseFilter> encoder;
10
- CComPtr<IBaseFilter> device;
11
- CComPtr<OutputFilter> output;
12
- CComPtr<CaptureFilter> capture;
13
+ ComPtr<IGraphBuilder> graph;
14
+ ComPtr<ICaptureGraphBuilder2> builder;
15
+ ComPtr<IMediaControl> control;
16
+
17
+ ComPtr<IBaseFilter> encoder;
18
+ ComPtr<IBaseFilter> device;
19
+ ComPtr<OutputFilter> output;
20
+ ComPtr<CaptureFilter> capture;
21
22
VideoEncoderConfig config;
23
24
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/output-filter.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/output-filter.cpp
Changed
123
1
2
{
3
}
4
5
+OutputPin::~OutputPin()
6
+{
7
+}
8
+
9
STDMETHODIMP OutputPin::QueryInterface(REFIID riid, void **ppv)
10
{
11
if (riid == IID_IUnknown) {
12
13
14
hr = pReceivePin->ReceiveConnection(this, outputInfo.mt);
15
if (FAILED(hr)) {
16
- CComPtr<IEnumMediaTypes> enumMT;
17
+ ComPtr<IEnumMediaTypes> enumMT;
18
pReceivePin->EnumMediaTypes(&enumMT);
19
20
if (enumMT) {
21
22
return E_FAIL;
23
}
24
25
- CComQIPtr<IMemInputPin> memInput(pReceivePin);
26
+ ComQIPtr<IMemInputPin> memInput(pReceivePin);
27
if (!memInput)
28
return E_FAIL;
29
30
if (!!allocator) {
31
allocator->Decommit();
32
- allocator.Release();
33
}
34
35
hr = memInput->GetAllocator(&allocator);
36
37
38
if (!!allocator) {
39
allocator->Decommit();
40
- allocator.Release();
41
}
42
43
connectedPin = nullptr;
44
45
return NOERROR;
46
}
47
48
+#define OUTPUT_PIN_NAME L"Output Pin"
49
+
50
STDMETHODIMP OutputPin::QueryId(LPWSTR *lpId)
51
{
52
- *lpId = L"Output Pin";
53
+ wchar_t *str = (wchar_t*)CoTaskMemAlloc(sizeof(OUTPUT_PIN_NAME));
54
+ memcpy(str, OUTPUT_PIN_NAME, sizeof(OUTPUT_PIN_NAME));
55
+ *lpId = str;
56
return S_OK;
57
}
58
59
60
size_t linesize[DSHOW_MAX_PLANES],
61
long long timestampStart, long long timestampEnd)
62
{
63
- CComQIPtr<IMemInputPin> memInput(connectedPin);
64
+ ComQIPtr<IMemInputPin> memInput(connectedPin);
65
REFERENCE_TIME startTime = timestampStart;
66
REFERENCE_TIME endTime = timestampEnd;
67
- CComPtr<IMediaSample> sample;
68
+ ComPtr<IMediaSample> sample;
69
HRESULT hr;
70
BYTE *ptr;
71
72
73
74
public:
75
inline SourceMiscFlags() {}
76
+ virtual ~SourceMiscFlags() {}
77
78
STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
79
{
80
81
{
82
}
83
84
+OutputFilter::~OutputFilter()
85
+{
86
+}
87
+
88
// IUnknown methods
89
STDMETHODIMP OutputFilter::QueryInterface(REFIID riid, void **ppv)
90
{
91
92
// ============================================================================
93
94
OutputEnumPins::OutputEnumPins(OutputFilter *filter_, OutputEnumPins *pEnum)
95
- : filter (filter_),
96
- refCount (1)
97
+ : filter (filter_)
98
{
99
curPin = (pEnum != nullptr) ? pEnum->curPin : 0;
100
}
101
102
+OutputEnumPins::~OutputEnumPins()
103
+{
104
+}
105
+
106
// IUnknown
107
STDMETHODIMP OutputEnumPins::QueryInterface(REFIID riid, void **ppv)
108
{
109
110
// ============================================================================
111
112
OutputEnumMediaTypes::OutputEnumMediaTypes(OutputPin *pin_)
113
- : pin (pin_),
114
- refCount (1)
115
+ : pin (pin_)
116
+{
117
+}
118
+
119
+OutputEnumMediaTypes::~OutputEnumMediaTypes()
120
{
121
}
122
123
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/source/output-filter.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/source/output-filter.hpp
Changed
71
1
2
volatile long refCount;
3
4
PinOutputInfo outputInfo;
5
- CComPtr<IPin> connectedPin;
6
+ ComPtr<IPin> connectedPin;
7
OutputFilter *filter;
8
volatile bool flushing = false;
9
- CComPtr<IMemAllocator> allocator;
10
+ ComPtr<IMemAllocator> allocator;
11
size_t bufSize;
12
13
bool IsValidMediaType(const AM_MEDIA_TYPE *pmt) const;
14
15
public:
16
OutputPin(OutputFilter *filter, const PinOutputInfo &info);
17
+ virtual ~OutputPin();
18
19
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
20
STDMETHODIMP_(ULONG) AddRef();
21
22
23
volatile long refCount;
24
FILTER_STATE state;
25
- CComPtr<IFilterGraph> graph;
26
- CComPtr<OutputPin> pin;
27
+ ComPtr<IFilterGraph> graph;
28
+ ComPtr<OutputPin> pin;
29
30
- CComPtr<IAMFilterMiscFlags> misc;
31
+ ComPtr<IAMFilterMiscFlags> misc;
32
33
public:
34
OutputFilter(const PinOutputInfo &info);
35
+ virtual ~OutputFilter();
36
37
// IUnknown methods
38
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
39
40
};
41
42
class OutputEnumPins : public IEnumPins {
43
- volatile long refCount;
44
- CComPtr<OutputFilter> filter;
45
+ volatile long refCount = 1;
46
+ ComPtr<OutputFilter> filter;
47
UINT curPin;
48
49
public:
50
OutputEnumPins(OutputFilter *filter, OutputEnumPins *pEnum);
51
+ virtual ~OutputEnumPins();
52
53
// IUnknown
54
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
55
56
};
57
58
class OutputEnumMediaTypes : public IEnumMediaTypes {
59
- volatile long refCount;
60
- CComPtr<OutputPin> pin;
61
+ volatile long refCount = 1;
62
+ ComPtr<OutputPin> pin;
63
UINT curMT = 0;
64
65
public:
66
OutputEnumMediaTypes(OutputPin *pin);
67
+ virtual ~OutputEnumMediaTypes();
68
69
// IUnknown
70
STDMETHODIMP QueryInterface(REFIID riid, void **ppv);
71
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/vs/2013/dshowcapture/dshowcapture.vcxproj -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/vs/2013/dshowcapture/dshowcapture.vcxproj
Changed
9
1
2
<ItemGroup>
3
<ClInclude Include="..\..\..\dshowcapture.hpp" />
4
<ClInclude Include="..\..\..\source\capture-filter.hpp" />
5
+ <ClInclude Include="..\..\..\source\ComPtr.hpp" />
6
<ClInclude Include="..\..\..\source\device.hpp" />
7
<ClInclude Include="..\..\..\source\dshow-base.hpp" />
8
<ClInclude Include="..\..\..\source\dshow-demux.hpp" />
9
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/libdshowcapture/vs/2013/dshowcapture/dshowcapture.vcxproj.filters -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/libdshowcapture/vs/2013/dshowcapture/dshowcapture.vcxproj.filters
Changed
11
1
2
<ClInclude Include="..\..\..\source\encoder.hpp">
3
<Filter>Header Files</Filter>
4
</ClInclude>
5
+ <ClInclude Include="..\..\..\source\ComPtr.hpp">
6
+ <Filter>Header Files</Filter>
7
+ </ClInclude>
8
</ItemGroup>
9
</Project>
10
\ No newline at end of file
11
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-dshow/win-dshow.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-dshow/win-dshow.cpp
Changed
133
1
2
#define BUFFERING_VAL "buffering"
3
#define USE_CUSTOM_AUDIO "use_custom_audio_device"
4
#define AUDIO_DEVICE_ID "audio_device_id"
5
+#define COLOR_SPACE "color_space"
6
+#define COLOR_RANGE "color_range"
7
8
#define TEXT_INPUT_NAME obs_module_text("VideoCaptureDevice")
9
#define TEXT_DEVICE obs_module_text("Device")
10
11
#define TEXT_AUDIO_DEVICE obs_module_text("AudioDevice")
12
#define TEXT_ACTIVATE obs_module_text("Activate")
13
#define TEXT_DEACTIVATE obs_module_text("Deactivate")
14
+#define TEXT_COLOR_SPACE obs_module_text("ColorSpace")
15
+#define TEXT_COLOR_DEFAULT obs_module_text("ColorSpace.Default")
16
+#define TEXT_COLOR_RANGE obs_module_text("ColorRange")
17
+#define TEXT_RANGE_PARTIAL obs_module_text("ColorRange.Partial")
18
+#define TEXT_RANGE_FULL obs_module_text("ColorRange.Full")
19
20
enum ResType {
21
ResType_Preferred,
22
23
bool UpdateVideoConfig(obs_data_t *settings);
24
bool UpdateAudioConfig(obs_data_t *settings);
25
void SetActive(bool active);
26
+ inline enum video_colorspace GetColorSpace(obs_data_t *settings) const;
27
+ inline enum video_range_type GetColorRange(obs_data_t *settings) const;
28
inline void Activate(obs_data_t *settings);
29
inline void Deactivate();
30
31
32
return ConvertRes(cx, cy, res.c_str());
33
}
34
35
+template <typename ... F>
36
+static bool CapsMatch(const VideoDevice &dev, F ... fs);
37
+
38
template <typename F, typename ... Fs>
39
static inline bool CapsMatch(const VideoInfo &info, F&& f, Fs ... fs)
40
{
41
42
obs_data_release(settings);
43
}
44
45
+inline enum video_colorspace DShowInput::GetColorSpace(
46
+ obs_data_t *settings) const
47
+{
48
+ const char *space = obs_data_get_string(settings, COLOR_SPACE);
49
+
50
+ if (astrcmpi(space, "709") == 0)
51
+ return VIDEO_CS_709;
52
+ else if (astrcmpi(space, "601") == 0)
53
+ return VIDEO_CS_601;
54
+ else
55
+ return (videoConfig.format == VideoFormat::HDYC) ?
56
+ VIDEO_CS_709 : VIDEO_CS_601;
57
+}
58
+
59
+inline enum video_range_type DShowInput::GetColorRange(
60
+ obs_data_t *settings) const
61
+{
62
+ const char *range = obs_data_get_string(settings, COLOR_RANGE);
63
+
64
+ return astrcmpi(range, "full") == 0 ?
65
+ VIDEO_RANGE_FULL : VIDEO_RANGE_PARTIAL;
66
+}
67
+
68
inline void DShowInput::Activate(obs_data_t *settings)
69
{
70
if (!device.ResetGraph())
71
72
if (device.Start() != Result::Success)
73
return;
74
75
- enum video_colorspace cs = (videoConfig.format == VideoFormat::HDYC) ?
76
- VIDEO_CS_709 : VIDEO_CS_601;
77
+ enum video_colorspace cs = GetColorSpace(settings);
78
79
- if (!video_format_get_parameters(cs, VIDEO_RANGE_PARTIAL,
80
+ bool success = video_format_get_parameters(
81
+ cs, GetColorRange(settings),
82
frame.color_matrix,
83
frame.color_range_min,
84
- frame.color_range_max)) {
85
+ frame.color_range_max);
86
+ if (!success) {
87
blog(LOG_ERROR, "Failed to get video format parameters for " \
88
"video format %u", cs);
89
}
90
91
obs_data_set_default_int(settings, FRAME_INTERVAL, FPS_MATCHING);
92
obs_data_set_default_int(settings, RES_TYPE, ResType_Preferred);
93
obs_data_set_default_int(settings, VIDEO_FORMAT, (int)VideoFormat::Any);
94
+ obs_data_set_default_string(settings, COLOR_SPACE, "default");
95
+ obs_data_set_default_string(settings, COLOR_RANGE, "partial");
96
}
97
98
struct Resolution {
99
100
static bool UpdateFPS(long long interval, obs_property_t *list)
101
{
102
size_t size = obs_property_list_item_count(list);
103
- bool fps_found = false;
104
DStr name;
105
106
for (size_t i = 0; i < size; i++) {
107
108
return false;
109
110
dstr_cat(name, obs_property_list_item_name(list, i));
111
- fps_found = true;
112
break;
113
}
114
115
116
117
obs_property_set_modified_callback(p, VideoFormatChanged);
118
119
+ p = obs_properties_add_list(ppts, COLOR_SPACE, TEXT_COLOR_SPACE,
120
+ OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
121
+ obs_property_list_add_string(p, TEXT_COLOR_DEFAULT, "default");
122
+ obs_property_list_add_string(p, "709", "709");
123
+ obs_property_list_add_string(p, "601", "601");
124
+
125
+ p = obs_properties_add_list(ppts, COLOR_RANGE, TEXT_COLOR_RANGE,
126
+ OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
127
+ obs_property_list_add_string(p, TEXT_RANGE_PARTIAL, "partial");
128
+ obs_property_list_add_string(p, TEXT_RANGE_FULL, "full");
129
+
130
p = obs_properties_add_list(ppts, BUFFERING_VAL, TEXT_BUFFERING,
131
OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
132
obs_property_list_add_int(p, TEXT_BUFFERING_AUTO,
133
obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-wasapi/data/locale/zh-CN.ini
Added
8
1
2
+AudioInput="音频输入捕获"
3
+AudioOutput="音频输出捕获"
4
+Device="设备"
5
+Default="默认"
6
+UseDeviceTiming="使用设备时间戳"
7
+
8
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-wasapi/enum-wasapi.hpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-wasapi/enum-wasapi.hpp
Changed
26
1
2
#include <mmdeviceapi.h>
3
#include <audioclient.h>
4
#include <propsys.h>
5
+
6
+#ifdef __MINGW32__
7
+
8
+#ifdef DEFINE_PROPERTYKEY
9
+#undef DEFINE_PROPERTYKEY
10
+#endif
11
+#define DEFINE_PROPERTYKEY(id, a, b, c, d, e, f, g, h, i, j, k, l) \
12
+ const PROPERTYKEY id = { { a,b,c, { d,e,f,g,h,i,j,k, } }, l };
13
+DEFINE_PROPERTYKEY(PKEY_Device_FriendlyName, \
14
+ 0xa45c254e, 0xdf1c, 0x4efd, 0x80, \
15
+ 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 14);
16
+
17
+#else
18
+
19
#include <functiondiscoverykeys_devpkey.h>
20
21
+#endif
22
+
23
#include <vector>
24
#include <string>
25
26
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/plugins/win-wasapi/win-wasapi.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/plugins/win-wasapi/win-wasapi.cpp
Changed
51
1
2
string device_id;
3
string device_name;
4
bool isInputDevice;
5
- bool useDeviceTiming;
6
- bool isDefaultDevice;
7
+ bool useDeviceTiming = false;
8
+ bool isDefaultDevice = false;
9
10
- bool reconnecting;
11
+ bool reconnecting = false;
12
WinHandle reconnectThread;
13
14
- bool active;
15
+ bool active = false;
16
WinHandle captureThread;
17
18
WinHandle stopSignal;
19
20
21
WASAPISource::WASAPISource(obs_data_t *settings, obs_source_t *source_,
22
bool input)
23
- : reconnecting (false),
24
- active (false),
25
- reconnectThread (nullptr),
26
- captureThread (nullptr),
27
- source (source_),
28
+ : source (source_),
29
isInputDevice (input)
30
{
31
UpdateSettings(settings);
32
33
34
if (!reconnectThread.Valid())
35
blog(LOG_WARNING, "[WASAPISource::Reconnect] "
36
- "Failed to intiialize reconnect thread: %d",
37
+ "Failed to intiialize reconnect thread: %lu",
38
GetLastError());
39
}
40
41
42
device.name.c_str(), device.id.c_str());
43
}
44
45
- obs_property_t *prop;
46
- prop = obs_properties_add_bool(props, OPT_USE_DEVICE_TIMING,
47
+ obs_properties_add_bool(props, OPT_USE_DEVICE_TIMING,
48
obs_module_text("UseDeviceTiming"));
49
50
return props;
51
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/test/test-input/CMakeLists.txt -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/test/test-input/CMakeLists.txt
Changed
10
1
2
3
include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs")
4
5
-if(WIN32)
6
+if(MSVC)
7
set(test-input_PLATFORM_DEPS
8
w32-pthreads)
9
endif()
10
obs-studio-0.7.3+git20150114.d54b3cc.tar.xz/test/win/test.cpp -> obs-studio-0.8.2+git20150211.6099c65.tar.xz/test/win/test.cpp
Changed
10
1
2
3
obs_shutdown();
4
5
- blog(LOG_INFO, "Number of memory leaks: %llu", bnum_allocs());
6
+ blog(LOG_INFO, "Number of memory leaks: %ld", bnum_allocs());
7
DestroyWindow(hwnd);
8
9
UNUSED_PARAMETER(prevInstance);
10