Changes of Revision 7

obs-studio.changes Changed
x
 
1
@@ -1,4 +1,12 @@
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
@@ -1,5 +1,5 @@
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
@@ -7,8 +7,6 @@
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
@@ -41,7 +39,6 @@
18
 
19
 %prep
20
 %setup -q
21
-%patch0 -p1
22
 
23
 %build
24
 mkdir -p build && cd build
25
@@ -49,7 +46,7 @@
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
@@ -1,45 +0,0 @@
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
@@ -1,7 +1,7 @@
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
@@ -1,2713 +0,0 @@
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
@@ -0,0 +1,5 @@
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
@@ -26,7 +26,7 @@
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
@@ -57,6 +57,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
@@ -100,12 +100,12 @@
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
@@ -41,6 +41,10 @@
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
@@ -0,0 +1,82 @@
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
@@ -14,15 +14,20 @@
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
@@ -1,5 +1,8 @@
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
@@ -35,7 +35,10 @@
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
@@ -583,8 +583,8 @@
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
@@ -45,7 +45,7 @@
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
@@ -40,10 +40,10 @@
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
@@ -16,6 +16,7 @@
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
@@ -135,7 +135,13 @@
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
@@ -147,8 +147,8 @@
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
@@ -15,7 +15,7 @@
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
@@ -142,7 +142,7 @@
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
@@ -189,8 +189,8 @@
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
@@ -219,7 +219,7 @@
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
@@ -421,20 +421,7 @@
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
@@ -59,6 +59,7 @@
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
@@ -83,7 +84,7 @@
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
@@ -109,6 +110,7 @@
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
@@ -208,7 +210,7 @@
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
@@ -264,8 +266,8 @@
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
@@ -279,14 +281,14 @@
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
@@ -294,16 +296,7 @@
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
@@ -359,18 +352,18 @@
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
@@ -390,8 +383,8 @@
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 &param, bool &upload);
125
@@ -619,32 +612,32 @@
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
@@ -149,10 +149,10 @@
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
@@ -163,15 +163,11 @@
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
@@ -96,9 +96,9 @@
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
@@ -132,7 +132,7 @@
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
@@ -141,7 +141,7 @@
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
@@ -168,8 +168,8 @@
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
@@ -202,13 +202,13 @@
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
@@ -297,7 +297,7 @@
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
@@ -316,7 +316,7 @@
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
@@ -328,7 +328,7 @@
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
@@ -514,7 +514,7 @@
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
@@ -46,9 +46,12 @@
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
@@ -34,7 +34,7 @@
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
@@ -55,6 +55,9 @@
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
@@ -75,6 +78,11 @@
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
@@ -84,15 +92,14 @@
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
@@ -188,29 +195,33 @@
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
@@ -232,8 +243,7 @@
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
@@ -266,27 +276,55 @@
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
@@ -305,9 +343,13 @@
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
@@ -338,8 +380,12 @@
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
@@ -373,12 +419,14 @@
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
@@ -417,18 +465,18 @@
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
@@ -452,7 +500,7 @@
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
@@ -460,18 +508,18 @@
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
@@ -545,25 +593,32 @@
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
@@ -606,7 +661,15 @@
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
@@ -741,3 +804,14 @@
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
@@ -24,6 +24,8 @@
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
@@ -172,13 +174,14 @@
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
@@ -189,7 +192,10 @@
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
@@ -46,8 +46,23 @@
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
@@ -34,14 +34,14 @@
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
@@ -798,12 +798,63 @@
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
@@ -831,6 +882,49 @@
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
@@ -70,6 +70,7 @@
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
@@ -57,7 +57,7 @@
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
@@ -68,6 +68,7 @@
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
@@ -87,18 +88,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
@@ -149,8 +150,8 @@
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
@@ -180,8 +181,8 @@
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
@@ -248,6 +249,14 @@
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
@@ -437,6 +446,23 @@
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
@@ -588,6 +614,7 @@
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
@@ -644,7 +671,7 @@
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
@@ -666,6 +693,9 @@
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
@@ -702,7 +732,7 @@
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
@@ -711,6 +741,8 @@
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
@@ -71,6 +71,12 @@
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
@@ -388,7 +388,7 @@
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
@@ -412,8 +412,9 @@
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
@@ -451,6 +452,8 @@
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
@@ -253,6 +253,9 @@
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
@@ -135,9 +135,13 @@
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
@@ -330,15 +334,33 @@
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
@@ -357,15 +379,27 @@
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
@@ -373,9 +407,22 @@
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
@@ -491,6 +538,61 @@
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
@@ -505,12 +607,8 @@
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
@@ -565,26 +663,43 @@
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
@@ -681,14 +796,20 @@
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
@@ -697,25 +818,32 @@
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
@@ -763,12 +891,20 @@
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
@@ -792,6 +928,10 @@
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
@@ -807,17 +947,33 @@
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
@@ -825,7 +981,10 @@
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
@@ -835,15 +994,14 @@
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
@@ -912,9 +1070,40 @@
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
@@ -928,14 +1117,13 @@
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
@@ -974,10 +1162,21 @@
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
@@ -993,16 +1192,15 @@
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
@@ -26,6 +26,7 @@
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
@@ -101,8 +101,11 @@
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
@@ -142,7 +142,7 @@
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
@@ -235,3 +235,19 @@
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
@@ -63,6 +63,11 @@
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
@@ -84,6 +84,7 @@
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
@@ -126,7 +127,7 @@
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
@@ -2167,6 +2168,37 @@
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
@@ -295,9 +295,6 @@
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
@@ -48,8 +48,23 @@
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
@@ -97,7 +112,7 @@
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
@@ -163,9 +178,9 @@
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
@@ -178,7 +193,7 @@
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
@@ -1231,6 +1231,7 @@
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
@@ -1241,6 +1242,10 @@
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
@@ -1283,6 +1288,7 @@
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
@@ -1293,6 +1299,7 @@
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
@@ -761,13 +761,25 @@
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
@@ -1030,6 +1042,12 @@
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
@@ -1039,16 +1057,27 @@
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
@@ -1151,19 +1180,30 @@
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
@@ -1255,7 +1295,7 @@
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
@@ -1275,6 +1315,15 @@
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
@@ -68,7 +68,20 @@
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
@@ -154,7 +154,16 @@
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
@@ -67,7 +67,7 @@
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
@@ -191,7 +191,25 @@
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
@@ -320,7 +338,6 @@
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
@@ -90,7 +90,8 @@
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
@@ -14,8 +14,10 @@
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
@@ -100,7 +102,7 @@
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
@@ -252,9 +254,9 @@
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
@@ -20,6 +20,21 @@
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
@@ -177,15 +192,27 @@
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
@@ -17,6 +17,58 @@
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
@@ -318,3 +370,5 @@
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
@@ -19,7 +19,9 @@
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
@@ -38,11 +40,11 @@
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
@@ -52,19 +54,19 @@
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
@@ -75,13 +77,37 @@
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
@@ -91,3 +117,20 @@
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
@@ -93,6 +93,7 @@
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
@@ -118,6 +119,7 @@
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
@@ -1,4 +1,5 @@
2
 #include <QHBoxLayout>
3
+#include <QGridLayout>
4
 #include <QLabel>
5
 #include <QSpinBox>
6
 #include <QCheckBox>
7
@@ -10,21 +11,18 @@
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,10 +31,10 @@
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
@@ -44,16 +42,19 @@
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
@@ -65,14 +66,10 @@
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
@@ -86,32 +83,26 @@
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
@@ -121,25 +112,35 @@
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
@@ -167,15 +168,27 @@
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
@@ -190,6 +203,14 @@
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
@@ -230,26 +251,34 @@
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,37 +2,49 @@
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
@@ -40,13 +52,14 @@
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
@@ -25,6 +25,7 @@
2
 NameExists.Text="الاسم مستخدم حاليا."
3
 
4
 
5
+
6
 ConfirmRemove.Title="تأكيد الإزالة"
7
 ConfirmRemove.Text="هل أنت متأكد من رغبتك في إزالة '$1' ?"
8
 
9
@@ -163,8 +164,6 @@
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
@@ -172,6 +171,8 @@
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
@@ -188,6 +189,7 @@
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
@@ -197,3 +199,5 @@
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
@@ -25,6 +25,7 @@
2
 NameExists.Text="Името е вече използвано."
3
 
4
 
5
+
6
 ConfirmRemove.Title="Потвърди премахване"
7
 ConfirmRemove.Text="Наистина ли искате да премахнете \"$1\"?"
8
 
9
@@ -159,8 +160,6 @@
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
@@ -168,6 +167,8 @@
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
@@ -183,6 +184,7 @@
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
@@ -192,3 +194,5 @@
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
@@ -24,18 +24,45 @@
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
@@ -45,17 +72,27 @@
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
@@ -67,3 +104,8 @@
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
@@ -5,6 +5,8 @@
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
@@ -14,6 +16,7 @@
11
 MoveUp="Flyt Op"
12
 MoveDown="Flyt Ned"
13
 Settings="Indstillinger"
14
+Name="Navn"
15
 Exit="Afslut"
16
 Mixer="Mixer"
17
 Browse="Browse"
18
@@ -27,6 +30,9 @@
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
@@ -90,6 +96,8 @@
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
@@ -163,6 +171,7 @@
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
@@ -182,9 +191,13 @@
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
@@ -192,10 +205,23 @@
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
@@ -212,6 +238,7 @@
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
@@ -221,3 +248,14 @@
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
@@ -5,6 +5,8 @@
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
@@ -14,6 +16,7 @@
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
@@ -27,14 +30,17 @@
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
@@ -45,7 +51,7 @@
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
@@ -60,9 +66,9 @@
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
@@ -84,12 +90,14 @@
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
@@ -124,7 +132,7 @@
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
@@ -152,7 +160,7 @@
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
@@ -163,6 +171,7 @@
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
@@ -182,9 +191,13 @@
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
@@ -192,9 +205,32 @@
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
@@ -210,14 +246,34 @@
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
@@ -5,6 +5,8 @@
2
 OK="ΟΚ"
3
 Apply="Εφαρμογή"
4
 Cancel="Ακύρωση"
5
+Save="Αποθήκευση"
6
+Discard="Απόρριψη"
7
 Yes="Ναι"
8
 No="Όχι"
9
 Add="Προσθήκη"
10
@@ -14,6 +16,7 @@
11
 MoveUp="Μετακίνηση Πάνω"
12
 MoveDown="Μετακίνηση Κάτω"
13
 Settings="Ρυθμίσεις"
14
+Name="Όνομα"
15
 Exit="Έξοδος"
16
 Mixer="Μίξερ"
17
 Browse="Αναζήτηση"
18
@@ -27,6 +30,9 @@
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
@@ -90,6 +96,8 @@
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
@@ -129,9 +137,9 @@
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
@@ -163,6 +171,7 @@
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
@@ -182,9 +191,12 @@
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
@@ -192,9 +204,29 @@
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
@@ -212,6 +244,10 @@
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
@@ -221,3 +257,12 @@
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
@@ -10,6 +10,8 @@
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
@@ -19,6 +21,7 @@
11
 MoveUp="Move Up"
12
 MoveDown="Move Down"
13
 Settings="Settings"
14
+Name="Name"
15
 Exit="Exit"
16
 Mixer="Mixer"
17
 Browse="Browse"
18
@@ -33,6 +36,10 @@
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
@@ -109,6 +116,8 @@
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
@@ -214,9 +223,13 @@
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
@@ -224,9 +237,34 @@
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
@@ -260,6 +298,15 @@
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
@@ -267,4 +314,4 @@
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
@@ -5,6 +5,8 @@
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
@@ -14,6 +16,7 @@
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
@@ -27,6 +30,9 @@
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
@@ -90,6 +96,8 @@
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
@@ -163,6 +171,7 @@
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
@@ -182,9 +191,13 @@
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
@@ -192,9 +205,32 @@
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
@@ -212,6 +248,10 @@
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
@@ -221,3 +261,19 @@
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
@@ -5,6 +5,8 @@
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
@@ -14,6 +16,7 @@
11
 MoveUp="Mugitu Gora"
12
 MoveDown="Mugitu Behera"
13
 Settings="Ezarpenak..."
14
+Name="Izena"
15
 Exit="Irten"
16
 Mixer="Nahastzailea"
17
 Browse="Bilatu..."
18
@@ -27,6 +30,9 @@
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
@@ -90,6 +96,8 @@
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
@@ -163,6 +171,7 @@
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
@@ -182,9 +191,13 @@
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
@@ -192,9 +205,32 @@
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
@@ -212,6 +248,10 @@
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
@@ -221,3 +261,12 @@
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
@@ -5,6 +5,8 @@
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
@@ -14,6 +16,7 @@
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
@@ -27,6 +30,9 @@
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
@@ -91,6 +97,8 @@
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
@@ -164,6 +172,7 @@
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
@@ -183,9 +192,13 @@
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
@@ -193,9 +206,32 @@
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
@@ -213,6 +249,10 @@
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
@@ -222,3 +262,12 @@
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
@@ -1,10 +1,12 @@
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
@@ -14,12 +16,13 @@
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
@@ -27,10 +30,13 @@
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
@@ -52,17 +58,17 @@
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
@@ -90,6 +96,8 @@
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
@@ -116,102 +124,134 @@
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
@@ -221,3 +261,19 @@
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
@@ -5,6 +5,8 @@
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
@@ -14,6 +16,7 @@
11
 MoveUp="Subir"
12
 MoveDown="Baixar"
13
 Settings="Axustes"
14
+Name="Nome"
15
 Exit="Saír"
16
 Mixer="Mesturador"
17
 Browse="Explorar"
18
@@ -27,6 +30,9 @@
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
@@ -90,6 +96,8 @@
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
@@ -163,6 +171,7 @@
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
@@ -182,9 +191,13 @@
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
@@ -192,9 +205,29 @@
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
@@ -212,6 +245,10 @@
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
@@ -221,3 +258,18 @@
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
@@ -14,6 +14,7 @@
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
@@ -27,6 +28,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
@@ -90,6 +94,8 @@
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
@@ -163,6 +169,7 @@
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
@@ -182,9 +189,13 @@
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
@@ -192,9 +203,31 @@
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
@@ -212,6 +245,10 @@
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
@@ -221,3 +258,12 @@
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
@@ -14,6 +14,7 @@
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
@@ -27,6 +28,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
@@ -90,6 +94,8 @@
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
@@ -163,6 +169,7 @@
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
@@ -182,9 +189,13 @@
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
@@ -192,9 +203,31 @@
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
@@ -212,6 +245,10 @@
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
@@ -221,3 +258,12 @@
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
@@ -27,6 +27,7 @@
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
@@ -183,8 +184,6 @@
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
@@ -192,10 +191,10 @@
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
@@ -212,6 +211,7 @@
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
@@ -221,3 +221,5 @@
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
@@ -14,9 +14,10 @@
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
@@ -27,6 +28,9 @@
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
@@ -90,6 +94,8 @@
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
@@ -163,6 +169,7 @@
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
@@ -182,9 +189,13 @@
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
@@ -192,9 +203,32 @@
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
@@ -212,6 +246,10 @@
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
@@ -221,3 +259,12 @@
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
@@ -5,6 +5,8 @@
2
 OK="확인"
3
 Apply="적용"
4
 Cancel="취소"
5
+Save="저장"
6
+Discard="저장 안함"
7
 Yes="예"
8
 No="아니오"
9
 Add="추가"
10
@@ -14,6 +16,7 @@
11
 MoveUp="위로 올리기"
12
 MoveDown="아래로 내리기"
13
 Settings="설정"
14
+Name="이름"
15
 Exit="끝내기"
16
 Mixer="믹서"
17
 Browse="찾아보기"
18
@@ -27,6 +30,9 @@
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
@@ -90,6 +96,8 @@
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
@@ -163,6 +171,7 @@
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
@@ -182,9 +191,13 @@
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
@@ -192,9 +205,32 @@
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
@@ -212,6 +248,10 @@
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
@@ -221,3 +261,12 @@
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
@@ -5,6 +5,8 @@
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
@@ -14,6 +16,7 @@
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
@@ -27,6 +30,9 @@
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
@@ -90,6 +96,8 @@
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
@@ -163,6 +171,7 @@
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
@@ -182,9 +191,13 @@
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
@@ -192,9 +205,32 @@
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
@@ -212,6 +248,10 @@
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
@@ -221,3 +261,19 @@
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
@@ -14,6 +14,7 @@
2
 MoveUp="Omhoog Schuiven"
3
 MoveDown="Omlaag Schuiven"
4
 Settings="Instellingen"
5
+Name="Naam"
6
 Exit="Afsluiten"
7
 Mixer="Mixer"
8
 Browse="Bladeren"
9
@@ -27,6 +28,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
@@ -90,6 +94,8 @@
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
@@ -163,6 +169,7 @@
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
@@ -182,9 +189,13 @@
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
@@ -192,9 +203,32 @@
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
@@ -212,6 +246,10 @@
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
@@ -221,3 +259,12 @@
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
@@ -27,6 +27,7 @@
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
@@ -169,15 +170,14 @@
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
@@ -195,6 +195,7 @@
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
@@ -204,3 +205,5 @@
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
@@ -27,6 +27,7 @@
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
@@ -168,15 +169,14 @@
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
@@ -194,6 +194,7 @@
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
@@ -203,3 +204,5 @@
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
@@ -25,6 +25,7 @@
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
@@ -163,8 +164,6 @@
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
@@ -172,6 +171,8 @@
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
@@ -188,6 +189,7 @@
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
@@ -197,3 +199,5 @@
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
@@ -27,6 +27,7 @@
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
@@ -90,6 +91,8 @@
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
@@ -163,6 +166,7 @@
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
@@ -183,8 +187,6 @@
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
@@ -192,10 +194,10 @@
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
@@ -212,6 +214,10 @@
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
@@ -221,3 +227,11 @@
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
@@ -5,6 +5,8 @@
2
 OK="OK"
3
 Apply="Применить"
4
 Cancel="Отмена"
5
+Save="Сохранить"
6
+Discard="Отклонить"
7
 Yes="Да"
8
 No="Нет"
9
 Add="Добавить"
10
@@ -14,6 +16,7 @@
11
 MoveUp="Выше"
12
 MoveDown="Ниже"
13
 Settings="Настройки"
14
+Name="Название"
15
 Exit="Выход"
16
 Mixer="Микшер"
17
 Browse="Обзор"
18
@@ -27,6 +30,9 @@
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
@@ -90,6 +96,8 @@
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
@@ -163,6 +171,7 @@
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
@@ -182,9 +191,13 @@
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
@@ -192,9 +205,32 @@
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
@@ -212,6 +248,10 @@
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
@@ -221,3 +261,19 @@
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
@@ -27,6 +27,7 @@
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
@@ -160,8 +161,6 @@
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
@@ -169,9 +168,10 @@
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
@@ -186,7 +186,10 @@
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
@@ -27,6 +27,7 @@
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
@@ -169,8 +170,6 @@
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
@@ -178,10 +177,10 @@
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
@@ -198,6 +197,7 @@
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
@@ -207,3 +207,5 @@
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
@@ -14,6 +14,7 @@
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
@@ -27,6 +28,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
@@ -90,6 +94,8 @@
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
@@ -163,6 +169,7 @@
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
@@ -182,9 +189,13 @@
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
@@ -192,9 +203,31 @@
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
@@ -212,6 +245,10 @@
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
@@ -221,3 +258,12 @@
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
@@ -14,6 +14,7 @@
2
 MoveUp="Помери горе"
3
 MoveDown="Помери доле"
4
 Settings="Подешавања"
5
+Name="Име"
6
 Exit="Излаз"
7
 Mixer="Миксета"
8
 Browse="Претражи"
9
@@ -27,6 +28,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
@@ -90,6 +94,8 @@
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
@@ -163,6 +169,7 @@
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
@@ -182,9 +189,13 @@
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
@@ -192,9 +203,31 @@
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
@@ -212,6 +245,10 @@
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
@@ -221,3 +258,12 @@
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
@@ -5,6 +5,8 @@
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
@@ -14,6 +16,7 @@
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
@@ -27,6 +30,9 @@
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
@@ -90,6 +96,8 @@
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
@@ -163,6 +171,7 @@
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
@@ -182,9 +191,13 @@
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
@@ -192,9 +205,32 @@
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
@@ -212,6 +248,10 @@
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
@@ -221,3 +261,12 @@
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
@@ -1,5 +1,6 @@
2
 
3
 Language="ไทย"
4
+Region="ประเทศไทย"
5
 
6
 OK="ตกลง"
7
 Apply="นำไปใช้"
8
@@ -13,15 +14,18 @@
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
@@ -41,6 +45,7 @@
28
 
29
 Basic.Main.DefaultSceneName.Text="ฉาก %1"
30
 
31
+Basic.SourceSelect.CreateNew="สร้างใหม่"
32
 
33
 
34
 
35
@@ -48,6 +53,10 @@
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
@@ -58,6 +67,7 @@
47
 Basic.Main.StopRecording="หยุดบันทึก"
48
 Basic.Main.StopStreaming="หยุดสตรีมมิ่ง"
49
 
50
+Basic.MainMenu.File.Exit="อ&อก"
51
 
52
 
53
 Basic.MainMenu.Help.CheckForUpdates="ตรวจสอบการอัพเดต"
54
@@ -70,11 +80,15 @@
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
@@ -27,6 +27,7 @@
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
@@ -154,18 +155,16 @@
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
@@ -181,6 +180,7 @@
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
@@ -190,3 +190,5 @@
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
@@ -17,6 +17,7 @@
2
 
3
 
4
 
5
+
6
 LicenseAgreement.Exit="Вихід"
7
 
8
 
9
@@ -44,3 +45,8 @@
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
@@ -5,6 +5,8 @@
2
 OK="确定"
3
 Apply="应用"
4
 Cancel="取消"
5
+Save="保存"
6
+Discard="舍弃"
7
 Yes="是"
8
 No="否"
9
 Add="添加"
10
@@ -14,6 +16,7 @@
11
 MoveUp="上移"
12
 MoveDown="下移"
13
 Settings="设置"
14
+Name="名称"
15
 Exit="退出"
16
 Mixer="混音器"
17
 Browse="浏览"
18
@@ -24,14 +27,19 @@
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
@@ -48,6 +56,19 @@
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
@@ -72,8 +93,13 @@
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
@@ -119,6 +145,8 @@
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
@@ -143,9 +171,11 @@
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
@@ -161,29 +191,67 @@
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
@@ -193,3 +261,19 @@
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
@@ -27,6 +27,7 @@
2
 NoNameEntered.Title="請輸入有效的名稱"
3
 NoNameEntered.Text="您使用的名稱不能為空。"
4
 
5
+
6
 ConfirmRemove.Title="確認刪除?"
7
 ConfirmRemove.Text="您確定要刪除「$1」?"
8
 
9
@@ -167,8 +168,6 @@
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
@@ -176,8 +175,8 @@
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
@@ -195,6 +194,7 @@
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
@@ -204,3 +204,5 @@
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
@@ -30,6 +30,9 @@
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
@@ -69,10 +72,10 @@
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
@@ -85,7 +88,173 @@
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
@@ -113,13 +282,6 @@
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
@@ -197,7 +359,7 @@
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
@@ -225,13 +387,6 @@
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
@@ -303,78 +458,7 @@
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
@@ -444,6 +528,20 @@
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
@@ -455,7 +553,7 @@
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
@@ -658,11 +756,17 @@
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
@@ -87,6 +87,15 @@
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
@@ -115,9 +124,6 @@
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
@@ -134,6 +140,9 @@
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
@@ -280,7 +289,7 @@
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
@@ -298,7 +307,7 @@
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
@@ -483,6 +492,13 @@
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
@@ -490,6 +506,13 @@
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
@@ -500,20 +523,6 @@
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
@@ -524,13 +533,13 @@
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
@@ -540,7 +549,7 @@
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
@@ -588,16 +597,48 @@
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
@@ -606,7 +647,1177 @@
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
@@ -1085,6 +2296,206 @@
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
@@ -1130,12 +2541,12 @@
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
@@ -1157,7 +2568,7 @@
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
@@ -1173,7 +2584,7 @@
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
@@ -1222,7 +2633,7 @@
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
@@ -1231,7 +2642,7 @@
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
@@ -1247,7 +2658,7 @@
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
@@ -1267,5 +2678,213 @@
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
@@ -1,5 +1,6 @@
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
@@ -10,6 +11,7 @@
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
@@ -127,17 +127,20 @@
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
@@ -146,7 +149,13 @@
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
@@ -408,7 +417,7 @@
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
@@ -449,7 +458,7 @@
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
@@ -522,7 +531,7 @@
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
@@ -579,7 +588,6 @@
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
@@ -593,7 +601,7 @@
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
@@ -603,7 +611,7 @@
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
@@ -1,4 +1,5 @@
2
 #include <QFormLayout>
3
+#include <QScrollBar>
4
 #include <QLabel>
5
 #include <QCheckBox>
6
 #include <QFont>
7
@@ -42,12 +43,21 @@
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
@@ -73,6 +83,7 @@
31
 
32
    setWidgetResizable(true);
33
    setWidget(widget);
34
+   SetScrollPos(h, v);
35
    setSizePolicy(mainPolicy);
36
 
37
    lastFocused.clear();
38
@@ -82,18 +93,53 @@
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
@@ -497,6 +543,11 @@
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
@@ -696,7 +747,11 @@
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
@@ -55,16 +55,17 @@
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
@@ -83,16 +84,26 @@
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
@@ -137,11 +137,53 @@
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
@@ -6,6 +6,11 @@
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,6 +19,15 @@
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
@@ -1,5 +1,5 @@
2
 #include <QVBoxLayout>
3
-#include <QHBoxLayout>
4
+#include <QGridLayout>
5
 #include <QScrollArea>
6
 #include <QLabel>
7
 #include "window-basic-adv-audio.hpp"
8
@@ -18,49 +18,32 @@
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
@@ -128,8 +111,7 @@
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
@@ -5,6 +5,7 @@
2
 #include <vector>
3
 
4
 class OBSAdvAudioCtrl;
5
+class QGridLayout;
6
 
7
 // "Basic advanced audio"?  ...
8
 
9
@@ -13,6 +14,7 @@
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
@@ -0,0 +1,711 @@
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
@@ -0,0 +1,28 @@
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
@@ -36,6 +36,7 @@
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
@@ -62,10 +63,11 @@
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
@@ -80,6 +82,17 @@
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
@@ -282,36 +295,6 @@
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
@@ -319,14 +302,16 @@
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
@@ -341,8 +326,15 @@
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
@@ -364,49 +356,6 @@
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
@@ -441,7 +390,8 @@
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
@@ -455,9 +405,47 @@
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
@@ -498,7 +486,13 @@
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
@@ -547,9 +541,28 @@
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
@@ -562,7 +575,7 @@
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
@@ -583,10 +596,8 @@
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
@@ -616,6 +627,8 @@
293
    delete cpuUsageTimer;
294
    os_cpu_usage_info_destroy(cpuUsageInfo);
295
 
296
+   outputHandler.reset();
297
+
298
    if (interaction)
299
        delete interaction;
300
 
301
@@ -646,8 +659,12 @@
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
@@ -926,7 +943,7 @@
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
@@ -1319,6 +1336,13 @@
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
@@ -1532,10 +1556,31 @@
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
@@ -1611,6 +1656,11 @@
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
@@ -1646,7 +1696,7 @@
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
@@ -1775,7 +1825,7 @@
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
@@ -1837,7 +1887,7 @@
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
@@ -1956,7 +2006,9 @@
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
@@ -2023,7 +2075,10 @@
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
@@ -2135,7 +2190,7 @@
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
@@ -2166,7 +2221,6 @@
443
        errorMessage = Str("Output.ConnectFail.Disconnected");
444
    }
445
 
446
-   activeRefs--;
447
    ui->statusbar->StreamStopped();
448
 
449
    ui->streamButton->setText(QTStr("Basic.Main.StartStreaming"));
450
@@ -2180,89 +2234,23 @@
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
@@ -2274,48 +2262,11 @@
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
@@ -47,6 +47,8 @@
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
@@ -69,11 +71,8 @@
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
@@ -87,8 +86,6 @@
24
 
25
    ConfigFile    basicConfig;
26
 
27
-   int           activeRefs = 0;
28
-
29
    void          DrawBackdrop(float cx, float cy);
30
 
31
    void          SetupEncoders();
32
@@ -102,11 +99,6 @@
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
@@ -197,9 +189,13 @@
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
@@ -220,6 +216,9 @@
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
@@ -234,6 +233,7 @@
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
@@ -24,6 +24,7 @@
2
 #include <QCloseEvent>
3
 #include <QScreen>
4
 #include <QWindow>
5
+#include <QMessageBox>
6
 
7
 using namespace std;
8
 
9
@@ -31,6 +32,7 @@
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
@@ -39,20 +41,26 @@
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
@@ -60,6 +68,8 @@
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
@@ -92,6 +102,26 @@
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
@@ -154,10 +184,19 @@
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
@@ -188,3 +227,43 @@
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
@@ -18,8 +18,8 @@
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
@@ -34,20 +34,26 @@
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
@@ -114,24 +114,20 @@
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
@@ -139,6 +135,7 @@
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
@@ -148,7 +145,51 @@
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
@@ -167,12 +208,17 @@
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
@@ -194,12 +240,15 @@
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
@@ -230,25 +279,42 @@
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
@@ -279,6 +345,37 @@
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
@@ -323,19 +420,55 @@
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
@@ -365,6 +498,8 @@
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
@@ -376,14 +511,11 @@
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
@@ -449,6 +581,8 @@
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
@@ -461,6 +595,8 @@
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
@@ -468,6 +604,9 @@
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
@@ -478,14 +617,225 @@
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
@@ -583,16 +933,45 @@
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
@@ -606,6 +985,19 @@
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
@@ -639,13 +1031,70 @@
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
@@ -654,8 +1103,62 @@
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
@@ -692,12 +1195,19 @@
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
@@ -730,6 +1240,19 @@
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
@@ -759,26 +1282,32 @@
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
@@ -788,9 +1317,64 @@
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
@@ -816,10 +1400,14 @@
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
@@ -832,6 +1420,15 @@
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
@@ -870,6 +1467,17 @@
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
@@ -887,3 +1495,12 @@
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
@@ -37,21 +37,25 @@
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
@@ -59,8 +63,8 @@
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
@@ -71,9 +75,11 @@
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
@@ -82,19 +88,31 @@
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
@@ -103,23 +121,33 @@
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
@@ -127,9 +155,12 @@
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
@@ -11,6 +11,7 @@
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
@@ -0,0 +1,3 @@
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
@@ -0,0 +1,3 @@
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
@@ -0,0 +1,12 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
2
 X11SharedMemoryScreenInput="Σύλληψη Οθόνης (XSHM)"
3
 Screen="Οθόνη"
4
 CaptureCursor="Σύλληψη δρομέα"
5
+AdvancedSettings="Ρυθμίσεις για Προχωρημένους"
6
+XServer="X Server"
7
 XCCapture="Σύλληψη παραθήρου (XComposite)"
8
 Window="Παράθυρο"
9
 CropTop="Περικοπή Πάνω (pixels)"
10
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
2
 X11SharedMemoryScreenInput="画面キャプチャ (XSHM)"
3
 Screen="画面"
4
 CaptureCursor="カーソルをキャプチャ"
5
+AdvancedSettings="高度な設定"
6
+XServer="X サーバ"
7
 XCCapture="ウィンドウキャプチャ (Xcomposite)"
8
 Window="ウィンドウ"
9
 CropTop="上部クロップ(ピクセル)"
10
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
2
 X11SharedMemoryScreenInput="화면 캡쳐 (XSHM)"
3
 Screen="화면"
4
 CaptureCursor="커서 캡쳐"
5
+AdvancedSettings="고급 설정"
6
+XServer="X 서버"
7
 XCCapture="윈도우 캡쳐(Xcomposite)"
8
 Window="윈도우"
9
 CropTop="위쪽 자르기 (픽셀)"
10
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
2
 X11SharedMemoryScreenInput="Захват экрана (XSHM)"
3
 Screen="Экран"
4
 CaptureCursor="Захват курсора"
5
+AdvancedSettings="Дополнительные настройки"
6
+XServer="X-сервер"
7
 XCCapture="Захват окна (Xcomposite)"
8
 Window="Окно"
9
 CropTop="Обрезать сверху (пикселей)"
10
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -1,6 +1,8 @@
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
@@ -9,4 +11,5 @@
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
@@ -0,0 +1,15 @@
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
@@ -0,0 +1,32 @@
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
@@ -0,0 +1,3 @@
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
@@ -0,0 +1,149 @@
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
@@ -0,0 +1,160 @@
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
@@ -0,0 +1,51 @@
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
@@ -0,0 +1,28 @@
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
@@ -0,0 +1,4 @@
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
@@ -1,4 +1,4 @@
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
@@ -0,0 +1,4 @@
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
@@ -0,0 +1,9 @@
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
@@ -1,4 +1,4 @@
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
@@ -5,4 +5,5 @@
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
@@ -4,4 +4,5 @@
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
@@ -5,4 +5,5 @@
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
@@ -0,0 +1,9 @@
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
@@ -0,0 +1,5 @@
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
@@ -1,4 +1,4 @@
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
@@ -0,0 +1,5 @@
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
@@ -8,7 +8,7 @@
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
@@ -0,0 +1,21 @@
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
@@ -1,3 +1,4 @@
2
+Syphon="Indfang spil (Syphon)"
3
 Source="Kilde"
4
 LaunchSyphonInject="Kør SyphonInject"
5
 Inject="Indsæt"
6
@@ -8,4 +9,5 @@
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
@@ -1,3 +1,4 @@
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
@@ -1,3 +1,4 @@
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
@@ -1,3 +1,4 @@
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
@@ -1,3 +1,4 @@
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
@@ -1,3 +1,4 @@
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
@@ -1,3 +1,4 @@
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
@@ -1,3 +1,4 @@
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
@@ -1,3 +1,4 @@
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
@@ -1,3 +1,4 @@
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
@@ -1,3 +1,4 @@
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
@@ -1,3 +1,4 @@
2
+Syphon="Spillopptak (Syphon)"
3
 Source="Kilde"
4
 LaunchSyphonInject="Start SyphonInject"
5
 Inject="Injiser"
6
@@ -8,4 +9,5 @@
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
@@ -1,3 +1,4 @@
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
@@ -0,0 +1,2 @@
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
@@ -1,3 +1,4 @@
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
@@ -0,0 +1,12 @@
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
@@ -1,3 +1,4 @@
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
@@ -1,3 +1,4 @@
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
@@ -8,4 +8,5 @@
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
@@ -0,0 +1,13 @@
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
@@ -91,7 +91,7 @@
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
@@ -1,6 +1,6 @@
2
 project(obs-ffmpeg)
3
 
4
-if(WIN32)
5
+if(MSVC)
6
    set(obs-ffmpeg_PLATFORM_DEPS
7
        w32-pthreads)
8
 endif()
9
@@ -11,7 +11,8 @@
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
@@ -0,0 +1,115 @@
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
@@ -0,0 +1,4 @@
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
@@ -27,13 +27,23 @@
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
@@ -43,18 +53,13 @@
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
@@ -64,7 +69,7 @@
50
    AVFrame            *aframe;
51
    int                total_samples;
52
 
53
-   const char         *filename_test;
54
+   struct ffmpeg_cfg  config;
55
 
56
    bool               initialized;
57
 };
58
@@ -89,9 +94,12 @@
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
@@ -109,14 +117,41 @@
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
@@ -150,12 +185,11 @@
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
@@ -168,11 +202,9 @@
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
@@ -180,20 +212,21 @@
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
@@ -201,9 +234,13 @@
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
@@ -211,8 +248,14 @@
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
@@ -252,11 +295,12 @@
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
@@ -294,19 +338,19 @@
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
@@ -350,29 +394,24 @@
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
@@ -490,18 +529,16 @@
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
@@ -713,37 +750,47 @@
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
@@ -757,7 +804,7 @@
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
@@ -0,0 +1,4 @@
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,9 +2,14 @@
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
@@ -0,0 +1,5 @@
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
@@ -56,11 +56,11 @@
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
@@ -68,22 +68,29 @@
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
@@ -119,20 +126,25 @@
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
@@ -158,6 +170,7 @@
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
@@ -28,7 +28,7 @@
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
@@ -107,7 +107,7 @@
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
@@ -115,7 +115,7 @@
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
@@ -483,6 +483,7 @@
2
 
3
         return len + nSize;
4
     }
5
+    return len;
6
 }
7
 
8
 int
9
@@ -504,7 +505,7 @@
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
@@ -863,7 +864,7 @@
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
@@ -1078,7 +1079,7 @@
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
@@ -131,7 +131,7 @@
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
@@ -25,180 +25,9 @@
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
@@ -254,9 +83,10 @@
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
@@ -115,10 +115,10 @@
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
@@ -379,6 +379,8 @@
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
@@ -398,7 +400,7 @@
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
@@ -467,244 +469,6 @@
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
@@ -798,258 +562,18 @@
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
@@ -1100,36 +624,89 @@
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
@@ -1147,7 +724,7 @@
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
@@ -1156,12 +733,12 @@
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
@@ -1175,7 +752,7 @@
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
@@ -1302,27 +879,40 @@
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
@@ -1334,11 +924,17 @@
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
@@ -1405,9 +1001,9 @@
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
@@ -1437,7 +1033,7 @@
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
@@ -1445,7 +1041,7 @@
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
@@ -1651,7 +1247,7 @@
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
@@ -2112,7 +1708,7 @@
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
@@ -2130,7 +1726,7 @@
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
@@ -2142,7 +1738,7 @@
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
@@ -2160,7 +1756,7 @@
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
@@ -2172,7 +1768,7 @@
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
@@ -2190,7 +1786,7 @@
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
@@ -2201,12 +1797,9 @@
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
@@ -2216,7 +1809,7 @@
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
@@ -2224,7 +1817,7 @@
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
@@ -2487,7 +2080,7 @@
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
@@ -2497,7 +2090,7 @@
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
@@ -2508,8 +2101,8 @@
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
@@ -2555,7 +2148,7 @@
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
@@ -2565,7 +2158,7 @@
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
@@ -2578,7 +2171,7 @@
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
@@ -2826,6 +2419,17 @@
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
@@ -2875,8 +2479,9 @@
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
@@ -3064,6 +2669,9 @@
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
@@ -3119,7 +2727,7 @@
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
@@ -3127,6 +2735,8 @@
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
@@ -3248,10 +2858,6 @@
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
@@ -3317,15 +2923,19 @@
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
@@ -3336,29 +2946,34 @@
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
@@ -3924,8 +3539,9 @@
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
@@ -4028,7 +3644,10 @@
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
@@ -4083,6 +3702,8 @@
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
@@ -4244,7 +3865,7 @@
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
@@ -4388,7 +4009,7 @@
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
@@ -4492,13 +4113,16 @@
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
@@ -4510,6 +4134,9 @@
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
@@ -4562,6 +4189,7 @@
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
@@ -4607,8 +4235,13 @@
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
@@ -4700,7 +4333,7 @@
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
@@ -5339,8 +4972,8 @@
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
@@ -5386,6 +5019,7 @@
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
@@ -5403,6 +5037,7 @@
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
@@ -5471,14 +5106,14 @@
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
@@ -37,9 +37,12 @@
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
@@ -154,13 +157,22 @@
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
@@ -253,7 +265,7 @@
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
@@ -317,9 +329,6 @@
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
@@ -328,7 +337,7 @@
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
@@ -349,7 +358,7 @@
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
@@ -364,8 +373,8 @@
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
@@ -403,7 +412,7 @@
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
@@ -38,6 +38,7 @@
2
 
3
 #include <winsock2.h>
4
 #include <ws2tcpip.h>
5
+#include <Mstcpip.h>
6
 
7
 
8
 #ifdef _MSC_VER    /* MSVC */
9
@@ -72,6 +73,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
@@ -15,6 +15,8 @@
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
@@ -191,7 +191,7 @@
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
@@ -201,7 +201,7 @@
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
@@ -220,7 +220,7 @@
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
@@ -242,7 +242,7 @@
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
@@ -267,20 +267,26 @@
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
@@ -288,9 +294,13 @@
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
@@ -308,14 +318,18 @@
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
@@ -348,6 +362,7 @@
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
@@ -363,7 +378,7 @@
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
@@ -378,8 +393,7 @@
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
@@ -390,6 +404,20 @@
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
@@ -600,7 +628,8 @@
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
@@ -611,4 +640,4 @@
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
@@ -1,8 +1,6 @@
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
@@ -1,7 +1,5 @@
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
@@ -1,8 +1,11 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,7 +1,11 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,6 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,6 @@
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
@@ -1,8 +1,6 @@
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
@@ -1,8 +1,6 @@
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
@@ -1,8 +1,6 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,6 @@
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
@@ -1,8 +1,6 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,12 @@
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
@@ -1,8 +1,6 @@
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
@@ -0,0 +1,12 @@
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
@@ -1,8 +1,6 @@
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
@@ -90,11 +90,12 @@
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
@@ -111,24 +112,55 @@
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
@@ -136,12 +168,14 @@
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
@@ -324,12 +358,16 @@
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
@@ -0,0 +1,6 @@
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
@@ -7,10 +7,30 @@
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
@@ -91,36 +111,56 @@
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
@@ -277,11 +277,9 @@
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
@@ -302,7 +300,8 @@
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
@@ -311,13 +310,12 @@
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
@@ -338,8 +336,8 @@
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
@@ -7,7 +7,7 @@
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
@@ -5,7 +5,7 @@
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
@@ -0,0 +1,13 @@
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
@@ -172,11 +172,12 @@
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
@@ -26,7 +26,7 @@
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
@@ -133,7 +133,6 @@
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
@@ -152,7 +151,7 @@
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
@@ -22,7 +22,11 @@
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
@@ -1676,8 +1680,10 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -1,5 +1,5 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,6 +7,13 @@
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
@@ -7,4 +7,13 @@
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
@@ -0,0 +1,19 @@
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
@@ -203,20 +203,18 @@
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
@@ -271,8 +269,7 @@
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
@@ -6,7 +6,7 @@
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
@@ -86,6 +86,7 @@
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
@@ -352,14 +353,14 @@
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
@@ -542,7 +543,7 @@
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
@@ -738,7 +739,7 @@
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
@@ -838,6 +839,94 @@
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
@@ -863,7 +952,10 @@
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
@@ -884,18 +976,29 @@
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
@@ -943,6 +1046,14 @@
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
@@ -963,7 +1074,7 @@
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
@@ -992,8 +1103,7 @@
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
@@ -1028,7 +1138,7 @@
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
@@ -1146,8 +1256,6 @@
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
@@ -1173,6 +1281,7 @@
237
        return true;
238
    }
239
 
240
+   UNUSED_PARAMETER(ppts);
241
    return false;
242
 }
243
 
244
@@ -1191,12 +1300,14 @@
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
@@ -1271,6 +1382,8 @@
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
@@ -26,17 +26,17 @@
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
@@ -9,7 +9,7 @@
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
@@ -106,7 +106,7 @@
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
@@ -14,6 +14,7 @@
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
@@ -24,7 +25,7 @@
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
@@ -54,7 +54,7 @@
2
    };
3
 };
4
 
5
-struct d3d10_data data = {};
6
+static struct d3d10_data data = {};
7
 
8
 void d3d10_free(void)
9
 {
10
@@ -510,7 +510,7 @@
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
@@ -55,7 +55,7 @@
2
    };
3
 };
4
 
5
-struct d3d11_data data = {};
6
+static struct d3d11_data data = {};
7
 
8
 void d3d11_free(void)
9
 {
10
@@ -516,7 +516,7 @@
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
@@ -0,0 +1,302 @@
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(&parameters);
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
@@ -98,7 +98,7 @@
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
@@ -285,7 +285,7 @@
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
@@ -425,7 +425,7 @@
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
@@ -455,9 +455,9 @@
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
@@ -773,15 +773,15 @@
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,13 +2,46 @@
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
@@ -217,9 +217,9 @@
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,7 +2,7 @@
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
@@ -1,6 +1,10 @@
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
@@ -248,7 +252,7 @@
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
@@ -426,7 +430,7 @@
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
@@ -697,7 +701,6 @@
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
@@ -119,14 +119,10 @@
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,7 +2,6 @@
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
@@ -29,19 +28,19 @@
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
@@ -60,10 +59,10 @@
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
@@ -86,7 +85,7 @@
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
@@ -186,7 +185,7 @@
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
@@ -274,7 +273,7 @@
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
@@ -311,7 +310,7 @@
79
        rehook_gl();*/
80
    }
81
 
82
-   /*if (!d3d8_hooked) {
83
+   if (!d3d8_hooked) {
84
        if (!d3d8_hookable()) {
85
            d3d8_hooked = true;
86
        } else {
87
@@ -322,7 +321,7 @@
88
        }
89
    }
90
 
91
-   if (!ddraw_hooked) {
92
+   /*if (!ddraw_hooked) {
93
        if (!ddraw_hookable()) {
94
            ddraw_hooked = true;
95
        } else {
96
@@ -401,87 +400,6 @@
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
@@ -508,7 +426,7 @@
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
@@ -521,40 +439,13 @@
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
@@ -581,7 +472,7 @@
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
@@ -589,9 +480,9 @@
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
@@ -675,7 +566,7 @@
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
@@ -686,7 +577,7 @@
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
@@ -702,7 +593,7 @@
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
@@ -781,7 +672,7 @@
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
@@ -1,14 +1,17 @@
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
@@ -17,19 +20,19 @@
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
@@ -49,7 +52,7 @@
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
@@ -77,6 +80,129 @@
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
@@ -25,14 +25,14 @@
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
@@ -7,7 +7,6 @@
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
@@ -21,7 +20,7 @@
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
@@ -20,6 +20,11 @@
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
@@ -61,7 +66,7 @@
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
@@ -229,11 +229,8 @@
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
@@ -1,5 +1,9 @@
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
@@ -7,8 +7,6 @@
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
@@ -50,7 +50,9 @@
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
@@ -4,7 +4,6 @@
2
 ConfigureCrossbar="تكوين العارضة"
3
 ResFPSType="نوع الأبعاد/FPS"
4
 ResFPSType.Custom="مخصص"
5
-ResFPSType.DevPreferred="الجهاز المفضل"
6
 FPS.Matching="تطابق إخراج FPS"
7
 FPS.Highest="أعلى FPS"
8
 Resolution="الأبعاد"
9
@@ -12,3 +11,4 @@
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,9 +2,9 @@
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
@@ -1,11 +1,15 @@
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
@@ -14,4 +18,11 @@
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
@@ -1,11 +1,16 @@
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
@@ -14,4 +19,14 @@
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
@@ -5,7 +5,7 @@
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
@@ -14,4 +14,12 @@
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
@@ -1,6 +1,11 @@
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
@@ -24,5 +29,5 @@
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
@@ -5,7 +5,7 @@
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
@@ -14,4 +14,12 @@
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
@@ -5,7 +5,7 @@
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
@@ -14,4 +14,12 @@
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
@@ -14,4 +14,12 @@
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
@@ -1,11 +1,16 @@
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
@@ -14,4 +19,12 @@
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
@@ -5,7 +5,7 @@
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
@@ -14,4 +14,12 @@
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
@@ -5,7 +5,7 @@
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
@@ -14,4 +14,12 @@
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
@@ -5,7 +5,7 @@
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
@@ -14,4 +14,12 @@
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
@@ -5,7 +5,6 @@
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
@@ -15,3 +14,4 @@
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
@@ -5,7 +5,7 @@
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
@@ -14,4 +14,12 @@
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
@@ -5,7 +5,7 @@
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
@@ -14,4 +14,12 @@
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
@@ -1,11 +1,16 @@
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
@@ -14,4 +19,14 @@
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
@@ -5,7 +5,7 @@
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
@@ -14,4 +14,12 @@
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
@@ -5,7 +5,6 @@
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
@@ -15,3 +14,4 @@
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
@@ -5,7 +5,6 @@
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
@@ -15,3 +14,4 @@
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
@@ -4,7 +4,6 @@
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
@@ -12,3 +11,4 @@
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
@@ -5,7 +5,7 @@
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
@@ -14,4 +14,12 @@
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
@@ -1,11 +1,16 @@
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
@@ -14,4 +19,12 @@
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
@@ -14,3 +14,4 @@
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
@@ -5,7 +5,6 @@
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
@@ -15,3 +14,4 @@
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
@@ -5,7 +5,7 @@
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
@@ -14,4 +14,12 @@
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
@@ -5,7 +5,7 @@
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
@@ -14,4 +14,12 @@
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
@@ -5,7 +5,7 @@
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
@@ -14,4 +14,12 @@
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,3 +2,4 @@
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
@@ -5,7 +5,6 @@
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
@@ -15,3 +14,4 @@
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
@@ -0,0 +1,32 @@
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
@@ -4,7 +4,6 @@
2
 ConfigureCrossbar="設定影像格式"
3
 ResFPSType="解析度/FPS 類型"
4
 ResFPSType.Custom="自訂"
5
-ResFPSType.DevPreferred="裝置建議值"
6
 FPS.Matching="符合輸出 FPS"
7
 FPS.Highest="最大化 FPS"
8
 Resolution="解析度"
9
@@ -12,3 +11,4 @@
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
@@ -125,11 +125,9 @@
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
@@ -178,7 +176,7 @@
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
@@ -23,7 +23,7 @@
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
@@ -32,7 +32,7 @@
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
@@ -31,7 +31,7 @@
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
@@ -0,0 +1,136 @@
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
@@ -86,7 +86,7 @@
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
@@ -95,7 +95,7 @@
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
@@ -110,7 +110,7 @@
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
@@ -120,7 +120,7 @@
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
@@ -131,7 +131,7 @@
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
@@ -140,7 +140,7 @@
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
@@ -156,17 +156,16 @@
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
@@ -186,7 +185,7 @@
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
@@ -222,19 +221,18 @@
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
@@ -1,32 +1,61 @@
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
@@ -40,6 +40,10 @@
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
@@ -182,9 +186,13 @@
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
@@ -340,6 +348,7 @@
28
 
29
 public:
30
    inline MiscFlagsHandler() {}
31
+   virtual ~MiscFlagsHandler() {}
32
 
33
    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
34
    {
35
@@ -383,6 +392,10 @@
36
 {
37
 }
38
 
39
+CaptureFilter::~CaptureFilter()
40
+{
41
+}
42
+
43
 // IUnknown methods
44
 STDMETHODIMP CaptureFilter::QueryInterface(REFIID riid, void **ppv)
45
 {
46
@@ -528,12 +541,15 @@
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
@@ -603,8 +619,11 @@
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
@@ -42,7 +42,7 @@
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
@@ -51,6 +51,7 @@
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
@@ -91,13 +92,14 @@
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
@@ -126,12 +128,13 @@
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
@@ -146,12 +149,13 @@
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
@@ -209,7 +209,7 @@
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
@@ -222,7 +222,7 @@
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
@@ -241,7 +241,7 @@
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
@@ -262,7 +262,7 @@
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
@@ -328,7 +328,7 @@
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
@@ -372,7 +372,7 @@
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
@@ -397,7 +397,7 @@
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
@@ -409,7 +409,7 @@
65
        return false;
66
    }
67
 
68
-   CComQIPtr<IAMStreamConfig> pinConfig(pin);
69
+   ComQIPtr<IAMStreamConfig> pinConfig(pin);
70
 
71
    if (config.useDefaultConfig) {
72
        MediaTypePtr defaultMT;
73
@@ -458,7 +458,7 @@
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
@@ -493,8 +493,8 @@
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
@@ -534,7 +534,7 @@
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
@@ -614,7 +614,7 @@
103
 
104
 void HDevice::DisconnectFilters()
105
 {
106
-   CComPtr<IEnumFilters> filterEnum;
107
+   ComPtr<IEnumFilters>  filterEnum;
108
    HRESULT               hr;
109
 
110
    if (!graph)
111
@@ -624,11 +624,10 @@
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
@@ -47,15 +47,15 @@
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
@@ -33,9 +33,9 @@
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
@@ -73,8 +73,8 @@
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
@@ -93,13 +93,11 @@
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
@@ -141,7 +139,7 @@
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
@@ -170,7 +168,7 @@
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
@@ -202,7 +200,7 @@
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
@@ -258,8 +256,8 @@
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
@@ -274,8 +272,6 @@
79
            (*pin)->AddRef();
80
            return true;
81
        }
82
-
83
-       curPin.Release();
84
    }
85
 
86
    return false;
87
@@ -284,8 +280,8 @@
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
@@ -300,8 +296,6 @@
99
            *pin = curPin.Detach();
100
            return true;
101
        }
102
-
103
-       curPin.Release();
104
    }
105
 
106
    return false;
107
@@ -309,8 +303,8 @@
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
@@ -326,8 +320,6 @@
119
            *pin = curPin.Detach();
120
            return true;
121
        }
122
-
123
-       curPin.Release();
124
    }
125
 
126
    return false;
127
@@ -336,13 +328,13 @@
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
@@ -358,9 +350,9 @@
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
@@ -385,8 +377,6 @@
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
@@ -394,7 +384,7 @@
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
@@ -418,15 +408,15 @@
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
@@ -441,8 +431,6 @@
194
            if (graph->ConnectDirect(pin, curPin, nullptr) == S_OK)
195
                return true;
196
        }
197
-
198
-       curPin.Release();
199
    }
200
 
201
    return false;
202
@@ -451,8 +439,8 @@
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
@@ -468,8 +456,6 @@
214
            if (DirectConnectOutputPin(graph, curPin, filterIn))
215
                connected = true;
216
        }
217
-
218
-       curPin.Release();
219
    }
220
 
221
    return connected;
222
@@ -477,7 +463,7 @@
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
@@ -22,7 +22,6 @@
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
@@ -30,6 +29,7 @@
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
@@ -43,14 +43,14 @@
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
@@ -72,7 +72,10 @@
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
@@ -110,14 +113,14 @@
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
@@ -136,7 +139,10 @@
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
@@ -31,8 +31,8 @@
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
@@ -109,7 +109,7 @@
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
@@ -174,7 +174,7 @@
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
@@ -194,9 +194,9 @@
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
@@ -36,7 +36,7 @@
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
@@ -52,7 +52,7 @@
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
@@ -152,6 +152,9 @@
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
@@ -236,7 +239,7 @@
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
@@ -263,6 +266,9 @@
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
@@ -274,7 +280,7 @@
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
@@ -338,7 +344,7 @@
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
@@ -397,8 +403,8 @@
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
@@ -430,7 +436,7 @@
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
@@ -446,9 +452,9 @@
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
@@ -471,8 +477,6 @@
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
@@ -20,6 +20,8 @@
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
@@ -29,6 +31,8 @@
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
@@ -125,7 +125,7 @@
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
@@ -141,7 +141,7 @@
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
@@ -157,8 +157,8 @@
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
@@ -208,7 +208,7 @@
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
@@ -222,8 +222,8 @@
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
@@ -269,7 +269,7 @@
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
@@ -30,7 +30,7 @@
2
 
3
 HVideoEncoder::~HVideoEncoder()
4
 {
5
-   CComPtr<IEnumFilters> filterEnum;
6
+   ComPtr<IEnumFilters> filterEnum;
7
    IBaseFilter *filter;
8
    HRESULT hr;
9
 
10
@@ -54,10 +54,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
@@ -110,7 +110,7 @@
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
@@ -130,8 +130,8 @@
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
@@ -199,9 +199,9 @@
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
@@ -296,7 +296,7 @@
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
@@ -350,8 +350,8 @@
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
@@ -44,14 +44,14 @@
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
@@ -39,6 +39,10 @@
2
 {
3
 }
4
 
5
+OutputPin::~OutputPin()
6
+{
7
+}
8
+
9
 STDMETHODIMP OutputPin::QueryInterface(REFIID riid, void **ppv)
10
 {
11
    if (riid == IID_IUnknown) {
12
@@ -88,7 +92,7 @@
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
@@ -103,13 +107,12 @@
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
@@ -173,7 +176,6 @@
37
 
38
    if (!!allocator) {
39
        allocator->Decommit();
40
-       allocator.Release();
41
    }
42
 
43
    connectedPin = nullptr;
44
@@ -229,9 +231,13 @@
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
@@ -318,10 +324,10 @@
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
@@ -375,6 +381,7 @@
73
 
74
 public:
75
    inline SourceMiscFlags() {}
76
+   virtual ~SourceMiscFlags() {}
77
 
78
    STDMETHODIMP QueryInterface(REFIID riid, void **ppv)
79
    {
80
@@ -418,6 +425,10 @@
81
 {
82
 }
83
 
84
+OutputFilter::~OutputFilter()
85
+{
86
+}
87
+
88
 // IUnknown methods
89
 STDMETHODIMP OutputFilter::QueryInterface(REFIID riid, void **ppv)
90
 {
91
@@ -567,12 +578,15 @@
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
@@ -642,8 +656,11 @@
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
@@ -41,16 +41,17 @@
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
@@ -89,13 +90,14 @@
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
@@ -131,12 +133,13 @@
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
@@ -151,12 +154,13 @@
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
@@ -160,6 +160,7 @@
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
@@ -95,5 +95,8 @@
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
@@ -39,6 +39,8 @@
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
@@ -60,6 +62,11 @@
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
@@ -223,6 +230,8 @@
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
@@ -569,6 +578,9 @@
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
@@ -828,6 +840,29 @@
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
@@ -849,13 +884,14 @@
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
@@ -907,6 +943,8 @@
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
@@ -1399,7 +1437,6 @@
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
@@ -1411,7 +1448,6 @@
108
            return false;
109
 
110
        dstr_cat(name, obs_property_list_item_name(list, i));
111
-       fps_found = true;
112
        break;
113
    }
114
 
115
@@ -1628,6 +1664,17 @@
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
@@ -0,0 +1,6 @@
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
@@ -5,8 +5,24 @@
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
@@ -27,13 +27,13 @@
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
@@ -72,11 +72,7 @@
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
@@ -299,7 +295,7 @@
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
@@ -494,8 +490,7 @@
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,7 +2,7 @@
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
@@ -198,7 +198,7 @@
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