We truncated the diff of some files because they were too big.
If you want to see the full diff for every file, click here.
Changes of Revision 45
obs-studio.changes
Changed
x
1
2
-------------------------------------------------------------------
3
+Tue May 02 19:05:40 UTC 2017 - jimmy@boombatower.com
4
+
5
+- Update to version 18.0.2:
6
+ * UI/updater: Fix temp files being created and not deleted
7
+ * UI/updater: Fix potential fail case when no files to patch
8
+ * UI/updater: Fixed a bug with deflating
9
+ * UI/updater: Ignore 64bit files on 32bit windows
10
+ * CI: Use ccache to speed up the build
11
+ * CI: OSX - Fix obs.png
12
+ * UI/updater: Fix incorrect inflate use
13
+ * CI: Linux - Install libfdk-aac-dev
14
+ * image-source: Move file modification check before animation processing
15
+ * UI: Add workaround to fix deleting final scene bug
16
+ * rtmp-services: Update ingest list for Restream.io
17
+ * rtmp-services: Update maximum bitrate for Twitch
18
+ * UI: Fix segfault when no system tray exists
19
+ * CI: Linux - Install FFmpeg from source
20
+ * obs-ffmpeg/nvenc: Remove "default" preset
21
+ * libobs: Add obs_source_copy_filters function
22
+ * UI: Add copying/pasting of sources/filters
23
+ * UI: Disable filter pasting when scene collection changed
24
+ * UI: Fix bug where items can't be deleted in last scene
25
+ * libobs: Remove unimplemented exports
26
+ * rtmp-services: Add Livestream service
27
+ * win-dshow: Fix issue with activating when not set to
28
+ * rtmp-services: Update Picarto maximum bitrates
29
+ * libobs: Delay stop detection of audio source
30
+ * libobs: Allow source to fully control source flags (for now)
31
+ * libobs: Add ability to preload async frames
32
+ * libobs: Remove multiple calls to free_type_data
33
+ * deps: Add media-playback static lib
34
+ * obs-ffmpeg: Change from libff to media-playback
35
+ * deps/libff: Remove network init
36
+ * UI: Remove libff as a dependency
37
+ * deps/libff: Don't build libff (deprecated)
38
+ * obs-ffmpeg: Remove unnecessary open call
39
+ * obs-ffmpeg: Always open on update unless set otherwise
40
+ * obs-ffmpeg: Fix bug on non-MSVC compilers
41
+ * UI: Fix property widgets not being disabled
42
+ * mac-avcapture: Ability to directly add iOS devices over USB
43
+ * audio-monitoring: Add ability to monitor Outputs
44
+ * decklink: Add option to select channel format
45
+ * decklink: Add workaround for audio timestamp jump issue
46
+ * Improve README/CONTRIBUTING files
47
+ * win-dshow: Fix reallocation issue in ffmpeg-decode
48
+ * UI: Add window name to remux dialog
49
+ * UI: Hide OpenGL and D3D adapter on Windows
50
+ * UI: Continue to show OpenGL if already in use
51
+ * UI: Increase MAX_CRASH_REPORT_SIZE to 150 KB
52
+ * CI: Use webhooks for notifications
53
+ * CI: Fix notification frequency
54
+ * libobs-opengl: Log OpenGL version on all systems
55
+ * Fix various typos across multiple modules
56
+ * Update Linux kernel coding style URL in CONTRIBUTING
57
+ * UI: Ctrl+E to Edit Transform
58
+ * UI: Remove unused defines from old updater code
59
+ * win-capture: Log if shared texture capture is unavailable
60
+ * win-capture: Update get-graphics-offsets
61
+ * win-capture: Add missing 32 bit offsets
62
+ * win-capture: Fix and clarify window capture prioritization
63
+ * UI: Add front-end API functions to get/modify service
64
+ * UI: Display filename when dragging & dropping
65
+ * obs-outputs: Always call RTMP_Init before connecting
66
+ * UI: Make sure all dialogs have close buttons
67
+ * UI: Add command line option for starting up always on top
68
+ * frontend-tools: Rename some files
69
+ * frontend-plugins: Abstract captions
70
+ * enc-amf: Update to v2.1.0(.0)
71
+ * win-ivcam: Fix potential null pointer dereference
72
+ * libobs: Update to 18.0.2 (windows hotfix)
73
+ * UI/updater: Add opt to disable building update module
74
+
75
+-------------------------------------------------------------------
76
Tue Mar 07 05:13:13 UTC 2017 - jimmy@boombatower.com
77
78
- Update to version 18.0.1:
79
obs-studio.spec
Changed
8
1
2
Name: obs-studio
3
-Version: 18.0.1
4
+Version: 18.0.2
5
Release: 0
6
Summary: A recording/broadcasting program
7
8
_service
Changed
10
1
2
<services>
3
<service name="tar_scm" mode="disabled">
4
<param name="versionformat">@PARENT_TAG@</param>
5
- <param name="revision">refs/tags/18.0.1</param>
6
+ <param name="revision">refs/tags/18.0.2</param>
7
<param name="url">git://github.com/jp9000/obs-studio.git</param>
8
<param name="scm">git</param>
9
<param name="changesgenerate">enable</param>
10
_servicedata
Changed
9
1
2
<servicedata>
3
<service name="tar_scm">
4
<param name="url">git://github.com/jp9000/obs-studio.git</param>
5
- <param name="changesrevision">bc9a58174b75c445dcb14259443a74746f0b3d43</param>
6
+ <param name="changesrevision">4684294bcd53193f4227fb31214a6417fdcd2b97</param>
7
</service>
8
</servicedata>
9
obs-studio-18.0.1.tar.xz/CONTRIBUTING
Deleted
66
1
2
-Contributing Information:
3
-
4
- - Our bug tracker is located at (currently linked to forum accounts):
5
- https://obsproject.com/mantis/
6
-
7
- - Development forums are currently located at:
8
- https://obsproject.com/forum/list/general-development.21/
9
-
10
- - Development IRC channel is primarily #obs-dev on QuakeNet
11
-
12
- - To contribute translations, see:
13
- https://obsproject.com/forum/threads/how-to-contribute-translations-for-obs.16327/
14
-
15
-
16
-Contributing Guidelines:
17
-
18
- - Code and commits will be reviewed. Reviews will be blunt and honest, and
19
- your change probably won't go through the first time, or may be outright
20
- rejected. It may require many revisions before changes are finally
21
- accepted.
22
-
23
- - If you want to avoid doing a lot of work only to have it rejected, discuss
24
- what you want to change it in the main channels/forums/mailing lists before
25
- actually working on it. Open source requires thick skin. Please don't be
26
- discouraged if your changes don't go through, learn from it and get better.
27
-
28
- - Coding style is Linux-style KNF (kernel normal form). This means K&R, 80
29
- columns max, preferable maximum function length of approximately 42 lines, 8
30
- character width tabs, lower_case_names, etc. I chose this for the sake of
31
- the project. Don't argue about it, just do it. It takes no time to do.
32
-
33
- See https://www.kernel.org/doc/Documentation/CodingStyle for a general
34
- guideline (though not necessarily a rulebook, for example we allow the use
35
- of boolean return values instead of ints for failure).
36
-
37
- NOTE: C++ is an exception to the lower_case_only rule, CamelCase is
38
- encouraged (though not required) to distinguish it from C code. Just a
39
- personal and subjective stylistic thing on my part.
40
-
41
- - Commits are not just changes to code; they should also be treated as
42
- annotation to code. For that reason, do not put unrelated changes in a
43
- single commit. Separate out different changes in to different commits, and
44
- make separate pull requests for unrelated changes. Commits should be
45
- formatted with the 50/72 standard, and should be descriptive and concise.
46
- See http://chris.beams.io/posts/git-commit/ for a summary of how to make
47
- good commit messages.
48
-
49
- - Core code is C only (unless there's an operating system specific thing that
50
- absolutely requires another language).
51
-
52
- - Modules and UI may use C, C++, or Objective-C (for apple), though please try
53
- to use C unless an API you're using requires C++ or Objective-C (such as
54
- windows COM classes, or apple Objective-C APIs).
55
-
56
- - If you don't quite know what to work on and just want to help, the bug
57
- tracker has a list of things that need to be worked on.
58
-
59
- - Try to respect the wishes of the author(s)/maintainer(s). A good maintainer
60
- will always listen, and will often ask others on the project for their
61
- opinions, but don't expect things to be completely democratic.
62
-
63
- - Do not use dependencies for the sake of convenience. There's enough
64
- dependencies as it is. Use them only if you absolutely have to depend on
65
- them.
66
obs-studio-18.0.1.tar.xz/README
Deleted
176
1
2
-
3
-What is OBS?
4
-
5
- This project is a rewrite of what was formerly known as "Open Broadcaster
6
- Software", software originally designed for recording and streaming live
7
- video content, efficiently.
8
-
9
-Bug Tracker: https://obsproject.com/mantis/
10
-
11
- We are no longer using GitHub issues! Please use Mantis, and only report
12
- bugs and major issues. Do NOT use mantis to ask questions or request
13
- features, please keep that to the forums.
14
-
15
- Forum accounts are now linked to Mantis Bug Tracker. To use the bug
16
- tracker, simply log in to the forums and then go to the bug tracker link
17
- above.
18
-
19
-What's the goal of rewriting OBS?
20
-
21
- - Make it multiplatform. Use multiplatform libraries/functions/classes where
22
- possible to allow this. Multi-platform support was one of the primary
23
- reasons for the rewrite. This also means using a UI toolkit will be
24
- necessary for user interface. It also means allowing the use of OpenGL as
25
- well as Direct3D.
26
-
27
- - Separate the application from the core, allowing custom application of
28
- the core if desired, and easier extending of the user interface.
29
-
30
- - Simplify complex systems to not only make it easier to use, but easier to
31
- maintain.
32
-
33
- - Write a better core API, and design the entire system to be modular.
34
-
35
- - Now that we have much more experience, improve the overall design of all
36
- the subsystems/API, and minimize/eliminate design flaws. Make it so we can
37
- do all the things we've had trouble with before, such as custom outputs,
38
- multiple outputs at once, better handling of inputs, custom services.
39
-
40
- - Make a better/cleaner code base, use better coding standards, use standard
41
- libraries where possible (not just STL and C standard library, but also
42
- things like ffmpeg as well), and improve maintainability of the project as a
43
- whole.
44
-
45
- - Implement a new API-independent shader/effect system allowing better and
46
- easier shaders usage and customization without having to duplicate shader
47
- code.
48
-
49
- - Better device support. Again, I didn't know what I was getting into when
50
- I originally started writing code for devices. It evolved into a totally
51
- convoluted mess. I would have improved the existing device plugin code, but
52
- it was just all so fundamentally bad and flawed that it would have been
53
- detrimental to progression to continue working on it rather than rewrite it.
54
-
55
-
56
-What was wrong with the original OBS?
57
-
58
- The original OBS was rewritten not because it was bad, at least in terms of
59
- optimization. Optimization and graphics are things I love. However, there
60
- were some serious problems with the code and design that were deep and
61
- fundamental, which prevented myself and other developers from being able to
62
- improve/extend the application or add new features very easily.
63
-
64
- First, the design flaws:
65
-
66
- - The original OBS was completely and hopelessly hard-coded for windows,
67
- and only windows. It was just totally impossible to use it on other
68
- systems.
69
-
70
- - All the sub-systems were written before I really knew what I was getting
71
- into. When I started the project, I didn't really fully comprehend the
72
- scope of what I would need or how to properly design the project. My
73
- design and plans for the application were just to write something that
74
- would "stream games and a webcam, with things like overlays and such."
75
- This turned out fine for most casual gamers and streamers (and very
76
- successful), but left anyone wanting to do anything more advanced left
77
- massively wanting.
78
-
79
- - Subsystems and core functionalities intermingled in such a way that it
80
- was a nightmare to get proper custom functionality out of it. Things
81
- like QSV had to be meshed in with the main encoding loop, and it just
82
- made things a nightmare to deal with. Custom outputs were nigh
83
- impossible.
84
-
85
- - The API was poorly designed because most of it came after I originally
86
- wrote the application, it was more of an afterthought, and plugin API
87
- would routinely break for plugin developers due to changing C++
88
- interfaces (one of the reasons the core is now C).
89
-
90
- - API was intermeshed with the main executable. The OBSApi DLL was
91
- nothing more than basically this mutant growth upon OBS.exe that allowed
92
- plugin developers to barely write plugins, but all the important API
93
- code was actually stored in the executable. Navigation was a total mess.
94
-
95
- - The graphics subsystem, while not bad, was incomplete, and though far
96
- easier to use than bare D3D, wasn't ideal, and was hard-coded for D3D
97
- specifically.
98
-
99
- - The devices and audio code was poor, I had no idea what I was getting into
100
- when I started writing them in. I did not realize beforehand all the
101
- device-specific quirks that each device/system could have. Some devices
102
- had bad timing and quirks that I never anticipated while writing them.
103
- I struggled with devices, and my original design for the audio subsystem
104
- for example morphed over and over into an abomination that, though works,
105
- is basically this giant duct-taped zombie monster.
106
-
107
- - Shaders were difficult to customize because they had to be duplicated if
108
- you wanted slightly different functionality that required more than just
109
- changing shader constants.
110
-
111
- - Orientation of sources was fixed, and required special code for each
112
- source to do any custom modification of rotation/position/scale/etc.
113
- This is one of those fundamental flaws that I look back on and regret, as
114
- it was a stupid idea from the beginning. I originally thought I could
115
- get more accurate source position/sizes, but it just turned out to be
116
- totally bad. Should have been matrices from the beginning just like with
117
- a regular 3D engine.
118
-
119
- Second, the coding flaws:
120
-
121
- - The coding style was inconsistent.
122
-
123
- - C++98, C-Style C++, there was no exception usage, no STL. C++ used
124
- poorly.
125
-
126
- - Not Invented Here Syndrome everywhere. Custom string functions/classes,
127
- custom templates, custom everything everywhere. To be fair, it was all
128
- hand-me-down code from the early 2000s that I had become used to, but
129
- that was no excuse -- C-standard libraries and the STL should have been
130
- used from the beginning over anything else. That doesn't mean to say
131
- that using custom stuff is always bad, but doing it to the extent I did
132
- definitely was. Made it horrible to maintain as well, required extra
133
- knowledge for plugin developers and anyone messing with the code.
134
-
135
- - Giant monolithic classes everywhere, the main OBS class was paricularly
136
- bad in this regard. This meant navigation was a nightmare, and no one
137
- really knew where to go or where to add/change things.
138
-
139
- - Giant monolithic functions everywhere. This was particularly bad
140
- because it meant that functions became harder to debug and harder to
141
- keep track of what was going on in any particular function at any given
142
- time. These large functions, though not inefficient, were delicate and
143
- easily breakable. (See OBS::MainCaptureLoop for a nightmarish example,
144
- or the listbox subclass window procedure in WindowStuff.cpp)
145
-
146
- - Very large file sizes with everything clumped up into single files (for
147
- another particularly nightmarish example, see WindowStuff.cpp)
148
-
149
- - Bad formatting. Code could go beyond 200 columns in some cases, making
150
- it very unpleasant to read with many editors. Spaces instead of tabs,
151
- K&R mixed with allman (which was admittedly my fault).
152
-
153
-
154
-New (actual) coding guidelines
155
-
156
- - For the C code (especially in the core), guidelines are pretty strict K&R,
157
- kernel style. See the linux kernel "CodingStyle" document for more
158
- information. That particular coding style guideline is for more than just
159
- style, it actually helps produce a better overall code base.
160
-
161
- - For C++ code, I still use CamelCase instead of all_lowercase just because
162
- I prefer it that way, it feels right with C++ for some reason. It also
163
- helps make it distinguishable from C code.
164
-
165
- - I've started using 8-column tabs for almost everything -- I really
166
- personally like it over 4-column tabs. I feel that 8-column tabs are very
167
- helpful in preventing large amounts of indentation. A self-imposed
168
- limitation, if you will. I also use actual tabs now, instead of spaces.
169
- Also, I feel that the K&R style looks much better/cleaner when viewed with
170
- 8-column tabs.
171
-
172
- - Preferred maximum columns: 80. I've also been doing this because in
173
- combination with 8-column tabs, it further prevents large/bad functions
174
- with high indentation. Another self-imposed limitation. Also, it makes
175
- for much cleaner viewing in certain editors that wrap (like vim).
176
obs-studio-18.0.1.tar.xz/UI/frontend-plugins/frontend-tools/captions-stream.cpp
Deleted
201
1
2
-#include "captions-stream.hpp"
3
-#include <mmreg.h>
4
-#include <util/windows/CoTaskMemPtr.hpp>
5
-#include <util/threading.h>
6
-#include <util/base.h>
7
-
8
-using namespace std;
9
-
10
-#if 0
11
-#define debugfunc(format, ...) blog(LOG_DEBUG, "[Captions] %s(" format ")", \
12
- __FUNCTION__, ##__VA_ARGS__)
13
-#else
14
-#define debugfunc(format, ...)
15
-#endif
16
-
17
-CaptionStream::CaptionStream(DWORD samplerate_) :
18
- samplerate(samplerate_),
19
- event(CreateEvent(nullptr, false, false, nullptr))
20
-{
21
- buf_info.ulMsMinNotification = 50;
22
- buf_info.ulMsBufferSize = 500;
23
- buf_info.ulMsEventBias = 0;
24
-
25
- format.wFormatTag = WAVE_FORMAT_PCM;
26
- format.nChannels = 1;
27
- format.nSamplesPerSec = 16000;
28
- format.nAvgBytesPerSec = format.nSamplesPerSec * sizeof(uint16_t);
29
- format.nBlockAlign = 2;
30
- format.wBitsPerSample = 16;
31
- format.cbSize = sizeof(format);
32
-
33
- resampler.Reset(&format);
34
-}
35
-
36
-void CaptionStream::Stop()
37
-{
38
- {
39
- lock_guard<mutex> lock(m);
40
- circlebuf_free(buf);
41
- }
42
-
43
- cv.notify_one();
44
-}
45
-
46
-void CaptionStream::PushAudio(const struct audio_data *data, bool muted)
47
-{
48
- uint8_t *output[MAX_AV_PLANES] = {};
49
- uint32_t frames = data->frames;
50
- uint64_t ts_offset;
51
- bool ready = false;
52
-
53
- audio_resampler_resample(resampler, output, &frames, &ts_offset,
54
- data->data, data->frames);
55
-
56
- if (output[0]) {
57
- if (muted)
58
- memset(output[0], 0, frames * sizeof(int16_t));
59
-
60
- lock_guard<mutex> lock(m);
61
- circlebuf_push_back(buf, output[0], frames * sizeof(int16_t));
62
- write_pos += frames * sizeof(int16_t);
63
-
64
- if (wait_size && buf->size >= wait_size)
65
- ready = true;
66
- }
67
-
68
- if (ready)
69
- cv.notify_one();
70
-}
71
-
72
-// IUnknown methods
73
-
74
-STDMETHODIMP CaptionStream::QueryInterface(REFIID riid, void **ppv)
75
-{
76
- if (riid == IID_IUnknown) {
77
- AddRef();
78
- *ppv = this;
79
-
80
- } else if (riid == IID_IStream) {
81
- AddRef();
82
- *ppv = (IStream*)this;
83
-
84
- } else if (riid == IID_ISpStreamFormat) {
85
- AddRef();
86
- *ppv = (ISpStreamFormat*)this;
87
-
88
- } else if (riid == IID_ISpAudio) {
89
- AddRef();
90
- *ppv = (ISpAudio*)this;
91
-
92
- } else {
93
- *ppv = nullptr;
94
- return E_NOINTERFACE;
95
- }
96
-
97
- return NOERROR;
98
-}
99
-
100
-STDMETHODIMP_(ULONG) CaptionStream::AddRef()
101
-{
102
- return (ULONG)os_atomic_inc_long(&refs);
103
-}
104
-
105
-STDMETHODIMP_(ULONG) CaptionStream::Release()
106
-{
107
- ULONG new_refs = (ULONG)os_atomic_dec_long(&refs);
108
- if (!new_refs)
109
- delete this;
110
-
111
- return new_refs;
112
-}
113
-
114
-// ISequentialStream methods
115
-
116
-STDMETHODIMP CaptionStream::Read(void *data, ULONG bytes, ULONG *read_bytes)
117
-{
118
- HRESULT hr = S_OK;
119
- size_t cur_size;
120
-
121
- debugfunc("data, %lu, read_bytes", bytes);
122
- if (!data)
123
- return STG_E_INVALIDPOINTER;
124
-
125
- {
126
- lock_guard<mutex> lock1(m);
127
- wait_size = bytes;
128
- cur_size = buf->size;
129
- }
130
-
131
- unique_lock<mutex> lock(m);
132
-
133
- if (bytes > cur_size)
134
- cv.wait(lock);
135
-
136
- if (bytes > (ULONG)buf->size) {
137
- bytes = (ULONG)buf->size;
138
- hr = S_FALSE;
139
- }
140
- if (bytes)
141
- circlebuf_pop_front(buf, data, bytes);
142
- if (read_bytes)
143
- *read_bytes = bytes;
144
-
145
- wait_size = 0;
146
- pos.QuadPart += bytes;
147
- return hr;
148
-}
149
-
150
-STDMETHODIMP CaptionStream::Write(const void *, ULONG bytes,
151
- ULONG*)
152
-{
153
- debugfunc("data, %lu, written_bytes", bytes);
154
- UNUSED_PARAMETER(bytes);
155
-
156
- return STG_E_INVALIDFUNCTION;
157
-}
158
-
159
-// IStream methods
160
-
161
-STDMETHODIMP CaptionStream::Seek(LARGE_INTEGER move, DWORD origin,
162
- ULARGE_INTEGER *new_pos)
163
-{
164
- debugfunc("%lld, %lx, new_pos", move, origin);
165
- UNUSED_PARAMETER(move);
166
- UNUSED_PARAMETER(origin);
167
-
168
- if (!new_pos)
169
- return E_POINTER;
170
-
171
- if (origin != SEEK_CUR || move.QuadPart != 0)
172
- return E_NOTIMPL;
173
-
174
- *new_pos = pos;
175
- return S_OK;
176
-}
177
-
178
-STDMETHODIMP CaptionStream::SetSize(ULARGE_INTEGER new_size)
179
-{
180
- debugfunc("%llu", new_size);
181
- UNUSED_PARAMETER(new_size);
182
- return STG_E_INVALIDFUNCTION;
183
-}
184
-
185
-STDMETHODIMP CaptionStream::CopyTo(IStream *stream, ULARGE_INTEGER bytes,
186
- ULARGE_INTEGER *read_bytes,
187
- ULARGE_INTEGER *written_bytes)
188
-{
189
- HRESULT hr;
190
-
191
- debugfunc("stream, %llu, read_bytes, written_bytes", bytes);
192
-
193
- if (!stream)
194
- return STG_E_INVALIDPOINTER;
195
-
196
- ULONG written = 0;
197
- if (bytes.QuadPart > (ULONGLONG)buf->size)
198
- bytes.QuadPart = (ULONGLONG)buf->size;
199
-
200
- lock_guard<mutex> lock(m);
201
obs-studio-18.0.1.tar.xz/UI/frontend-plugins/frontend-tools/captions-stream.hpp
Deleted
121
1
2
-#include <windows.h>
3
-#include <sapi.h>
4
-#include <condition_variable>
5
-#include <mutex>
6
-#include <vector>
7
-#include <obs.h>
8
-#include <media-io/audio-resampler.h>
9
-#include <util/circlebuf.h>
10
-#include <util/windows/WinHandle.hpp>
11
-
12
-#include <fstream>
13
-
14
-class CircleBuf {
15
- circlebuf buf = {};
16
-public:
17
- inline ~CircleBuf() {circlebuf_free(&buf);}
18
- inline operator circlebuf*() {return &buf;}
19
- inline circlebuf *operator->() {return &buf;}
20
-};
21
-
22
-class Resampler {
23
- audio_resampler_t *resampler = nullptr;
24
-
25
-public:
26
- inline void Reset(const WAVEFORMATEX *wfex)
27
- {
28
- const struct audio_output_info *aoi =
29
- audio_output_get_info(obs_get_audio());
30
-
31
- struct resample_info src;
32
- src.samples_per_sec = aoi->samples_per_sec;
33
- src.format = aoi->format;
34
- src.speakers = aoi->speakers;
35
-
36
- struct resample_info dst;
37
- dst.samples_per_sec = uint32_t(wfex->nSamplesPerSec);
38
- dst.format = AUDIO_FORMAT_16BIT;
39
- dst.speakers = (enum speaker_layout)wfex->nChannels;
40
-
41
- if (resampler)
42
- audio_resampler_destroy(resampler);
43
- resampler = audio_resampler_create(&dst, &src);
44
- }
45
-
46
- inline ~Resampler() {audio_resampler_destroy(resampler);}
47
- inline operator audio_resampler_t*() {return resampler;}
48
-};
49
-
50
-class CaptionStream : public ISpAudio {
51
- volatile long refs = 1;
52
- SPAUDIOBUFFERINFO buf_info = {};
53
- ULONG notify_size = 0;
54
- SPAUDIOSTATE state;
55
- WinHandle event;
56
- ULONG vol = 0;
57
-
58
- std::condition_variable cv;
59
- std::mutex m;
60
- std::vector<int16_t> temp_buf;
61
- WAVEFORMATEX format = {};
62
- Resampler resampler;
63
-
64
- CircleBuf buf;
65
- ULONG wait_size = 0;
66
- DWORD samplerate = 0;
67
- ULARGE_INTEGER pos = {};
68
- ULONGLONG write_pos = 0;
69
-
70
-public:
71
- CaptionStream(DWORD samplerate);
72
-
73
- void Stop();
74
- void PushAudio(const struct audio_data *audio_data, bool muted);
75
-
76
- // IUnknown methods
77
- STDMETHODIMP QueryInterface(REFIID riid, void **ppv) override;
78
- STDMETHODIMP_(ULONG) AddRef() override;
79
- STDMETHODIMP_(ULONG) Release() override;
80
-
81
- // ISequentialStream methods
82
- STDMETHODIMP Read(void *data, ULONG bytes, ULONG *read_bytes) override;
83
- STDMETHODIMP Write(const void *data, ULONG bytes, ULONG *written_bytes)
84
- override;
85
-
86
- // IStream methods
87
- STDMETHODIMP Seek(LARGE_INTEGER move, DWORD origin,
88
- ULARGE_INTEGER *new_pos) override;
89
- STDMETHODIMP SetSize(ULARGE_INTEGER new_size) override;
90
- STDMETHODIMP CopyTo(IStream *stream, ULARGE_INTEGER bytes,
91
- ULARGE_INTEGER *read_bytes,
92
- ULARGE_INTEGER *written_bytes) override;
93
- STDMETHODIMP Commit(DWORD commit_flags) override;
94
- STDMETHODIMP Revert(void) override;
95
- STDMETHODIMP LockRegion(ULARGE_INTEGER offset, ULARGE_INTEGER size,
96
- DWORD type) override;
97
- STDMETHODIMP UnlockRegion(ULARGE_INTEGER offset, ULARGE_INTEGER size,
98
- DWORD type) override;
99
- STDMETHODIMP Stat(STATSTG *stg, DWORD flags) override;
100
- STDMETHODIMP Clone(IStream **stream) override;
101
-
102
- // ISpStreamFormat methods
103
- STDMETHODIMP GetFormat(GUID *guid, WAVEFORMATEX **co_mem_wfex_out)
104
- override;
105
-
106
- // ISpAudio methods
107
- STDMETHODIMP SetState(SPAUDIOSTATE state, ULONGLONG reserved) override;
108
- STDMETHODIMP SetFormat(REFGUID guid_ref, const WAVEFORMATEX *wfex)
109
- override;
110
- STDMETHODIMP GetStatus(SPAUDIOSTATUS *status) override;
111
- STDMETHODIMP SetBufferInfo(const SPAUDIOBUFFERINFO *buf_info) override;
112
- STDMETHODIMP GetBufferInfo(SPAUDIOBUFFERINFO *buf_info) override;
113
- STDMETHODIMP GetDefaultFormat(GUID *format,
114
- WAVEFORMATEX **co_mem_wfex_out) override;
115
- STDMETHODIMP_(HANDLE) EventHandle(void) override;
116
- STDMETHODIMP GetVolumeLevel(ULONG *level) override;
117
- STDMETHODIMP SetVolumeLevel(ULONG level) override;
118
- STDMETHODIMP GetBufferNotifySize(ULONG *size) override;
119
- STDMETHODIMP SetBufferNotifySize(ULONG size) override;
120
-};
121
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Include/amf-h264.h
Deleted
201
1
2
-/*
3
-MIT License
4
-
5
-Copyright (c) 2016 Michael Fabian Dirks
6
-
7
-Permission is hereby granted, free of charge, to any person obtaining a copy
8
-of this software and associated documentation files (the "Software"), to deal
9
-in the Software without restriction, including without limitation the rights
10
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
-copies of the Software, and to permit persons to whom the Software is
12
-furnished to do so, subject to the following conditions:
13
-
14
-The above copyright notice and this permission notice shall be included in all
15
-copies or substantial portions of the Software.
16
-
17
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
-SOFTWARE.
24
-*/
25
-
26
-#pragma once
27
-//////////////////////////////////////////////////////////////////////////
28
-// Includes
29
-//////////////////////////////////////////////////////////////////////////
30
-#include <condition_variable>
31
-#include <algorithm>
32
-#include <mutex>
33
-#include <queue>
34
-#include <thread>
35
-#include <vector>
36
-#include <chrono>
37
-
38
-// Plugin
39
-#include "plugin.h"
40
-#include "amf.h"
41
-#include "api-base.h"
42
-
43
-//////////////////////////////////////////////////////////////////////////
44
-// Code
45
-//////////////////////////////////////////////////////////////////////////
46
-
47
-namespace Plugin {
48
- namespace AMD {
49
- // Internal Properties
50
- enum class H264EncoderType : uint8_t {
51
- AVC = 0, // Advanced Video Coding
52
- SVC, // Scalable Video Coding
53
- HEVC, // High-Efficiency Video Coding (Discovered in amfrt64.dll)
54
- };
55
- enum class H264MemoryType : uint8_t {
56
- Host = 0, // Host-Managed Memory
57
- DirectX9, // DirectX9
58
- DirectX11, // DirectX11
59
- OpenGL, // OpenGL
60
- };
61
- enum class H264ColorFormat : uint8_t {
62
- // 4:2:0 Formats
63
- NV12 = 0, // NV12
64
- I420, // YUV 4:2:0
65
- // 4:2:2 Formats
66
- YUY2,
67
- // Uncompressed
68
- BGRA, // ARGB
69
- RGBA, // RGBA
70
- // Other
71
- GRAY, // Y 4:0:0
72
- };
73
- enum class H264ColorProfile : uint8_t {
74
- Rec601 = 0,
75
- Rec709,
76
- Rec2020, // Truer to world color, used for HDR
77
- };
78
-
79
- // Static Properties
80
- enum class H264Usage : uint8_t {
81
- Transcoding = 0, // Only one capable of streaming to services.
82
- UltraLowLatency, // Low Latency Recording or Network Streaming
83
- LowLatency, // Low Latency Recording or Network Streaming
84
- Webcam, // For SVC Recording and Streaming
85
- };
86
- enum class H264QualityPreset : uint8_t {
87
- Speed = 0,
88
- Balanced,
89
- Quality,
90
- };
91
- enum class H264Profile : uint16_t {
92
- Baseline = 66,
93
- Main = 77,
94
- High = 100,
95
- ConstrainedBaseline = 256,
96
- ConstrainedHigh = 257
97
- };
98
- enum class H264ProfileLevel : uint8_t {
99
- Automatic = 0,
100
- L10 = 10,
101
- L11,
102
- L12,
103
- L13,
104
- L20 = 20,
105
- L21,
106
- L22,
107
- L30 = 30,
108
- L31,
109
- L32,
110
- L40 = 40,
111
- L41,
112
- L42,
113
- L50 = 50,
114
- L51,
115
- L52,
116
- };
117
- enum class H264ScanType : uint8_t {
118
- Progressive = 0,
119
- Interlaced,
120
- };
121
- enum class H264CodingType : uint8_t {
122
- Default = 0,
123
- CABAC = 1,
124
- CALVC = 2,
125
- };
126
-
127
- // Dynamic Properties
128
- enum class H264RateControlMethod : uint8_t {
129
- ConstantQP = 0,
130
- ConstantBitrate,
131
- VariableBitrate_PeakConstrained,
132
- VariableBitrate_LatencyConstrained = 3,
133
- };
134
- enum class H264BFramePattern : uint8_t {
135
- None = 0,
136
- One,
137
- Two,
138
- Three,
139
- };
140
-
141
- // Experimental
142
- enum class H264SliceMode : uint8_t {
143
- Horizontal = 1,
144
- Vertical = 2
145
- };
146
- enum class H264SliceControlMode : uint8_t {
147
- Off = 0,
148
- Macroblock = 1, // AMF_VIDEO_ENCODER_SLICE_CTRL_MODE_MB
149
- Invalid,
150
- Macroblock_Row = 3 // AMF_VIDEO_ENCODER_SLICE_CTRL_MODE_MB_ROW
151
- };
152
-
153
- class H264Encoder {
154
- #pragma region Initializer & Finalizer
155
- public:
156
- H264Encoder(
157
- H264EncoderType p_Type,
158
- std::string p_VideoAPI,
159
- uint64_t p_VideoAdapterId,
160
- bool p_OpenCL,
161
- H264ColorFormat p_SurfaceFormat = H264ColorFormat::NV12
162
- );
163
- ~H264Encoder();
164
- #pragma endregion Initializer & Finalizer
165
-
166
- public:
167
- void Start();
168
- void Restart();
169
- void Stop();
170
- bool IsStarted();
171
-
172
- bool SendInput(struct encoder_frame* frame);
173
- bool GetOutput(struct encoder_packet* packet, bool* received_packet);
174
- bool GetExtraData(uint8_t**& data, size_t*& size);
175
- void GetVideoInfo(struct video_scale_info*& vsi);
176
-
177
- #pragma region Properties
178
- public:
179
- void LogProperties();
180
-
181
- // Static
182
-
183
- #pragma region Startup Properties
184
- // Set which Usage preset to use.
185
- // Changing this will also change a lot of other properties.
186
- void SetUsage(H264Usage usage);
187
- H264Usage GetUsage();
188
-
189
- // Set which Quality Preset AMF should use.
190
- // Affects the quality of the output.
191
- void SetQualityPreset(H264QualityPreset preset);
192
- H264QualityPreset GetQualityPreset();
193
-
194
- // Set the Profile the output should have.
195
- void SetProfile(H264Profile profile);
196
- H264Profile GetProfile();
197
-
198
- // Set the Profile Level the output should have.
199
- void SetProfileLevel(H264ProfileLevel level);
200
- H264ProfileLevel GetProfileLevel();
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Source/amf-h264.cpp
Deleted
201
1
2
-/*
3
-MIT License
4
-
5
-Copyright (c) 2016 Michael Fabian Dirks
6
-
7
-Permission is hereby granted, free of charge, to any person obtaining a copy
8
-of this software and associated documentation files (the "Software"), to deal
9
-in the Software without restriction, including without limitation the rights
10
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
-copies of the Software, and to permit persons to whom the Software is
12
-furnished to do so, subject to the following conditions:
13
-
14
-The above copyright notice and this permission notice shall be included in all
15
-copies or substantial portions of the Software.
16
-
17
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
-SOFTWARE.
24
-*/
25
-
26
-//////////////////////////////////////////////////////////////////////////
27
-// Includes
28
-//////////////////////////////////////////////////////////////////////////
29
-#include <chrono>
30
-
31
-#include "amf-capabilities.h"
32
-#include "amf-h264.h"
33
-#include "misc-util.cpp"
34
-#include "api-base.h"
35
-
36
-// AMF
37
-#include "components/VideoEncoderVCE.h"
38
-#include "components/VideoConverter.h"
39
-
40
-//////////////////////////////////////////////////////////////////////////
41
-// Code
42
-//////////////////////////////////////////////////////////////////////////
43
-
44
-#define AMF_PROPERTY_FRAME L"Frame"
45
-#define AMF_PROPERTY_TIME_SENDINPUT L"TimeSendInput"
46
-#define AMF_PROPERTY_TIME_CREATESURFACE L"TimeCreateSurface"
47
-#define AMF_PROPERTY_TIME_CONVERT L"TimeConvert"
48
-#define AMF_PROPERTY_TIME_ENCODE L"TimeEncode"
49
-
50
-// Logging and Exception Helpers
51
-static void FormatTextWithAMFError(std::vector<char>* buffer, const char* format, AMF_RESULT res) {
52
- sprintf(buffer->data(), format, Plugin::AMD::AMF::GetInstance()->GetTrace()->GetResultText(res), res);
53
-}
54
-
55
-template<typename _T>
56
-static void FormatTextWithAMFError(std::vector<char>* buffer, const char* format, _T other, AMF_RESULT res) {
57
- sprintf(buffer->data(), format, other, Plugin::AMD::AMF::GetInstance()->GetTrace()->GetResultText(res), res);
58
-}
59
-
60
-// Class
61
-#ifdef _DEBUG
62
-static void fastPrintVariant(const char* text, amf::AMFVariantStruct variant) {
63
- std::vector<char> buf(1024);
64
- switch (variant.type) {
65
- case amf::AMF_VARIANT_EMPTY:
66
- sprintf(buf.data(), "%s%s", text, "Empty");
67
- break;
68
- case amf::AMF_VARIANT_BOOL:
69
- sprintf(buf.data(), "%s%s", text, variant.boolValue ? "true" : "false");
70
- break;
71
- case amf::AMF_VARIANT_INT64:
72
- sprintf(buf.data(), "%s%lld", text, variant.int64Value);
73
- break;
74
- case amf::AMF_VARIANT_DOUBLE:
75
- sprintf(buf.data(), "%s%f", text, variant.doubleValue);
76
- break;
77
- case amf::AMF_VARIANT_RECT:
78
- sprintf(buf.data(), "%s[%ld,%ld,%ld,%ld]", text,
79
- variant.rectValue.top, variant.rectValue.left,
80
- variant.rectValue.bottom, variant.rectValue.right);
81
- break;
82
- case amf::AMF_VARIANT_SIZE:
83
- sprintf(buf.data(), "%s%ldx%ld", text,
84
- variant.sizeValue.width, variant.sizeValue.height);
85
- break;
86
- case amf::AMF_VARIANT_POINT:
87
- sprintf(buf.data(), "%s[%ld,%ld]", text,
88
- variant.pointValue.x, variant.pointValue.y);
89
- break;
90
- case amf::AMF_VARIANT_RATE:
91
- sprintf(buf.data(), "%s%ld/%ld", text,
92
- variant.rateValue.num, variant.rateValue.den);
93
- break;
94
- case amf::AMF_VARIANT_RATIO:
95
- sprintf(buf.data(), "%s%ld:%ld", text,
96
- variant.ratioValue.num, variant.ratioValue.den);
97
- break;
98
- case amf::AMF_VARIANT_COLOR:
99
- sprintf(buf.data(), "%s(%d,%d,%d,%d)", text,
100
- variant.colorValue.r,
101
- variant.colorValue.g,
102
- variant.colorValue.b,
103
- variant.colorValue.a);
104
- break;
105
- case amf::AMF_VARIANT_STRING:
106
- sprintf(buf.data(), "%s'%s'", text,
107
- variant.stringValue);
108
- break;
109
- case amf::AMF_VARIANT_WSTRING:
110
- sprintf(buf.data(), "%s'%ls'", text,
111
- variant.wstringValue);
112
- break;
113
- }
114
- AMF_LOG_INFO("%s", buf.data());
115
-};
116
-
117
-static void printDebugInfo(amf::AMFComponentPtr m_AMFEncoder) {
118
- amf::AMFPropertyInfo* pInfo;
119
- size_t propCount = m_AMFEncoder->GetPropertyCount();
120
- AMF_LOG_INFO("-- Internal AMF Encoder Properties --");
121
- for (size_t propIndex = 0; propIndex < propCount; propIndex++) {
122
- static const char* typeToString[] = {
123
- "Empty",
124
- "Boolean",
125
- "Int64",
126
- "Double",
127
- "Rect",
128
- "Size",
129
- "Point",
130
- "Rate",
131
- "Ratio",
132
- "Color",
133
- "String",
134
- "WString",
135
- "Interface"
136
- };
137
-
138
- AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(propIndex, (const amf::AMFPropertyInfo**) &pInfo);
139
- if (res != AMF_OK)
140
- continue;
141
- AMF_LOG_INFO(" [%ls] %ls (Type: %s, Index %Iu)",
142
- pInfo->name, pInfo->desc, typeToString[pInfo->type], propIndex);
143
- AMF_LOG_INFO(" Content Type: %d",
144
- pInfo->contentType);
145
- AMF_LOG_INFO(" Access: %s%s%s",
146
- (pInfo->accessType & amf::AMF_PROPERTY_ACCESS_READ) ? "R" : "",
147
- (pInfo->accessType & amf::AMF_PROPERTY_ACCESS_WRITE) ? "W" : "",
148
- (pInfo->accessType & amf::AMF_PROPERTY_ACCESS_WRITE_RUNTIME) ? "X" : "");
149
-
150
- AMF_LOG_INFO(" Values:");
151
- amf::AMFVariantStruct curStruct = amf::AMFVariantStruct();
152
- m_AMFEncoder->GetProperty(pInfo->name, &curStruct);
153
- fastPrintVariant(" Current: ", curStruct);
154
- fastPrintVariant(" Default: ", pInfo->defaultValue);
155
- fastPrintVariant(" Minimum: ", pInfo->minValue);
156
- fastPrintVariant(" Maximum: ", pInfo->maxValue);
157
- if (pInfo->pEnumDescription) {
158
- AMF_LOG_INFO(" Enumeration: ");
159
- const amf::AMFEnumDescriptionEntry* pEnumEntry = pInfo->pEnumDescription;
160
- while (pEnumEntry->name != nullptr) {
161
- AMF_LOG_INFO(" %ls (%ld)",
162
- pEnumEntry->name,
163
- pEnumEntry->value);
164
- pEnumEntry++;
165
- }
166
- }
167
- }
168
-}
169
-#endif
170
-
171
-Plugin::AMD::H264Encoder::H264Encoder(
172
- H264EncoderType p_Type,
173
- std::string p_VideoAPI,
174
- uint64_t p_VideoAdapterId,
175
- bool p_OpenCL,
176
- H264ColorFormat p_SurfaceFormat/* = VCESurfaceFormat_NV12*/
177
-) {
178
- #pragma region Assign Default Values
179
- m_EncoderType = p_Type;
180
- m_ColorFormat = p_SurfaceFormat;
181
- m_OpenCL = p_OpenCL;
182
- m_Flag_IsStarted = false;
183
- m_Flag_FirstFrameReceived = false;
184
- m_Flag_FirstFrameSubmitted = false;
185
- m_FrameSize.first = 64; m_FrameSize.second = 64;
186
- m_FrameRate.first = 30; m_FrameRate.second = 1;
187
- m_FrameRateDivisor = ((double_t)m_FrameRate.first / (double_t)m_FrameRate.second);
188
- m_FrameRateReverseDivisor = ((double_t)m_FrameRate.second / (double_t)m_FrameRate.first);
189
- m_InputQueueLimit = (uint32_t)(m_FrameRateDivisor * 3);
190
- m_InputQueueLastSize = 0;
191
- m_TimerPeriod = 1;
192
- m_LastQueueWarnMessageTime = std::chrono::high_resolution_clock::time_point(std::chrono::high_resolution_clock::duration(0));
193
- #pragma endregion Assign Default Values
194
-
195
- AMF_LOG_DEBUG("<" __FUNCTION_NAME__ "> Initializing...");
196
-
197
- AMF_RESULT res = AMF_OK;
198
- // AMF
199
- m_AMF = AMF::GetInstance();
200
- m_AMFFactory = m_AMF->GetFactory();
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Source/misc-util.cpp
Deleted
201
1
2
-/*
3
-MIT License
4
-
5
-Copyright (c) 2016 Michael Fabian Dirks
6
-
7
-Permission is hereby granted, free of charge, to any person obtaining a copy
8
-of this software and associated documentation files (the "Software"), to deal
9
-in the Software without restriction, including without limitation the rights
10
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
-copies of the Software, and to permit persons to whom the Software is
12
-furnished to do so, subject to the following conditions:
13
-
14
-The above copyright notice and this permission notice shall be included in all
15
-copies or substantial portions of the Software.
16
-
17
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
-SOFTWARE.
24
-*/
25
-
26
-#pragma once
27
-//////////////////////////////////////////////////////////////////////////
28
-// Includes
29
-//////////////////////////////////////////////////////////////////////////
30
-
31
-// Plugin
32
-#include "plugin.h"
33
-#include "amf.h"
34
-#include "amf-capabilities.h"
35
-#include "amf-h264.h"
36
-
37
-//////////////////////////////////////////////////////////////////////////
38
-// Code
39
-//////////////////////////////////////////////////////////////////////////
40
-using namespace Plugin::AMD;
41
-
42
-namespace Plugin {
43
- namespace Utility {
44
- H264ProfileLevel inline GetMinimumProfileLevel(std::pair<uint32_t, uint32_t> frameSize, std::pair<uint32_t, uint32_t> frameRate) {
45
- typedef std::pair<uint32_t, uint32_t> levelRestriction;
46
- typedef std::pair<H264ProfileLevel, levelRestriction> level;
47
-
48
- static const level profileLevelLimit[] = { // [Level, [Samples, Samples_Per_Sec]]
49
- level(H264ProfileLevel::L10, levelRestriction(25344, 380160)),
50
- level(H264ProfileLevel::L11, levelRestriction(101376, 768000)),
51
- level(H264ProfileLevel::L12, levelRestriction(101376, 1536000)),
52
- level(H264ProfileLevel::L13, levelRestriction(101376, 3041280)),
53
- level(H264ProfileLevel::L20, levelRestriction(101376, 3041280)),
54
- level(H264ProfileLevel::L21, levelRestriction(202752, 5068800)),
55
- level(H264ProfileLevel::L22, levelRestriction(414720, 5184000)),
56
- level(H264ProfileLevel::L30, levelRestriction(414720, 10368000)),
57
- level(H264ProfileLevel::L31, levelRestriction(921600, 27648000)),
58
- level(H264ProfileLevel::L32, levelRestriction(1310720, 55296000)),
59
- //level(H264ProfileLevel::40, levelRestriction(2097152, 62914560)), // Technically identical to 4.1, but backwards compatible.
60
- level(H264ProfileLevel::L41, levelRestriction(2097152, 62914560)),
61
- level(H264ProfileLevel::L42, levelRestriction(2228224, 133693440)),
62
- level(H264ProfileLevel::L50, levelRestriction(5652480, 150994944)),
63
- level(H264ProfileLevel::L51, levelRestriction(9437184, 251658240)),
64
- level(H264ProfileLevel::L52, levelRestriction(9437184, 530841600)),
65
- level((H264ProfileLevel)-1, levelRestriction(0, 0))
66
- };
67
-
68
- uint32_t samples = frameSize.first * frameSize.second;
69
- uint32_t samples_sec = (uint32_t)ceil((double_t)samples * ((double_t)frameRate.first / (double_t)frameRate.second));
70
-
71
- level curLevel = profileLevelLimit[0];
72
- for (uint32_t index = 0; (int32_t)curLevel.first != -1; index++) {
73
- curLevel = profileLevelLimit[index];
74
-
75
- if (samples > curLevel.second.first)
76
- continue;
77
-
78
- if (samples_sec > curLevel.second.second)
79
- continue;
80
-
81
- return curLevel.first;
82
- }
83
- return H264ProfileLevel::L52;
84
- }
85
-
86
- #pragma region VCEEncoderType
87
- inline const char* VCEEncoderTypeAsString(H264EncoderType type) {
88
- const char* types[] = {
89
- "AVC",
90
- "SVC",
91
- "HEVC"
92
- };
93
- return types[(uint8_t)type];
94
- }
95
- inline const wchar_t* VCEEncoderTypeAsAMF(H264EncoderType type) {
96
- const wchar_t* types[] = {
97
- AMFVideoEncoderVCE_AVC,
98
- AMFVideoEncoderVCE_SVC,
99
- L"AMFVideoEncoderHW_HEVC"
100
- };
101
- return types[(uint8_t)type];
102
- }
103
- #pragma endregion VCEEncoderType
104
- #pragma region VCEMemoryType
105
- inline const char* MemoryTypeAsString(H264MemoryType memoryType) {
106
- static const char* memoryTypeToString[] = {
107
- "Host",
108
- "DirectX9",
109
- "DirectX11",
110
- "OpenGL"
111
- };
112
- return memoryTypeToString[(uint8_t)memoryType];
113
- }
114
- inline amf::AMF_MEMORY_TYPE MemoryTypeAsAMF(H264MemoryType memoryType) {
115
- static amf::AMF_MEMORY_TYPE memoryTypeToAMF[] = {
116
- amf::AMF_MEMORY_HOST,
117
- amf::AMF_MEMORY_DX9,
118
- amf::AMF_MEMORY_DX11,
119
- amf::AMF_MEMORY_OPENGL,
120
- };
121
- return memoryTypeToAMF[(uint8_t)memoryType];
122
- }
123
- #pragma endregion VCEMemoryType
124
- #pragma region VCESurfaceFormat
125
- inline const char* SurfaceFormatAsString(H264ColorFormat surfaceFormat) {
126
- static const char* surfaceFormatToString[] = {
127
- "NV12",
128
- "I420",
129
- "YUY2",
130
- "BGRA",
131
- "RGBA",
132
- "GRAY",
133
- };
134
- return surfaceFormatToString[(uint8_t)surfaceFormat];
135
- }
136
- inline amf::AMF_SURFACE_FORMAT SurfaceFormatAsAMF(H264ColorFormat surfaceFormat) {
137
- static amf::AMF_SURFACE_FORMAT surfaceFormatToAMF[] = {
138
- // 4:2:0 Formats
139
- amf::AMF_SURFACE_NV12,
140
- amf::AMF_SURFACE_YUV420P,
141
- // 4:2:2 Formats
142
- amf::AMF_SURFACE_YUY2,
143
- // Uncompressed
144
- amf::AMF_SURFACE_BGRA,
145
- amf::AMF_SURFACE_RGBA,
146
- // Other
147
- amf::AMF_SURFACE_GRAY8,
148
- };
149
- return surfaceFormatToAMF[(uint8_t)surfaceFormat];
150
- }
151
- #pragma endregion VCESurfaceFormat
152
- #pragma region VCEUsage
153
- inline const char* UsageAsString(H264Usage usage) {
154
- static const char* usageToString[] = {
155
- "Transcoding",
156
- "Ultra Low Latency",
157
- "Low Latency",
158
- "Webcam"
159
- };
160
- return usageToString[(uint8_t)usage];
161
- }
162
- inline AMF_VIDEO_ENCODER_USAGE_ENUM UsageAsAMF(H264Usage usage) {
163
- static AMF_VIDEO_ENCODER_USAGE_ENUM usageToAMF[] = {
164
- AMF_VIDEO_ENCODER_USAGE_TRANSCONDING,
165
- AMF_VIDEO_ENCODER_USAGE_ULTRA_LOW_LATENCY,
166
- AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY,
167
- AMF_VIDEO_ENCODER_USAGE_WEBCAM,
168
- };
169
- return usageToAMF[(uint8_t)usage];
170
- }
171
- inline H264Usage UsageFromAMF(uint32_t usage) {
172
- static H264Usage usageFromAMF[] = {
173
- H264Usage::Transcoding,
174
- H264Usage::UltraLowLatency,
175
- H264Usage::LowLatency,
176
- H264Usage::Webcam,
177
- };
178
- return usageFromAMF[(uint8_t)usage];
179
- }
180
- #pragma endregion VCEUsage
181
- #pragma region VCEQualityPreset
182
- inline const char* QualityPresetAsString(H264QualityPreset preset) {
183
- static const char* qualityPresetToString[] = {
184
- "Speed",
185
- "Balanced",
186
- "Quality"
187
- };
188
- return qualityPresetToString[(uint8_t)preset];
189
- }
190
- #pragma endregion VCEQualityPreset
191
- #pragma region VCEProfile
192
- inline const char* ProfileAsString(H264Profile profile) {
193
- switch (profile) {
194
- case H264Profile::Baseline:
195
- return "Baseline";
196
- case H264Profile::Main:
197
- return "Main";
198
- case H264Profile::High:
199
- return "High";
200
- case H264Profile::ConstrainedBaseline:
201
obs-studio-18.0.2.tar.xz/.gitattributes
Added
12
1
2
+* text=auto
3
+
4
+*.sln text eol=crlf
5
+*.vcproj text eol=crlf
6
+*.vcxproj text eol=crlf
7
+*.vcxproj text eol=crlf
8
+*.vcxproj.filters text eol=crlf
9
+
10
+cmake/ALL_BUILD.vcxproj.user.in text eol=crlf
11
+
12
obs-studio-18.0.2.tar.xz/.gitmodules
Added
17
1
2
+[submodule "plugins/win-dshow/libdshowcapture"]
3
+ path = plugins/win-dshow/libdshowcapture
4
+ url = https://github.com/jp9000/libdshowcapture.git
5
+[submodule "plugins/mac-syphon/syphon-framework"]
6
+ path = plugins/mac-syphon/syphon-framework
7
+ url = https://github.com/palana/Syphon-Framework.git
8
+[submodule "plugins/enc-amf"]
9
+ path = plugins/enc-amf
10
+ url = https://github.com/Xaymar/obs-studio_amf-encoder-plugin.git
11
+[submodule "plugins/obs-browser"]
12
+ path = plugins/obs-browser
13
+ url = https://github.com/kc5nra/obs-browser.git
14
+[submodule "plugins/obs-vst"]
15
+ path = plugins/obs-vst
16
+ url = https://github.com/DDRBoxman/obs-vst.git
17
obs-studio-18.0.1.tar.xz/.travis.yml -> obs-studio-18.0.2.tar.xz/.travis.yml
Changed
50
1
2
language: cpp
3
4
+cache:
5
+ ccache: true
6
+
7
env:
8
global:
9
# AWS S3 creds
10
11
# secret
12
- secure: "JRQVU2zgC3hY6CEY+Crmh/upp93En0BzKaLcsuBT538johNlK7m5hn3m2UOw63seLvBvVaKKWUDj9N986a3DwcXxWPMyF/9ctXgNWy39WzaVWxrbVR5nQB1fdiRp5YEgkoVN+gEm3OVF7sV5AGzh5/8CvEdRCoTLIGgMGHxW9mc="
13
14
+ # ccache
15
+ - USE_CCACHE=1
16
+ - CCACHE_COMPRESS=1
17
+ - CCACHE_MAXSIZE=200M
18
+ - CCACHE_CPP2=1
19
+
20
matrix:
21
include:
22
- os: osx
23
24
all_branches: true
25
26
# The channel name "azubu.il.us.quakenet.org#obs-dev" is encrypted against jp9000/obs-studio to prevent IRC spam of forks
27
+#notifications:
28
+# irc:
29
+# skip_join: false
30
+# template:
31
+# - "[Travis CI|%{result}] %{repository_name}/%{branch} (%{author} - %{commit_subject}) %{build_url}"
32
+# channels:
33
+# - secure: k9j7+ogVODMlveZdd5pP73AVLCFl1VbzVaVon0ECn3EQcxnLSpiZbc6l+PnIUKgee5pRKtUB4breufgmr4puq3s69YeQiOVKk5gx2yJGZ5jGacbSne0xTspzPxapiEbVUkcJ2L7gKntDG4+SUiW67dtt4G26O7zsErDF/lY/woQ=
34
+# on_failure: always
35
+# on_success: change
36
notifications:
37
- irc:
38
- skip_join: false
39
- template:
40
- - "[Travis CI|%{result}] %{repository_name}/%{branch} (%{author} - %{commit_subject}) %{build_url}"
41
- channels:
42
- - secure: k9j7+ogVODMlveZdd5pP73AVLCFl1VbzVaVon0ECn3EQcxnLSpiZbc6l+PnIUKgee5pRKtUB4breufgmr4puq3s69YeQiOVKk5gx2yJGZ5jGacbSne0xTspzPxapiEbVUkcJ2L7gKntDG4+SUiW67dtt4G26O7zsErDF/lY/woQ=
43
- on_failure: always
44
+ webhooks:
45
+ urls:
46
+ - secure: T5RBY818nO40nr5eC8pdrCfAdQKGkjQdbyYw7mfFrhxWxgt/U5tyKXpX0l9zNGfobS0SnLSqF71OrfW04V97oijXx3q5Y24xV6mSrlLQZOq19+XvGp82LDpkVd4yi2N0kBYpoANB9Pkof4jWT/rKfdQCQttluOLjgr5SM0uWHRg=
47
on_success: change
48
+ on_failure: always
49
+
50
obs-studio-18.0.1.tar.xz/CI/before-script-linux.sh -> obs-studio-18.0.2.tar.xz/CI/before-script-linux.sh
Changed
8
1
2
#!/bin/sh
3
set -ex
4
5
+ccache -s || echo "CCache is not available."
6
mkdir build && cd build
7
cmake ..
8
obs-studio-18.0.1.tar.xz/CI/before-script-osx.sh -> obs-studio-18.0.2.tar.xz/CI/before-script-osx.sh
Changed
8
1
2
+# Make sure ccache is found
3
+export PATH=/usr/local/opt/ccache/libexec:$PATH
4
+
5
mkdir build
6
cd build
7
cmake -DENABLE_SPARKLE_UPDATER=ON -DCMAKE_OSX_DEPLOYMENT_TARGET=10.9 -DDepsPath=/tmp/obsdeps -DVLCPath=$PWD/../../vlc-master -DBUILD_BROWSER=ON -DCEF_ROOT_DIR=$PWD/../../cef_binary_${CEF_BUILD_VERSION}_macosx64 ..
8
obs-studio-18.0.1.tar.xz/CI/install-dependencies-linux.sh -> obs-studio-18.0.2.tar.xz/CI/install-dependencies-linux.sh
Changed
47
1
2
#!/bin/sh
3
set -ex
4
5
-sudo add-apt-repository ppa:kirillshkrogalev/ffmpeg-next -y
6
sudo apt-get -qq update
7
sudo apt-get install -y \
8
build-essential \
9
checkinstall \
10
cmake \
11
libasound2-dev \
12
- libavcodec-ffmpeg-dev \
13
- libavdevice-ffmpeg-dev \
14
- libavfilter-ffmpeg-dev \
15
- libavformat-ffmpeg-dev \
16
- libavutil-ffmpeg-dev \
17
libcurl4-openssl-dev \
18
+ libfdk-aac-dev \
19
libfontconfig-dev \
20
libfreetype6-dev \
21
libgl1-mesa-dev \
22
23
libpulse-dev \
24
libqt5x11extras5-dev \
25
libspeexdsp-dev \
26
- libswresample-ffmpeg-dev \
27
- libswscale-ffmpeg-dev \
28
libudev-dev \
29
libv4l-dev \
30
libvlc-dev \
31
32
libxcomposite-dev \
33
libxinerama-dev \
34
pkg-config \
35
- qtbase5-dev
36
+ qtbase5-dev \
37
+ yasm \
38
+ zlib1g-dev
39
+
40
+# FFmpeg
41
+cd ..
42
+git clone --depth 1 git://source.ffmpeg.org/ffmpeg.git
43
+cd ffmpeg
44
+./configure --enable-shared
45
+make -j2
46
+sudo make install
47
obs-studio-18.0.1.tar.xz/CI/install-dependencies-osx.sh -> obs-studio-18.0.2.tar.xz/CI/install-dependencies-osx.sh
Changed
15
1
2
3
brew update
4
5
-#Base OBS Deps
6
-brew install qt5 jack speexdsp
7
+#Base OBS Deps and ccache
8
+brew install qt5 jack speexdsp ccache
9
+
10
+export PATH=/usr/local/opt/ccache/libexec:$PATH
11
+ccache -s || echo "CCache is not available."
12
13
# Fetch and untar prebuilt OBS deps that are compatible with older versions of OSX
14
curl -L -O https://s3-us-west-2.amazonaws.com/obs-nightly/osx-deps.tar.gz -f --retry 5 -C -
15
obs-studio-18.0.1.tar.xz/CI/install/osx/obs.png -> obs-studio-18.0.2.tar.xz/CI/install/osx/obs.png
Changed
obs-studio-18.0.2.tar.xz/CONTRIBUTING.rst
Added
92
1
2
+Contributing
3
+============
4
+
5
+Quick Links for Contributing
6
+----------------------------
7
+
8
+ - Compiling and building OBS Studio:
9
+ https://github.com/jp9000/obs-studio/wiki/Install-Instructions
10
+
11
+ - Our bug tracker (linked to forum accounts):
12
+ https://obsproject.com/mantis/
13
+
14
+ - Development IRC channel: #obs-dev on QuakeNet
15
+
16
+ - Development forum:
17
+ https://obsproject.com/forum/list/general-development.21/
18
+
19
+ - To contribute language translations, do not make pull requests.
20
+ Instead, use crowdin. Read here for more information:
21
+ https://obsproject.com/forum/threads/how-to-contribute-translations-for-obs.16327/
22
+
23
+Coding Guidelines
24
+-----------------
25
+
26
+ - OBS Studio uses kernel normal form (linux variant), for more
27
+ information, please read here:
28
+ https://github.com/torvalds/linux/blob/master/Documentation/process/coding-style.rst
29
+
30
+ - Avoid trailing spaces. To view trailing spaces before making a
31
+ commit, use "git diff" on your changes. If colors are enabled for
32
+ git in the command prompt, it will show you any whitespace issues
33
+ marked with red.
34
+
35
+ - Tabs for indentation, spaces for alignment. Tabs are treated as 8
36
+ columns wide.
37
+
38
+ - 80 columns max
39
+
40
+Commit Guidlines
41
+----------------
42
+
43
+ - OBS Studio uses the 50/72 standard for commits. 50 characters max
44
+ for the title (excluding module prefix), an empty line, and then a
45
+ full description of the commit, wrapped to 72 columns max. See this
46
+ link for more information: http://chris.beams.io/posts/git-commit/
47
+
48
+ - Make sure commit titles are always in present tense, and are not
49
+ followed by punctuation.
50
+
51
+ - Prefix commit titles with the module name, followed by a colon and a
52
+ space (unless modifying a file in the base directory). When
53
+ modifying cmake modules, prefix with "cmake". So for example, if you
54
+ are modifying the obs-ffmpeg plugin::
55
+
56
+ obs-ffmpeg: Fix bug with audio output
57
+
58
+ Or for libobs::
59
+
60
+ libobs: Fix source not displaying
61
+
62
+ - If you still need examples, please view the commit history.
63
+
64
+Headers
65
+-------
66
+
67
+ There's no formal documentation as of yet, so it's recommended to read
68
+ the headers (which are heavily commented) to learn the API.
69
+
70
+ Here are the most important headers to check out::
71
+
72
+ libobs/obs.h Main header
73
+
74
+ libobs/obs-module.h Main header for plugin modules
75
+
76
+ libobs/obs-source.h Creating video/audio sources
77
+
78
+ libobs/obs-output.h Creating outputs
79
+
80
+ libobs/obs-encoder.h Implementing encoders
81
+
82
+ libobs/obs-service.h Implementing custom streaming services
83
+
84
+ libobs/graphics/graphics.h Graphics API
85
+
86
+ UI/obs-frontend-api/obs-frontend-api.h
87
+ Front-end API
88
+
89
+ If you would like to learn from example, examine the default plugins
90
+ (in the <plugins> subdirectory). All features of OBS Studio are
91
+ implemented as plugins.
92
obs-studio-18.0.2.tar.xz/README.rst
Added
46
1
2
+OBS Studio <https://obsproject.com>
3
+===================================
4
+
5
+What is OBS Studio?
6
+-------------------
7
+
8
+ OBS Studio is software designed for capturing, compositing, encoding,
9
+ recording, and streaming video content, efficiently.
10
+
11
+ It's distributed under the GNU General Public License v2 - see the
12
+ accompanying COPYING file for more details.
13
+
14
+Quick Links
15
+-----------
16
+
17
+ - Website: https://obsproject.com
18
+
19
+ - Help/Guides: https://github.com/jp9000/obs-studio/wiki
20
+
21
+ - Forums: https://obsproject.com/forum/
22
+
23
+ - Build Instructions: https://github.com/jp9000/obs-studio/wiki/Install-Instructions
24
+
25
+ - Bug Tracker: https://obsproject.com/mantis/
26
+
27
+ (Note: The bug tracker is linked to forum accounts. To use the bug
28
+ tracker, log in to a forum account)
29
+
30
+Contributing
31
+------------
32
+
33
+ - If you wish to contribute code to the project, please make sure read
34
+ the coding and commit guidelines:
35
+ https://github.com/jp9000/obs-studio/blob/master/CONTRIBUTING.rst
36
+
37
+ - If you wish to contribute translations, do not submit pull requests.
38
+ Instead, please use Crowdin. For more information read this thread:
39
+ https://obsproject.com/forum/threads/how-to-contribute-translations-for-obs.16327/
40
+
41
+ - Other ways to contribute are by helping people out with support on
42
+ our forums or in our community chat. Please limit support to topics
43
+ you fully understand -- bad advice is worse than no advice. When it
44
+ comes to something that you don't fully know or understand, please
45
+ defer to the official help or official channels.
46
obs-studio-18.0.1.tar.xz/UI/CMakeLists.txt -> obs-studio-18.0.2.tar.xz/UI/CMakeLists.txt
Changed
64
1
2
endif()
3
4
find_package(Qt5Widgets ${FIND_MODE})
5
+find_package(FFmpeg REQUIRED COMPONENTS avcodec avutil avformat)
6
7
if(NOT Qt5Widgets_FOUND)
8
if (ENABLE_UI)
9
10
endif()
11
endif()
12
13
+
14
+include_directories(${FFMPEG_INCLUDE_DIRS})
15
include_directories(SYSTEM "obs-frontend-api")
16
include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/libobs")
17
+include_directories(SYSTEM "${CMAKE_SOURCE_DIR}/deps/libff")
18
19
find_package(Libcurl REQUIRED)
20
include_directories(${LIBCURL_INCLUDE_DIRS})
21
22
Qt5::X11Extras)
23
endif()
24
25
+set(obs_libffutil_SOURCES
26
+ ../deps/libff/libff/ff-util.c
27
+ )
28
+set(obs_libffutil_HEADERS
29
+ ../deps/libff/libff/ff-util.h
30
+ )
31
+
32
+if(MSVC)
33
+ set_source_files_properties(
34
+ ../deps/libff/libff/ff-util.c
35
+ PROPERTIES COMPILE_FLAGS -Dinline=__inline
36
+ )
37
+endif()
38
+
39
set(obs_SOURCES
40
${obs_PLATFORM_SOURCES}
41
+ ${obs_libffutil_SOURCES}
42
obs-app.cpp
43
api-interface.cpp
44
window-basic-main.cpp
45
46
47
set(obs_HEADERS
48
${obs_PLATFORM_HEADERS}
49
+ ${obs_libffutil_HEADERS}
50
obs-app.hpp
51
platform.hpp
52
window-main.hpp
53
54
55
target_link_libraries(obs
56
libobs
57
- libff
58
Qt5::Widgets
59
obs-frontend-api
60
+ ${FFMPEG_LIBRARIES}
61
${LIBCURL_LIBRARIES}
62
${obs_PLATFORM_LIBRARIES})
63
64
obs-studio-18.0.1.tar.xz/UI/api-interface.cpp -> obs-studio-18.0.2.tar.xz/UI/api-interface.cpp
Changed
23
1
2
App()->PopUITranslation();
3
}
4
5
+ void obs_frontend_set_streaming_service(obs_service_t *service) override
6
+ {
7
+ main->SetService(service);
8
+ }
9
+
10
+ obs_service_t *obs_frontend_get_streaming_service(void) override
11
+ {
12
+ return main->GetService();
13
+ }
14
+
15
+ void obs_frontend_save_streaming_service(void) override
16
+ {
17
+ main->SaveService();
18
+ }
19
+
20
void on_load(obs_data_t *settings) override
21
{
22
for (auto cb : saveCallbacks)
23
obs-studio-18.0.1.tar.xz/UI/data/locale/en-US.ini -> obs-studio-18.0.2.tar.xz/UI/data/locale/en-US.ini
Changed
25
1
2
ReplayBuffer="Replay Buffer"
3
Import="Import"
4
Export="Export"
5
+Copy="Copy"
6
+Paste="Paste"
7
+PasteReference="Paste (Reference)"
8
+PasteDuplicate="Paste (Duplicate)"
9
+RemuxRecordings="Remux Recordings"
10
+
11
+# copy filters
12
+Copy.Filters="Copy Filters"
13
+Paste.Filters="Paste Filters"
14
15
# updater
16
Updater.Title="New update available"
17
18
OutputWarnings.NoTracksSelected="You must select at least one track"
19
OutputWarnings.MultiTrackRecording="Warning: Certain formats (such as FLV) do not support multiple tracks per recording"
20
OutputWarnings.MP4Recording="Warning: Recordings saved to MP4 will be unrecoverable if the file cannot be finalized (e.g. as a result of BSODs, power losses, etc.). If you want to record multiple audio tracks consider using MKV and remux the recording to mp4 after it is finished (File->Remux Recordings)"
21
+
22
+# deleting final scene
23
+FinalScene.Title="Delete Scene"
24
+FinalScene.Text="There needs to be at least one scene."
25
obs-studio-18.0.1.tar.xz/UI/forms/OBSBasic.ui -> obs-studio-18.0.2.tar.xz/UI/forms/OBSBasic.ui
Changed
75
1
2
<addaction name="actionScaleCanvas"/>
3
<addaction name="actionScaleOutput"/>
4
</widget>
5
+ <action name="actionCopySource">
6
+ <property name="text">
7
+ <string>Copy</string>
8
+ </property>
9
+ <property name="shortcut">
10
+ <string>Ctrl+C</string>
11
+ </property>
12
+ </action>
13
+ <action name="actionPasteRef">
14
+ <property name="enabled">
15
+ <bool>false</bool>
16
+ </property>
17
+ <property name="text">
18
+ <string>PasteReference</string>
19
+ </property>
20
+ <property name="iconText">
21
+ <string>PasteReference</string>
22
+ </property>
23
+ <property name="toolTip">
24
+ <string>PasteReference</string>
25
+ </property>
26
+ <property name="shortcut">
27
+ <string>Ctrl+V</string>
28
+ </property>
29
+ </action>
30
+ <action name="actionCopyFilters">
31
+ <property name="text">
32
+ <string>Copy.Filters</string>
33
+ </property>
34
+ </action>
35
+ <action name="actionPasteFilters">
36
+ <property name="enabled">
37
+ <bool>false</bool>
38
+ </property>
39
+ <property name="text">
40
+ <string>Paste.Filters</string>
41
+ </property>
42
+ </action>
43
+ <addaction name="actionCopySource"/>
44
+ <addaction name="actionPasteRef"/>
45
+ <addaction name="actionPasteDup"/>
46
+ <addaction name="separator"/>
47
+ <addaction name="actionCopyFilters"/>
48
+ <addaction name="actionPasteFilters"/>
49
+ <addaction name="separator"/>
50
<addaction name="transformMenu"/>
51
<addaction name="orderMenu"/>
52
<addaction name="scalingMenu"/>
53
54
<property name="text">
55
<string>Basic.MainMenu.Edit.Transform.EditTransform</string>
56
</property>
57
+ <property name="shortcut">
58
+ <string>Ctrl+E</string>
59
+ </property>
60
</action>
61
<action name="actionCopyTransform">
62
<property name="text">
63
64
<string>Basic.MainMenu.Edit.Scale.Output</string>
65
</property>
66
</action>
67
+ <action name="actionPasteDup">
68
+ <property name="text">
69
+ <string>PasteDuplicate</string>
70
+ </property>
71
+ </action>
72
</widget>
73
<customwidgets>
74
<customwidget>
75
obs-studio-18.0.1.tar.xz/UI/forms/OBSRemux.ui -> obs-studio-18.0.2.tar.xz/UI/forms/OBSRemux.ui
Changed
107
1
2
</rect>
3
</property>
4
<property name="windowTitle">
5
- <string>Dialog</string>
6
+ <string>RemuxRecordings</string>
7
</property>
8
- <widget class="QProgressBar" name="progressBar">
9
- <property name="geometry">
10
- <rect>
11
- <x>10</x>
12
- <y>90</y>
13
- <width>351</width>
14
- <height>23</height>
15
- </rect>
16
- </property>
17
- <property name="value">
18
- <number>24</number>
19
- </property>
20
- </widget>
21
- <widget class="QWidget" name="formLayoutWidget">
22
- <property name="geometry">
23
- <rect>
24
- <x>10</x>
25
- <y>10</y>
26
- <width>471</width>
27
- <height>71</height>
28
- </rect>
29
- </property>
30
- <layout class="QFormLayout" name="formLayout">
31
- <property name="fieldGrowthPolicy">
32
- <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
33
- </property>
34
- <property name="verticalSpacing">
35
- <number>6</number>
36
- </property>
37
+ <layout class="QGridLayout" name="formLayout">
38
<item row="1" column="0">
39
<widget class="QLabel" name="label">
40
<property name="text">
41
42
<layout class="QHBoxLayout" name="horizontalLayout_2">
43
<item>
44
<widget class="QLineEdit" name="sourceFile">
45
- <property name="sizePolicy">
46
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
47
- <horstretch>0</horstretch>
48
- <verstretch>0</verstretch>
49
- </sizepolicy>
50
- </property>
51
</widget>
52
</item>
53
<item>
54
55
<layout class="QHBoxLayout" name="horizontalLayout_3">
56
<item>
57
<widget class="QLineEdit" name="targetFile">
58
- <property name="sizePolicy">
59
- <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
60
- <horstretch>0</horstretch>
61
- <verstretch>0</verstretch>
62
- </sizepolicy>
63
- </property>
64
</widget>
65
</item>
66
<item>
67
68
</item>
69
</layout>
70
</item>
71
+ <item row="3" column="0" colspan="2">
72
+ <widget class="QProgressBar" name="progressBar">
73
+ <property name="value">
74
+ <number>24</number>
75
+ </property>
76
+ </widget>
77
+ </item>
78
+ <item row="4" column="1">
79
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
80
+ <item>
81
+ <widget class="QDialogButtonBox" name="buttonBox">
82
+ <property name="standardButtons">
83
+ <set>QDialogButtonBox::Ok|QDialogButtonBox::Close</set>
84
+ </property>
85
+ </widget>
86
+ </item>
87
+ </layout>
88
+ </item>
89
</layout>
90
- </widget>
91
- <widget class="QPushButton" name="remux">
92
- <property name="geometry">
93
- <rect>
94
- <x>370</x>
95
- <y>90</y>
96
- <width>111</width>
97
- <height>23</height>
98
- </rect>
99
- </property>
100
- <property name="text">
101
- <string>Remux.Remux</string>
102
- </property>
103
- </widget>
104
</widget>
105
<resources/>
106
<connections/>
107
obs-studio-18.0.1.tar.xz/UI/frontend-plugins/frontend-tools/CMakeLists.txt -> obs-studio-18.0.2.tar.xz/UI/frontend-plugins/frontend-tools/CMakeLists.txt
Changed
18
1
2
set(frontend-tools_PLATFORM_SOURCES
3
${frontend-tools_PLATFORM_SOURCES}
4
captions.cpp
5
- captions-stream.cpp)
6
+ captions-handler.cpp
7
+ captions-mssapi.cpp
8
+ captions-mssapi-stream.cpp)
9
set(frontend-tools_PLATFORM_HEADERS
10
captions.hpp
11
- captions-stream.hpp)
12
+ captions-handler.hpp
13
+ captions-mssapi.hpp
14
+ captions-mssapi-stream.hpp)
15
set(frontend-tools_PLATFORM_UI
16
forms/captions.ui)
17
endif()
18
obs-studio-18.0.2.tar.xz/UI/frontend-plugins/frontend-tools/captions-handler.cpp
Added
56
1
2
+#include "captions-handler.hpp"
3
+
4
+captions_handler::captions_handler(
5
+ captions_cb callback,
6
+ enum audio_format format,
7
+ uint32_t sample_rate)
8
+ : cb(callback)
9
+{
10
+ if (!reset_resampler(format, sample_rate))
11
+ throw CAPTIONS_ERROR_GENERIC_FAIL;
12
+}
13
+
14
+bool captions_handler::reset_resampler(
15
+ enum audio_format format,
16
+ uint32_t sample_rate)
17
+try {
18
+ obs_audio_info ai;
19
+ if (!obs_get_audio_info(&ai))
20
+ throw std::string("Failed to get OBS audio info");
21
+
22
+ resample_info src = {
23
+ ai.samples_per_sec,
24
+ AUDIO_FORMAT_FLOAT_PLANAR,
25
+ ai.speakers
26
+ };
27
+ resample_info dst = {
28
+ sample_rate,
29
+ format,
30
+ SPEAKERS_MONO
31
+ };
32
+
33
+ if (!resampler.reset(dst, src))
34
+ throw std::string("Failed to create audio resampler");
35
+
36
+ return true;
37
+
38
+} catch (std::string text) {
39
+ blog(LOG_WARNING, "%s: %s", __FUNCTION__, text.c_str());
40
+ return false;
41
+}
42
+
43
+void captions_handler::push_audio(const audio_data *audio)
44
+{
45
+ uint8_t *out[MAX_AV_PLANES];
46
+ uint32_t frames;
47
+ uint64_t ts_offset;
48
+ bool success;
49
+
50
+ success = audio_resampler_resample(resampler,
51
+ out, &frames, &ts_offset,
52
+ (const uint8_t *const *)audio->data, audio->frames);
53
+ if (success)
54
+ pcm_data(out[0], frames);
55
+}
56
obs-studio-18.0.2.tar.xz/UI/frontend-plugins/frontend-tools/captions-handler.hpp
Added
69
1
2
+#pragma once
3
+
4
+#include <media-io/audio-resampler.h>
5
+#include <obs-module.h>
6
+#include <functional>
7
+#include <string>
8
+
9
+class resampler_obj {
10
+ audio_resampler_t *resampler = nullptr;
11
+
12
+public:
13
+ inline ~resampler_obj()
14
+ {
15
+ audio_resampler_destroy(resampler);
16
+ }
17
+
18
+ inline bool reset(const resample_info &dst, const resample_info &src)
19
+ {
20
+ audio_resampler_destroy(resampler);
21
+ resampler = audio_resampler_create(&dst, &src);
22
+ return !!resampler;
23
+ }
24
+
25
+ inline operator audio_resampler_t*() {return resampler;}
26
+};
27
+
28
+/* ------------------------------------------------------------------------- */
29
+
30
+typedef std::function<void (const std::string &)> captions_cb;
31
+
32
+#define captions_error(s) std::string(obs_module_text("Captions.Error." ## s))
33
+#define CAPTIONS_ERROR_GENERIC_FAIL captions_error("GenericFail")
34
+
35
+/* ------------------------------------------------------------------------- */
36
+
37
+class captions_handler {
38
+ captions_cb cb;
39
+ resampler_obj resampler;
40
+
41
+protected:
42
+ inline void callback(const std::string &text)
43
+ {
44
+ cb(text);
45
+ }
46
+
47
+ virtual void pcm_data(const void *data, size_t frames)=0;
48
+
49
+ /* always resamples to 1 channel */
50
+ bool reset_resampler(enum audio_format format, uint32_t sample_rate);
51
+
52
+public:
53
+ /* throw std::string for errors shown to users */
54
+ captions_handler(
55
+ captions_cb callback,
56
+ enum audio_format format,
57
+ uint32_t sample_rate);
58
+ virtual ~captions_handler() {}
59
+
60
+ void push_audio(const audio_data *audio);
61
+};
62
+
63
+/* ------------------------------------------------------------------------- */
64
+
65
+struct captions_handler_info {
66
+ std::string (*name)(void);
67
+ captions_handler *(*create)(captions_cb cb, const std::string &lang);
68
+};
69
obs-studio-18.0.2.tar.xz/UI/frontend-plugins/frontend-tools/captions-mssapi-stream.cpp
Added
201
1
2
+#include "captions-mssapi-stream.hpp"
3
+#include "captions-mssapi.hpp"
4
+#include <mmreg.h>
5
+#include <util/windows/CoTaskMemPtr.hpp>
6
+#include <util/threading.h>
7
+#include <util/base.h>
8
+
9
+using namespace std;
10
+
11
+#if 0
12
+#define debugfunc(format, ...) blog(LOG_DEBUG, "[Captions] %s(" format ")", \
13
+ __FUNCTION__, ##__VA_ARGS__)
14
+#else
15
+#define debugfunc(format, ...)
16
+#endif
17
+
18
+CaptionStream::CaptionStream(DWORD samplerate_, mssapi_captions *handler_) :
19
+ handler(handler_),
20
+ samplerate(samplerate_),
21
+ event(CreateEvent(nullptr, false, false, nullptr))
22
+{
23
+ buf_info.ulMsMinNotification = 50;
24
+ buf_info.ulMsBufferSize = 500;
25
+ buf_info.ulMsEventBias = 0;
26
+
27
+ format.wFormatTag = WAVE_FORMAT_PCM;
28
+ format.nChannels = 1;
29
+ format.nSamplesPerSec = 16000;
30
+ format.nAvgBytesPerSec = format.nSamplesPerSec * sizeof(uint16_t);
31
+ format.nBlockAlign = 2;
32
+ format.wBitsPerSample = 16;
33
+ format.cbSize = sizeof(format);
34
+}
35
+
36
+void CaptionStream::Stop()
37
+{
38
+ {
39
+ lock_guard<mutex> lock(m);
40
+ circlebuf_free(buf);
41
+ }
42
+
43
+ cv.notify_one();
44
+}
45
+
46
+void CaptionStream::PushAudio(const void *data, size_t frames)
47
+{
48
+ bool ready = false;
49
+
50
+ lock_guard<mutex> lock(m);
51
+ circlebuf_push_back(buf, data, frames * sizeof(int16_t));
52
+ write_pos += frames * sizeof(int16_t);
53
+
54
+ if (wait_size && buf->size >= wait_size)
55
+ ready = true;
56
+ if (ready)
57
+ cv.notify_one();
58
+}
59
+
60
+// IUnknown methods
61
+
62
+STDMETHODIMP CaptionStream::QueryInterface(REFIID riid, void **ppv)
63
+{
64
+ if (riid == IID_IUnknown) {
65
+ AddRef();
66
+ *ppv = this;
67
+
68
+ } else if (riid == IID_IStream) {
69
+ AddRef();
70
+ *ppv = (IStream*)this;
71
+
72
+ } else if (riid == IID_ISpStreamFormat) {
73
+ AddRef();
74
+ *ppv = (ISpStreamFormat*)this;
75
+
76
+ } else if (riid == IID_ISpAudio) {
77
+ AddRef();
78
+ *ppv = (ISpAudio*)this;
79
+
80
+ } else {
81
+ *ppv = nullptr;
82
+ return E_NOINTERFACE;
83
+ }
84
+
85
+ return NOERROR;
86
+}
87
+
88
+STDMETHODIMP_(ULONG) CaptionStream::AddRef()
89
+{
90
+ return (ULONG)os_atomic_inc_long(&refs);
91
+}
92
+
93
+STDMETHODIMP_(ULONG) CaptionStream::Release()
94
+{
95
+ ULONG new_refs = (ULONG)os_atomic_dec_long(&refs);
96
+ if (!new_refs)
97
+ delete this;
98
+
99
+ return new_refs;
100
+}
101
+
102
+// ISequentialStream methods
103
+
104
+STDMETHODIMP CaptionStream::Read(void *data, ULONG bytes, ULONG *read_bytes)
105
+{
106
+ HRESULT hr = S_OK;
107
+ size_t cur_size;
108
+
109
+ debugfunc("data, %lu, read_bytes", bytes);
110
+ if (!data)
111
+ return STG_E_INVALIDPOINTER;
112
+
113
+ {
114
+ lock_guard<mutex> lock1(m);
115
+ wait_size = bytes;
116
+ cur_size = buf->size;
117
+ }
118
+
119
+ unique_lock<mutex> lock(m);
120
+
121
+ if (bytes > cur_size)
122
+ cv.wait(lock);
123
+
124
+ if (bytes > (ULONG)buf->size) {
125
+ bytes = (ULONG)buf->size;
126
+ hr = S_FALSE;
127
+ }
128
+ if (bytes)
129
+ circlebuf_pop_front(buf, data, bytes);
130
+ if (read_bytes)
131
+ *read_bytes = bytes;
132
+
133
+ wait_size = 0;
134
+ pos.QuadPart += bytes;
135
+ return hr;
136
+}
137
+
138
+STDMETHODIMP CaptionStream::Write(const void *, ULONG bytes,
139
+ ULONG*)
140
+{
141
+ debugfunc("data, %lu, written_bytes", bytes);
142
+ UNUSED_PARAMETER(bytes);
143
+
144
+ return STG_E_INVALIDFUNCTION;
145
+}
146
+
147
+// IStream methods
148
+
149
+STDMETHODIMP CaptionStream::Seek(LARGE_INTEGER move, DWORD origin,
150
+ ULARGE_INTEGER *new_pos)
151
+{
152
+ debugfunc("%lld, %lx, new_pos", move, origin);
153
+ UNUSED_PARAMETER(move);
154
+ UNUSED_PARAMETER(origin);
155
+
156
+ if (!new_pos)
157
+ return E_POINTER;
158
+
159
+ if (origin != SEEK_CUR || move.QuadPart != 0)
160
+ return E_NOTIMPL;
161
+
162
+ *new_pos = pos;
163
+ return S_OK;
164
+}
165
+
166
+STDMETHODIMP CaptionStream::SetSize(ULARGE_INTEGER new_size)
167
+{
168
+ debugfunc("%llu", new_size);
169
+ UNUSED_PARAMETER(new_size);
170
+ return STG_E_INVALIDFUNCTION;
171
+}
172
+
173
+STDMETHODIMP CaptionStream::CopyTo(IStream *stream, ULARGE_INTEGER bytes,
174
+ ULARGE_INTEGER *read_bytes,
175
+ ULARGE_INTEGER *written_bytes)
176
+{
177
+ HRESULT hr;
178
+
179
+ debugfunc("stream, %llu, read_bytes, written_bytes", bytes);
180
+
181
+ if (!stream)
182
+ return STG_E_INVALIDPOINTER;
183
+
184
+ ULONG written = 0;
185
+ if (bytes.QuadPart > (ULONGLONG)buf->size)
186
+ bytes.QuadPart = (ULONGLONG)buf->size;
187
+
188
+ lock_guard<mutex> lock(m);
189
+ temp_buf.resize((size_t)bytes.QuadPart);
190
+ circlebuf_peek_front(buf, &temp_buf[0], (size_t)bytes.QuadPart);
191
+
192
+ hr = stream->Write(temp_buf.data(), (ULONG)bytes.QuadPart, &written);
193
+
194
+ if (read_bytes)
195
+ *read_bytes = bytes;
196
+ if (written_bytes)
197
+ written_bytes->QuadPart = written;
198
+
199
+ return hr;
200
+}
201
obs-studio-18.0.2.tar.xz/UI/frontend-plugins/frontend-tools/captions-mssapi-stream.hpp
Added
96
1
2
+#pragma once
3
+
4
+#include <windows.h>
5
+#include <sapi.h>
6
+#include <condition_variable>
7
+#include <mutex>
8
+#include <vector>
9
+#include <obs.h>
10
+#include <util/circlebuf.h>
11
+#include <util/windows/WinHandle.hpp>
12
+
13
+#include <fstream>
14
+
15
+class CircleBuf {
16
+ circlebuf buf = {};
17
+public:
18
+ inline ~CircleBuf() {circlebuf_free(&buf);}
19
+ inline operator circlebuf*() {return &buf;}
20
+ inline circlebuf *operator->() {return &buf;}
21
+};
22
+
23
+class mssapi_captions;
24
+
25
+class CaptionStream : public ISpAudio {
26
+ volatile long refs = 1;
27
+ SPAUDIOBUFFERINFO buf_info = {};
28
+ mssapi_captions *handler;
29
+ ULONG notify_size = 0;
30
+ SPAUDIOSTATE state;
31
+ WinHandle event;
32
+ ULONG vol = 0;
33
+
34
+ std::condition_variable cv;
35
+ std::mutex m;
36
+ std::vector<int16_t> temp_buf;
37
+ WAVEFORMATEX format = {};
38
+
39
+ CircleBuf buf;
40
+ ULONG wait_size = 0;
41
+ DWORD samplerate = 0;
42
+ ULARGE_INTEGER pos = {};
43
+ ULONGLONG write_pos = 0;
44
+
45
+public:
46
+ CaptionStream(DWORD samplerate, mssapi_captions *handler_);
47
+
48
+ void Stop();
49
+ void PushAudio(const void *data, size_t frames);
50
+
51
+ // IUnknown methods
52
+ STDMETHODIMP QueryInterface(REFIID riid, void **ppv) override;
53
+ STDMETHODIMP_(ULONG) AddRef() override;
54
+ STDMETHODIMP_(ULONG) Release() override;
55
+
56
+ // ISequentialStream methods
57
+ STDMETHODIMP Read(void *data, ULONG bytes, ULONG *read_bytes) override;
58
+ STDMETHODIMP Write(const void *data, ULONG bytes, ULONG *written_bytes)
59
+ override;
60
+
61
+ // IStream methods
62
+ STDMETHODIMP Seek(LARGE_INTEGER move, DWORD origin,
63
+ ULARGE_INTEGER *new_pos) override;
64
+ STDMETHODIMP SetSize(ULARGE_INTEGER new_size) override;
65
+ STDMETHODIMP CopyTo(IStream *stream, ULARGE_INTEGER bytes,
66
+ ULARGE_INTEGER *read_bytes,
67
+ ULARGE_INTEGER *written_bytes) override;
68
+ STDMETHODIMP Commit(DWORD commit_flags) override;
69
+ STDMETHODIMP Revert(void) override;
70
+ STDMETHODIMP LockRegion(ULARGE_INTEGER offset, ULARGE_INTEGER size,
71
+ DWORD type) override;
72
+ STDMETHODIMP UnlockRegion(ULARGE_INTEGER offset, ULARGE_INTEGER size,
73
+ DWORD type) override;
74
+ STDMETHODIMP Stat(STATSTG *stg, DWORD flags) override;
75
+ STDMETHODIMP Clone(IStream **stream) override;
76
+
77
+ // ISpStreamFormat methods
78
+ STDMETHODIMP GetFormat(GUID *guid, WAVEFORMATEX **co_mem_wfex_out)
79
+ override;
80
+
81
+ // ISpAudio methods
82
+ STDMETHODIMP SetState(SPAUDIOSTATE state, ULONGLONG reserved) override;
83
+ STDMETHODIMP SetFormat(REFGUID guid_ref, const WAVEFORMATEX *wfex)
84
+ override;
85
+ STDMETHODIMP GetStatus(SPAUDIOSTATUS *status) override;
86
+ STDMETHODIMP SetBufferInfo(const SPAUDIOBUFFERINFO *buf_info) override;
87
+ STDMETHODIMP GetBufferInfo(SPAUDIOBUFFERINFO *buf_info) override;
88
+ STDMETHODIMP GetDefaultFormat(GUID *format,
89
+ WAVEFORMATEX **co_mem_wfex_out) override;
90
+ STDMETHODIMP_(HANDLE) EventHandle(void) override;
91
+ STDMETHODIMP GetVolumeLevel(ULONG *level) override;
92
+ STDMETHODIMP SetVolumeLevel(ULONG level) override;
93
+ STDMETHODIMP GetBufferNotifySize(ULONG *size) override;
94
+ STDMETHODIMP SetBufferNotifySize(ULONG size) override;
95
+};
96
obs-studio-18.0.2.tar.xz/UI/frontend-plugins/frontend-tools/captions-mssapi.cpp
Added
181
1
2
+#include "captions-mssapi.hpp"
3
+
4
+#define do_log(type, format, ...) blog(type, "[Captions] " format, \
5
+ ##__VA_ARGS__)
6
+
7
+#define error(format, ...) do_log(LOG_ERROR, format, ##__VA_ARGS__)
8
+#define debug(format, ...) do_log(LOG_DEBUG, format, ##__VA_ARGS__)
9
+
10
+mssapi_captions::mssapi_captions(
11
+ captions_cb callback,
12
+ const std::string &lang) try
13
+ : captions_handler(callback, AUDIO_FORMAT_16BIT, 16000)
14
+{
15
+ HRESULT hr;
16
+
17
+ std::wstring wlang;
18
+ wlang.resize(lang.size());
19
+
20
+ for (size_t i = 0; i < lang.size(); i++)
21
+ wlang[i] = (wchar_t)lang[i];
22
+
23
+ LCID lang_id = LocaleNameToLCID(wlang.c_str(), 0);
24
+
25
+ wchar_t lang_str[32];
26
+ _snwprintf(lang_str, 31, L"language=%x", (int)lang_id);
27
+
28
+ stop = CreateEvent(nullptr, false, false, nullptr);
29
+ if (!stop.Valid())
30
+ throw "Failed to create event";
31
+
32
+ hr = SpFindBestToken(SPCAT_RECOGNIZERS, lang_str, nullptr, &token);
33
+ if (FAILED(hr))
34
+ throw HRError("SpFindBestToken failed", hr);
35
+
36
+ hr = CoCreateInstance(CLSID_SpInprocRecognizer, nullptr, CLSCTX_ALL,
37
+ __uuidof(ISpRecognizer), (void**)&recognizer);
38
+ if (FAILED(hr))
39
+ throw HRError("CoCreateInstance for recognizer failed", hr);
40
+
41
+ hr = recognizer->SetRecognizer(token);
42
+ if (FAILED(hr))
43
+ throw HRError("SetRecognizer failed", hr);
44
+
45
+ hr = recognizer->SetRecoState(SPRST_INACTIVE);
46
+ if (FAILED(hr))
47
+ throw HRError("SetRecoState(SPRST_INACTIVE) failed", hr);
48
+
49
+ hr = recognizer->CreateRecoContext(&context);
50
+ if (FAILED(hr))
51
+ throw HRError("CreateRecoContext failed", hr);
52
+
53
+ ULONGLONG interest = SPFEI(SPEI_RECOGNITION) |
54
+ SPFEI(SPEI_END_SR_STREAM);
55
+ hr = context->SetInterest(interest, interest);
56
+ if (FAILED(hr))
57
+ throw HRError("SetInterest failed", hr);
58
+
59
+ hr = context->SetNotifyWin32Event();
60
+ if (FAILED(hr))
61
+ throw HRError("SetNotifyWin32Event", hr);
62
+
63
+ notify = context->GetNotifyEventHandle();
64
+ if (notify == INVALID_HANDLE_VALUE)
65
+ throw HRError("GetNotifyEventHandle failed", E_NOINTERFACE);
66
+
67
+ size_t sample_rate = audio_output_get_sample_rate(obs_get_audio());
68
+ audio = new CaptionStream((DWORD)sample_rate, this);
69
+ audio->Release();
70
+
71
+ hr = recognizer->SetInput(audio, false);
72
+ if (FAILED(hr))
73
+ throw HRError("SetInput failed", hr);
74
+
75
+ hr = context->CreateGrammar(1, &grammar);
76
+ if (FAILED(hr))
77
+ throw HRError("CreateGrammar failed", hr);
78
+
79
+ hr = grammar->LoadDictation(nullptr, SPLO_STATIC);
80
+ if (FAILED(hr))
81
+ throw HRError("LoadDictation failed", hr);
82
+
83
+ try {
84
+ t = std::thread([this] () {main_thread();});
85
+ } catch (...) {
86
+ throw "Failed to create thread";
87
+ }
88
+
89
+} catch (const char *err) {
90
+ blog(LOG_WARNING, "%s: %s", __FUNCTION__, err);
91
+ throw CAPTIONS_ERROR_GENERIC_FAIL;
92
+
93
+} catch (HRError err) {
94
+ blog(LOG_WARNING, "%s: %s (%lX)", __FUNCTION__, err.str, err.hr);
95
+ throw CAPTIONS_ERROR_GENERIC_FAIL;
96
+}
97
+
98
+mssapi_captions::~mssapi_captions()
99
+{
100
+ if (t.joinable()) {
101
+ SetEvent(stop);
102
+ t.join();
103
+ }
104
+}
105
+
106
+void mssapi_captions::main_thread()
107
+try {
108
+ HRESULT hr;
109
+
110
+ os_set_thread_name(__FUNCTION__);
111
+
112
+ hr = grammar->SetDictationState(SPRS_ACTIVE);
113
+ if (FAILED(hr))
114
+ throw HRError("SetDictationState failed", hr);
115
+
116
+ hr = recognizer->SetRecoState(SPRST_ACTIVE);
117
+ if (FAILED(hr))
118
+ throw HRError("SetRecoState(SPRST_ACTIVE) failed", hr);
119
+
120
+ HANDLE events[] = {notify, stop};
121
+
122
+ started = true;
123
+
124
+ for (;;) {
125
+ DWORD ret = WaitForMultipleObjects(2, events, false, INFINITE);
126
+ if (ret != WAIT_OBJECT_0)
127
+ break;
128
+
129
+ CSpEvent event;
130
+ bool exit = false;
131
+
132
+ while (event.GetFrom(context) == S_OK) {
133
+ if (event.eEventId == SPEI_RECOGNITION) {
134
+ ISpRecoResult *result = event.RecoResult();
135
+
136
+ CoTaskMemPtr<wchar_t> text;
137
+ hr = result->GetText((ULONG)-1, (ULONG)-1,
138
+ true, &text, nullptr);
139
+ if (FAILED(hr))
140
+ continue;
141
+
142
+ char text_utf8[512];
143
+ os_wcs_to_utf8(text, 0, text_utf8, 512);
144
+
145
+ callback(text_utf8);
146
+
147
+ blog(LOG_DEBUG, "\"%s\"", text_utf8);
148
+
149
+ } else if (event.eEventId == SPEI_END_SR_STREAM) {
150
+ exit = true;
151
+ break;
152
+ }
153
+ }
154
+
155
+ if (exit)
156
+ break;
157
+ }
158
+
159
+ audio->Stop();
160
+
161
+} catch (HRError err) {
162
+ blog(LOG_WARNING, "%s failed: %s (%lX)", __FUNCTION__, err.str, err.hr);
163
+}
164
+
165
+void mssapi_captions::pcm_data(const void *data, size_t frames)
166
+{
167
+ if (started)
168
+ audio->PushAudio(data, frames);
169
+}
170
+
171
+captions_handler_info mssapi_info = {
172
+ [] () -> std::string
173
+ {
174
+ return "Microsoft Speech-to-Text";
175
+ },
176
+ [] (captions_cb cb, const std::string &lang) -> captions_handler *
177
+ {
178
+ return new mssapi_captions(cb, lang);
179
+ }
180
+};
181
obs-studio-18.0.2.tar.xz/UI/frontend-plugins/frontend-tools/captions-mssapi.hpp
Added
39
1
2
+#pragma once
3
+
4
+#include "captions-handler.hpp"
5
+#include "captions-mssapi-stream.hpp"
6
+#include <util/windows/HRError.hpp>
7
+#include <util/windows/ComPtr.hpp>
8
+#include <util/windows/WinHandle.hpp>
9
+#include <util/windows/CoTaskMemPtr.hpp>
10
+#include <util/threading.h>
11
+#include <util/platform.h>
12
+#include <sphelper.h>
13
+
14
+#include <obs.hpp>
15
+
16
+#include <thread>
17
+
18
+class mssapi_captions : public captions_handler {
19
+ friend class CaptionStream;
20
+
21
+ ComPtr<CaptionStream> audio;
22
+ ComPtr<ISpObjectToken> token;
23
+ ComPtr<ISpRecoGrammar> grammar;
24
+ ComPtr<ISpRecognizer> recognizer;
25
+ ComPtr<ISpRecoContext> context;
26
+
27
+ HANDLE notify;
28
+ WinHandle stop;
29
+ std::thread t;
30
+ bool started = false;
31
+
32
+ void main_thread();
33
+
34
+public:
35
+ mssapi_captions(captions_cb callback, const std::string &lang);
36
+ virtual ~mssapi_captions();
37
+ virtual void pcm_data(const void *data, size_t frames) override;
38
+};
39
obs-studio-18.0.1.tar.xz/UI/frontend-plugins/frontend-tools/captions.cpp -> obs-studio-18.0.2.tar.xz/UI/frontend-plugins/frontend-tools/captions.cpp
Changed
201
1
2
+#include <QMessageBox>
3
+
4
+#include <windows.h>
5
#include <obs-frontend-api.h>
6
-#include "captions-stream.hpp"
7
#include "captions.hpp"
8
+#include "captions-handler.hpp"
9
#include "tool-helpers.hpp"
10
-#include <sphelper.h>
11
#include <util/dstr.hpp>
12
#include <util/platform.h>
13
-#include <util/windows/HRError.hpp>
14
+#include <util/windows/WinHandle.hpp>
15
#include <util/windows/ComPtr.hpp>
16
-#include <util/windows/CoTaskMemPtr.hpp>
17
-#include <util/threading.h>
18
#include <obs-module.h>
19
+#include <sphelper.h>
20
21
+#include <unordered_map>
22
+#include <vector>
23
#include <string>
24
#include <thread>
25
#include <mutex>
26
27
+#include "captions-mssapi.hpp"
28
+
29
#define do_log(type, format, ...) blog(type, "[Captions] " format, \
30
##__VA_ARGS__)
31
32
-#define error(format, ...) do_log(LOG_ERROR, format, ##__VA_ARGS__)
33
+#define warn(format, ...) do_log(LOG_WARNING, format, ##__VA_ARGS__)
34
#define debug(format, ...) do_log(LOG_DEBUG, format, ##__VA_ARGS__)
35
36
using namespace std;
37
38
-struct obs_captions {
39
- thread th;
40
- recursive_mutex m;
41
- WinHandle stop_event;
42
+#define DEFAULT_HANDLER "mssapi"
43
44
+struct obs_captions {
45
+ string handler_id = DEFAULT_HANDLER;
46
string source_name;
47
OBSWeakSource source;
48
- LANGID lang_id;
49
+ unique_ptr<captions_handler> handler;
50
+ LANGID lang_id = GetUserDefaultUILanguage();
51
52
- void main_thread();
53
- void start();
54
- void stop();
55
+ std::unordered_map<std::string, captions_handler_info&> handler_types;
56
57
- inline obs_captions() :
58
- stop_event(CreateEvent(nullptr, false, false, nullptr)),
59
- lang_id(GetUserDefaultUILanguage())
60
+ inline void register_handler(const char *id,
61
+ captions_handler_info &info)
62
{
63
+ handler_types.emplace(id, info);
64
}
65
66
+ void start();
67
+ void stop();
68
+
69
+ obs_captions();
70
inline ~obs_captions() {stop();}
71
};
72
73
74
{
75
ui->setupUi(this);
76
77
- lock_guard<recursive_mutex> lock(captions->m);
78
-
79
auto cb = [this] (obs_source_t *source)
80
{
81
uint32_t caps = obs_source_get_output_flags(source);
82
83
return (*static_cast<cb_t*>(data))(source);}, &cb);
84
ui->source->blockSignals(false);
85
86
+ for (auto &ht : captions->handler_types) {
87
+ QString name = ht.second.name().c_str();
88
+ QString id = ht.first.c_str();
89
+ ui->provider->addItem(name, id);
90
+ }
91
+
92
+ QString qhandler_id = captions->handler_id.c_str();
93
+ int idx = ui->provider->findData(qhandler_id);
94
+ if (idx != -1)
95
+ ui->provider->setCurrentIndex(idx);
96
+
97
ui->enable->blockSignals(true);
98
- ui->enable->setChecked(captions->th.joinable());
99
+ ui->enable->setChecked(!!captions->handler);
100
ui->enable->blockSignals(false);
101
102
vector<locale_info> locales;
103
104
ui->language->setEnabled(false);
105
106
} else if (!set_language) {
107
- bool started = captions->th.joinable();
108
+ bool started = !!captions->handler;
109
if (started)
110
captions->stop();
111
112
- captions->m.lock();
113
captions->lang_id = locales[0].id;
114
- captions->m.unlock();
115
116
if (started)
117
captions->start();
118
119
120
void CaptionsDialog::on_source_currentIndexChanged(int)
121
{
122
- bool started = captions->th.joinable();
123
+ bool started = !!captions->handler;
124
if (started)
125
captions->stop();
126
127
- captions->m.lock();
128
captions->source_name = ui->source->currentText().toUtf8().constData();
129
captions->source = GetWeakSourceByName(captions->source_name.c_str());
130
- captions->m.unlock();
131
132
if (started)
133
captions->start();
134
135
136
void CaptionsDialog::on_enable_clicked(bool checked)
137
{
138
- if (checked)
139
+ if (checked) {
140
captions->start();
141
- else
142
+ if (!captions->handler) {
143
+ ui->enable->blockSignals(true);
144
+ ui->enable->setChecked(false);
145
+ ui->enable->blockSignals(false);
146
+ }
147
+ } else {
148
captions->stop();
149
+ }
150
}
151
152
void CaptionsDialog::on_language_currentIndexChanged(int)
153
{
154
- bool started = captions->th.joinable();
155
+ bool started = !!captions->handler;
156
if (started)
157
captions->stop();
158
159
- captions->m.lock();
160
captions->lang_id = (LANGID)ui->language->currentData().toInt();
161
- captions->m.unlock();
162
163
if (started)
164
captions->start();
165
}
166
167
-/* ------------------------------------------------------------------------- */
168
-
169
-void obs_captions::main_thread()
170
-try {
171
- ComPtr<CaptionStream> audio;
172
- ComPtr<ISpObjectToken> token;
173
- ComPtr<ISpRecoGrammar> grammar;
174
- ComPtr<ISpRecognizer> recognizer;
175
- ComPtr<ISpRecoContext> context;
176
- HRESULT hr;
177
-
178
- auto cb = [&] (const struct audio_data *audio_data,
179
- bool muted)
180
- {
181
- audio->PushAudio(audio_data, muted);
182
- };
183
-
184
- using cb_t = decltype(cb);
185
-
186
- auto pre_cb = [] (void *param, obs_source_t*,
187
- const struct audio_data *audio_data, bool muted)
188
- {
189
- return (*static_cast<cb_t*>(param))(audio_data, muted);
190
- };
191
-
192
- os_set_thread_name(__FUNCTION__);
193
-
194
- CoInitialize(nullptr);
195
-
196
- wchar_t lang_str[32];
197
- _snwprintf(lang_str, 31, L"language=%x", (int)captions->lang_id);
198
-
199
- hr = SpFindBestToken(SPCAT_RECOGNIZERS, lang_str, nullptr, &token);
200
- if (FAILED(hr))
201
obs-studio-18.0.1.tar.xz/UI/frontend-plugins/frontend-tools/captions.hpp -> obs-studio-18.0.2.tar.xz/UI/frontend-plugins/frontend-tools/captions.hpp
Changed
7
1
2
void on_source_currentIndexChanged(int idx);
3
void on_enable_clicked(bool checked);
4
void on_language_currentIndexChanged(int idx);
5
+ void on_provider_currentIndexChanged(int idx);
6
};
7
obs-studio-18.0.1.tar.xz/UI/frontend-plugins/frontend-tools/data/locale/en-US.ini -> obs-studio-18.0.2.tar.xz/UI/frontend-plugins/frontend-tools/data/locale/en-US.ini
Changed
10
1
2
Captions="Captions (Experimental)"
3
Captions.AudioSource="Audio source"
4
Captions.CurrentSystemLanguage="Current System Language (%1)"
5
+Captions.Provider="Provider"
6
+Captions.Error.GenericFail="Failed to start captions"
7
8
OutputTimer="Output Timer"
9
OutputTimer.Stream="Stop streaming after:"
10
obs-studio-18.0.1.tar.xz/UI/frontend-plugins/frontend-tools/forms/captions.ui -> obs-studio-18.0.2.tar.xz/UI/frontend-plugins/frontend-tools/forms/captions.ui
Changed
31
1
2
<x>0</x>
3
<y>0</y>
4
<width>519</width>
5
- <height>140</height>
6
+ <height>152</height>
7
</rect>
8
</property>
9
<property name="windowTitle">
10
11
<item row="2" column="1">
12
<widget class="QComboBox" name="language"/>
13
</item>
14
+ <item row="3" column="1">
15
+ <widget class="QComboBox" name="provider">
16
+ <property name="insertPolicy">
17
+ <enum>QComboBox::InsertAlphabetically</enum>
18
+ </property>
19
+ </widget>
20
+ </item>
21
+ <item row="3" column="0">
22
+ <widget class="QLabel" name="label_3">
23
+ <property name="text">
24
+ <string>Captions.Provider</string>
25
+ </property>
26
+ </widget>
27
+ </item>
28
</layout>
29
</item>
30
<item>
31
obs-studio-18.0.1.tar.xz/UI/frontend-plugins/frontend-tools/forms/output-timer.ui -> obs-studio-18.0.2.tar.xz/UI/frontend-plugins/frontend-tools/forms/output-timer.ui
Changed
15
1
2
</property>
3
</widget>
4
</item>
5
+ <item row="6" column="8">
6
+ <widget class="QDialogButtonBox" name="buttonBox">
7
+ <property name="standardButtons">
8
+ <set>QDialogButtonBox::Close</set>
9
+ </property>
10
+ </widget>
11
+ </item>
12
</layout>
13
</widget>
14
<resources />
15
obs-studio-18.0.1.tar.xz/UI/frontend-plugins/frontend-tools/output-timer.cpp -> obs-studio-18.0.2.tar.xz/UI/frontend-plugins/frontend-tools/output-timer.cpp
Changed
10
1
2
SLOT(StreamingTimerButton()));
3
QObject::connect(ui->outputTimerRecord, SIGNAL(clicked()), this,
4
SLOT(RecordingTimerButton()));
5
+ QObject::connect(ui->buttonBox->button(QDialogButtonBox::Close),
6
+ SIGNAL(clicked()), this, SLOT(hide()));
7
8
streamingTimer = new QTimer(this);
9
streamingTimerDisplay = new QTimer(this);
10
obs-studio-18.0.1.tar.xz/UI/obs-app.cpp -> obs-studio-18.0.2.tar.xz/UI/obs-app.cpp
Changed
49
1
2
bool opt_studio_mode = false;
3
bool opt_start_replaybuffer = false;
4
bool opt_minimize_tray = false;
5
+bool opt_allow_opengl = false;
6
+bool opt_always_on_top = false;
7
string opt_starting_collection;
8
string opt_starting_profile;
9
string opt_starting_scene;
10
11
return ret;
12
}
13
14
-#define MAX_CRASH_REPORT_SIZE (50 * 1024)
15
+#define MAX_CRASH_REPORT_SIZE (150 * 1024)
16
17
#ifdef _WIN32
18
19
20
} else if (arg_is(argv[i], "--verbose", nullptr)) {
21
log_verbose = true;
22
23
+ } else if (arg_is(argv[i], "--always-on-top", nullptr)) {
24
+ opt_always_on_top = true;
25
+
26
} else if (arg_is(argv[i], "--unfiltered_log", nullptr)) {
27
unfiltered_log = true;
28
29
30
} else if (arg_is(argv[i], "--studio-mode", nullptr)) {
31
opt_studio_mode = true;
32
33
+ } else if (arg_is(argv[i], "--allow-opengl", nullptr)) {
34
+ opt_allow_opengl = true;
35
+
36
} else if (arg_is(argv[i], "--help", "-h")) {
37
std::cout <<
38
"--help, -h: Get list of available commands.\n\n" <<
39
40
"--minimize-to-tray: Minimize to system tray.\n" <<
41
"--portable, -p: Use portable mode.\n\n" <<
42
"--verbose: Make log more verbose.\n" <<
43
+ "--always-on-top: Start in 'always on top' mode.\n\n" <<
44
"--unfiltered_log: Make log unfiltered.\n\n" <<
45
+ "--allow-opengl: Allow OpenGL on Windows.\n\n" <<
46
"--version, -V: Get current version.\n";
47
48
exit(0);
49
obs-studio-18.0.1.tar.xz/UI/obs-app.hpp -> obs-studio-18.0.2.tar.xz/UI/obs-app.hpp
Changed
8
1
2
extern bool opt_start_replaybuffer;
3
extern bool opt_minimize_tray;
4
extern bool opt_studio_mode;
5
+extern bool opt_allow_opengl;
6
+extern bool opt_always_on_top;
7
extern std::string opt_starting_scene;
8
obs-studio-18.0.1.tar.xz/UI/obs-frontend-api/obs-frontend-api.cpp -> obs-studio-18.0.2.tar.xz/UI/obs-frontend-api/obs-frontend-api.cpp
Changed
24
1
2
if (callbacks_valid())
3
c->obs_frontend_pop_ui_translation();
4
}
5
+
6
+void obs_frontend_set_streaming_service(obs_service_t *service)
7
+{
8
+ if (callbacks_valid())
9
+ c->obs_frontend_set_streaming_service(service);
10
+}
11
+
12
+obs_service_t* obs_frontend_get_streaming_service(void)
13
+{
14
+ return !!callbacks_valid()
15
+ ? c->obs_frontend_get_streaming_service()
16
+ : nullptr;
17
+}
18
+
19
+void obs_frontend_save_streaming_service(void)
20
+{
21
+ if (callbacks_valid())
22
+ c->obs_frontend_save_streaming_service();
23
+}
24
obs-studio-18.0.1.tar.xz/UI/obs-frontend-api/obs-frontend-api.h -> obs-studio-18.0.2.tar.xz/UI/obs-frontend-api/obs-frontend-api.h
Changed
12
1
2
obs_frontend_translate_ui_cb translate);
3
EXPORT void obs_frontend_pop_ui_translation(void);
4
5
+EXPORT void obs_frontend_set_streaming_service(obs_service_t *service);
6
+EXPORT obs_service_t* obs_frontend_get_streaming_service(void);
7
+EXPORT void obs_frontend_save_streaming_service(void);
8
+
9
/* ------------------------------------------------------------------------- */
10
11
#ifdef __cplusplus
12
obs-studio-18.0.1.tar.xz/UI/obs-frontend-api/obs-frontend-internal.hpp -> obs-studio-18.0.2.tar.xz/UI/obs-frontend-api/obs-frontend-internal.hpp
Changed
13
1
2
obs_frontend_translate_ui_cb translate)=0;
3
virtual void obs_frontend_pop_ui_translation(void)=0;
4
5
+ virtual void obs_frontend_set_streaming_service(
6
+ obs_service_t *service)=0;
7
+ virtual obs_service_t *obs_frontend_get_streaming_service(void)=0;
8
+ virtual void obs_frontend_save_streaming_service()=0;
9
+
10
virtual void on_load(obs_data_t *settings)=0;
11
virtual void on_save(obs_data_t *settings)=0;
12
virtual void on_event(enum obs_frontend_event event)=0;
13
obs-studio-18.0.1.tar.xz/UI/properties-view.cpp -> obs-studio-18.0.2.tar.xz/UI/properties-view.cpp
Changed
77
1
2
QLineEdit *edit = new QLineEdit();
3
QPushButton *button = new QPushButton(QTStr("Browse"));
4
5
+ if (!obs_property_enabled(prop)) {
6
+ edit->setEnabled(false);
7
+ button->setEnabled(false);
8
+ }
9
+
10
edit->setText(QT_UTF8(val));
11
edit->setReadOnly(true);
12
edit->setToolTip(QT_UTF8(obs_property_long_description(prop)));
13
14
int val = (int)obs_data_get_int(settings, name);
15
QSpinBox *spin = new QSpinBox();
16
17
+ if (!obs_property_enabled(prop))
18
+ spin->setEnabled(false);
19
+
20
int minVal = obs_property_int_min(prop);
21
int maxVal = obs_property_int_max(prop);
22
int stepVal = obs_property_int_step(prop);
23
24
double val = obs_data_get_double(settings, name);
25
QDoubleSpinBox *spin = new QDoubleSpinBox();
26
27
+ if (!obs_property_enabled(prop))
28
+ spin->setEnabled(false);
29
+
30
double minVal = obs_property_float_min(prop);
31
double maxVal = obs_property_float_max(prop);
32
double stepVal = obs_property_float_step(prop);
33
34
QListWidget *list = new QListWidget();
35
size_t count = obs_data_array_count(array);
36
37
+ if (!obs_property_enabled(prop))
38
+ list->setEnabled(false);
39
+
40
list->setSortingEnabled(false);
41
list->setSelectionMode(QAbstractItemView::ExtendedSelection);
42
list->setToolTip(QT_UTF8(obs_property_long_description(prop)));
43
44
long long val = obs_data_get_int(settings, name);
45
QColor color = color_from_int(val);
46
47
+ if (!obs_property_enabled(prop)) {
48
+ button->setEnabled(false);
49
+ colorLabel->setEnabled(false);
50
+ }
51
+
52
button->setText(QTStr("Basic.PropertiesWindow.SelectColor"));
53
button->setToolTip(QT_UTF8(obs_property_long_description(prop)));
54
55
56
QLabel *fontLabel = new QLabel;
57
QFont font;
58
59
+ if (!obs_property_enabled(prop)) {
60
+ button->setEnabled(false);
61
+ fontLabel->setEnabled(false);
62
+ }
63
+
64
font = fontLabel->font();
65
MakeQFont(font_obj, font, true);
66
67
68
label->setAlignment(Qt::AlignRight | Qt::AlignVCenter);
69
}
70
71
+ if (label && !obs_property_enabled(property))
72
+ label->setEnabled(false);
73
+
74
if (!widget)
75
return;
76
77
obs-studio-18.0.1.tar.xz/UI/win-update/updater/CMakeLists.txt -> obs-studio-18.0.2.tar.xz/UI/win-update/updater/CMakeLists.txt
Changed
12
1
2
return()
3
endif()
4
5
+if(DISABLE_UPDATE_MODULE)
6
+ return()
7
+endif()
8
+
9
if(NOT DEFINED STATIC_ZLIB_PATH OR "${STATIC_ZLIB_PATH}" STREQUAL "")
10
message(STATUS "STATIC_ZLIB_PATH not set, windows updater disabled")
11
return()
12
obs-studio-18.0.1.tar.xz/UI/win-update/updater/http.cpp -> obs-studio-18.0.2.tar.xz/UI/win-update/updater/http.cpp
Changed
29
1
2
static bool ReadZippedHTTPData(string &responseBuf, z_stream *strm,
3
string &zipBuf, const uint8_t *buffer, DWORD outSize)
4
{
5
- do {
6
- strm->avail_in = outSize;
7
- strm->next_in = buffer;
8
+ strm->avail_in = outSize;
9
+ strm->next_in = buffer;
10
11
+ do {
12
strm->avail_out = (uInt)zipBuf.size();
13
strm->next_out = (Bytef *)zipBuf.data();
14
15
16
string &zipBuf, const uint8_t *buffer, DWORD outSize,
17
int *responseCode)
18
{
19
- do {
20
- strm->avail_in = outSize;
21
- strm->next_in = buffer;
22
+ strm->avail_in = outSize;
23
+ strm->next_in = buffer;
24
25
+ do {
26
strm->avail_out = (uInt)zipBuf.size();
27
strm->next_out = (Bytef *)zipBuf.data();
28
29
obs-studio-18.0.1.tar.xz/UI/win-update/updater/updater.cpp -> obs-studio-18.0.2.tar.xz/UI/win-update/updater/updater.cpp
Changed
89
1
2
return false;
3
}
4
5
+static inline bool is_64bit_windows(void)
6
+{
7
+#ifdef _WIN64
8
+ return true;
9
+#else
10
+ BOOL x86 = false;
11
+ bool success = !!IsWow64Process(GetCurrentProcess(), &x86);
12
+ return success && !!x86;
13
+#endif
14
+}
15
+
16
+static inline bool is_64bit_file(const char *file)
17
+{
18
+ if (!file)
19
+ return false;
20
+
21
+ return strstr(file, "64bit") != nullptr ||
22
+ strstr(file, "64.dll") != nullptr ||
23
+ strstr(file, "64.exe") != nullptr;
24
+}
25
+
26
#define UTF8ToWideBuf(wide, utf8) UTF8ToWide(wide, _countof(wide), utf8)
27
#define WideToUTF8Buf(utf8, wide) WideToUTF8(utf8, _countof(utf8), wide)
28
29
30
json_t *name = json_object_get(package, "name");
31
json_t *files = json_object_get(package, "files");
32
33
+ bool isWin64 = is_64bit_windows();
34
+
35
if (!json_is_array(files))
36
return true;
37
if (!json_is_string(name))
38
39
if (strlen(hashUTF8) != BLAKE2_HASH_LENGTH * 2)
40
continue;
41
42
+ if (!isWin64 && is_64bit_file(fileUTF8))
43
+ continue;
44
+
45
/* convert strings to wide */
46
47
wchar_t sourceURL[1024];
48
49
50
StringCbPrintf(manifestPath, sizeof(manifestPath),
51
L"%s\\updates\\manifest.json", lpAppDataPath);
52
- if (!GetTempPathW(_countof(tempPath), tempPath)) {
53
+ if (!GetTempPathW(_countof(tempDirName), tempDirName)) {
54
Status(L"Update failed: Failed to get temp path: %ld",
55
GetLastError());
56
return false;
57
}
58
- if (!GetTempFileNameW(tempDirName, L"obs-studio", 0, tempDirName)) {
59
+ if (!GetTempFileNameW(tempDirName, L"obs-studio", 0, tempPath)) {
60
Status(L"Update failed: Failed to create temp dir name: %ld",
61
GetLastError());
62
return false;
63
}
64
65
- StringCbCat(tempPath, sizeof(tempPath), tempDirName);
66
+ DeleteFile(tempPath);
67
CreateDirectory(tempPath, nullptr);
68
69
/* ------------------------------------- *
70
71
* Send file hashes */
72
73
string newManifest;
74
- {
75
+
76
+ if (json_array_size(files) > 0) {
77
char *post_body = json_dumps(files, JSON_COMPACT);
78
79
int responseCode;
80
81
responseCode);
82
return false;
83
}
84
+ } else {
85
+ newManifest = "[]";
86
}
87
88
/* ------------------------------------- *
89
obs-studio-18.0.1.tar.xz/UI/window-basic-adv-audio.cpp -> obs-studio-18.0.2.tar.xz/UI/window-basic-adv-audio.cpp
Changed
31
1
2
#include <QVBoxLayout>
3
+#include <QHBoxLayout>
4
#include <QGridLayout>
5
#include <QScrollArea>
6
+#include <QPushButton>
7
#include <QLabel>
8
#include "window-basic-adv-audio.hpp"
9
#include "window-basic-main.hpp"
10
11
scrollArea->setWidget(widget);
12
scrollArea->setWidgetResizable(true);
13
14
+ QPushButton *closeButton = new QPushButton(QTStr("Close"));
15
+
16
+ QHBoxLayout *buttonLayout = new QHBoxLayout;
17
+ buttonLayout->addStretch();
18
+ buttonLayout->addWidget(closeButton);
19
+
20
vlayout = new QVBoxLayout;
21
vlayout->setContentsMargins(11, 11, 11, 11);
22
vlayout->addWidget(scrollArea);
23
+ vlayout->addLayout(buttonLayout);
24
setLayout(vlayout);
25
26
+ connect(closeButton, &QPushButton::clicked, [this] () {close();});
27
+
28
installEventFilter(CreateShortcutFilter());
29
30
/* enum user scene/sources */
31
obs-studio-18.0.1.tar.xz/UI/window-basic-main-dropfiles.cpp -> obs-studio-18.0.2.tar.xz/UI/window-basic-main-dropfiles.cpp
Changed
37
1
2
obs_data_t *settings = obs_data_create();
3
obs_source_t *source = nullptr;
4
const char *type = nullptr;
5
+ QString name;
6
7
switch (image) {
8
case DropType_RawText:
9
10
case DropType_Text:
11
obs_data_set_bool(settings, "read_from_file", true);
12
obs_data_set_string(settings, "file", data);
13
+ name = QUrl::fromLocalFile(QString(data)).fileName();
14
type = "text_gdiplus";
15
break;
16
case DropType_Image:
17
obs_data_set_string(settings, "file", data);
18
+ name = QUrl::fromLocalFile(QString(data)).fileName();
19
type = "image_source";
20
break;
21
case DropType_Media:
22
obs_data_set_string(settings, "local_file", data);
23
+ name = QUrl::fromLocalFile(QString(data)).fileName();
24
type = "ffmpeg_source";
25
break;
26
}
27
28
- const char *name = obs_source_get_display_name(type);
29
- source = obs_source_create(type, GenerateSourceName(name).c_str(),
30
+ if (name.isEmpty())
31
+ name = obs_source_get_display_name(type);
32
+ source = obs_source_create(type,
33
+ GenerateSourceName(QT_TO_UTF8(name)).c_str(),
34
settings, nullptr);
35
if (source) {
36
OBSScene scene = main->GetCurrentScene();
37
obs-studio-18.0.1.tar.xz/UI/window-basic-main-scene-collections.cpp -> obs-studio-18.0.2.tar.xz/UI/window-basic-main-scene-collections.cpp
Changed
11
1
2
3
OBSBasic *main = reinterpret_cast<OBSBasic*>(App()->GetMainWindow());
4
main->OpenSavedProjectors();
5
+ main->ui->actionPasteFilters->setEnabled(false);
6
+ main->ui->actionPasteRef->setEnabled(false);
7
+ main->ui->actionPasteDup->setEnabled(false);
8
}
9
10
void OBSBasic::on_actionNewSceneCollection_triggered()
11
obs-studio-18.0.1.tar.xz/UI/window-basic-main.cpp -> obs-studio-18.0.2.tar.xz/UI/window-basic-main.cpp
Changed
149
1
2
3
bool alwaysOnTop = config_get_bool(App()->GlobalConfig(), "BasicWindow",
4
"AlwaysOnTop");
5
- if (alwaysOnTop) {
6
+ if (alwaysOnTop || opt_always_on_top) {
7
SetAlwaysOnTop(this, true);
8
ui->actionAlwaysOnTop->setChecked(true);
9
}
10
11
12
QListWidgetItem *sel = nullptr;
13
int count = ui->scenes->count();
14
+
15
for (int i = 0; i < count; i++) {
16
auto item = ui->scenes->item(i);
17
auto cur_scene = GetOBSRef<OBSScene>(item);
18
19
20
bool OBSBasic::QueryRemoveSource(obs_source_t *source)
21
{
22
+ if (obs_source_get_type(source) == OBS_SOURCE_TYPE_SCENE) {
23
+ int count = ui->scenes->count();
24
+
25
+ if (count == 1) {
26
+ QMessageBox::information(this,
27
+ QTStr("FinalScene.Title"),
28
+ QTStr("FinalScene.Text"));
29
+ return false;
30
+ }
31
+ }
32
+
33
const char *name = obs_source_get_name(source);
34
35
QString text = QTStr("ConfirmRemove.Text");
36
37
#endif
38
}
39
40
-#ifdef __APPLE__
41
-#define VERSION_ENTRY "mac"
42
-#elif _WIN32
43
-#define VERSION_ENTRY "windows"
44
-#else
45
-#define VERSION_ENTRY "other"
46
-#endif
47
-
48
void OBSBasic::updateCheckFinished()
49
{
50
ui->actionCheckForUpdates->setEnabled(true);
51
52
{
53
if (event->type() == QEvent::WindowStateChange &&
54
isMinimized() &&
55
+ trayIcon &&
56
trayIcon->isVisible() &&
57
sysTrayMinimizeToTray()) {
58
59
60
if (addSourceMenu)
61
popup.addMenu(addSourceMenu);
62
63
+ ui->actionCopyFilters->setEnabled(false);
64
+
65
+ popup.addSeparator();
66
+ popup.addAction(ui->actionCopySource);
67
+ popup.addAction(ui->actionPasteRef);
68
+ popup.addAction(ui->actionPasteDup);
69
+ popup.addSeparator();
70
+
71
+ popup.addSeparator();
72
+ popup.addAction(ui->actionCopyFilters);
73
+ popup.addAction(ui->actionPasteFilters);
74
+ popup.addSeparator();
75
+
76
if (item) {
77
if (addSourceMenu)
78
popup.addSeparator();
79
80
SLOT(OpenFilters()));
81
popup.addAction(QTStr("Properties"), this,
82
SLOT(on_actionSourceProperties_triggered()));
83
+
84
+ ui->actionCopyFilters->setEnabled(true);
85
}
86
87
popup.exec(QCursor::pos());
88
89
return config_get_bool(GetGlobalConfig(),
90
"BasicWindow", "SysTrayMinimizeToTray");
91
}
92
+
93
+void OBSBasic::on_actionCopySource_triggered()
94
+{
95
+ on_actionCopyTransform_triggered();
96
+
97
+ OBSSceneItem item = GetCurrentSceneItem();
98
+
99
+ if (!item)
100
+ return;
101
+
102
+ OBSSource source = obs_sceneitem_get_source(item);
103
+
104
+ copyString = obs_source_get_name(source);
105
+ copyVisible = obs_sceneitem_visible(item);
106
+
107
+ ui->actionPasteRef->setEnabled(true);
108
+ ui->actionPasteDup->setEnabled(true);
109
+}
110
+
111
+void OBSBasic::on_actionPasteRef_triggered()
112
+{
113
+ OBSBasicSourceSelect::SourcePaste(copyString, copyVisible, false);
114
+ on_actionPasteTransform_triggered();
115
+}
116
+
117
+void OBSBasic::on_actionPasteDup_triggered()
118
+{
119
+ OBSBasicSourceSelect::SourcePaste(copyString, copyVisible, true);
120
+ on_actionPasteTransform_triggered();
121
+}
122
+
123
+void OBSBasic::on_actionCopyFilters_triggered()
124
+{
125
+ OBSSceneItem item = GetCurrentSceneItem();
126
+
127
+ if (!item)
128
+ return;
129
+
130
+ OBSSource source = obs_sceneitem_get_source(item);
131
+
132
+ copyFiltersString = obs_source_get_name(source);
133
+
134
+ ui->actionPasteFilters->setEnabled(true);
135
+}
136
+
137
+void OBSBasic::on_actionPasteFilters_triggered()
138
+{
139
+ OBSSource source = obs_get_source_by_name(copyFiltersString);
140
+ OBSSceneItem sceneItem = GetCurrentSceneItem();
141
+
142
+ OBSSource dstSource = obs_sceneitem_get_source(sceneItem);
143
+
144
+ if (source == dstSource)
145
+ return;
146
+
147
+ obs_source_copy_filters(dstSource, source);
148
+}
149
obs-studio-18.0.1.tar.xz/UI/window-basic-main.hpp -> obs-studio-18.0.2.tar.xz/UI/window-basic-main.hpp
Changed
26
1
2
bool projectChanged = false;
3
bool previewEnabled = true;
4
5
+ const char *copyString;
6
+ const char *copyFiltersString;
7
+ bool copyVisible = true;
8
+
9
QPointer<QThread> updateCheckThread;
10
QPointer<QThread> logUploadThread;
11
12
13
14
void ToggleShowHide();
15
16
+ void on_actionCopySource_triggered();
17
+ void on_actionPasteRef_triggered();
18
+ void on_actionPasteDup_triggered();
19
+
20
+ void on_actionCopyFilters_triggered();
21
+ void on_actionPasteFilters_triggered();
22
+
23
private:
24
/* OBS Callbacks */
25
static void SceneReordered(void *data, calldata_t *params);
26
obs-studio-18.0.1.tar.xz/UI/window-basic-preview.hpp -> obs-studio-18.0.2.tar.xz/UI/window-basic-preview.hpp
Changed
10
1
2
/* use libobs allocator for alignment because the matrices itemToScreen
3
* and screenToItem may contain SSE data, which will cause SSE
4
* instructions to crash if the data is not aligned to at least a 16
5
- * byte boundry. */
6
+ * byte boundary. */
7
static inline void* operator new(size_t size) {return bmalloc(size);}
8
static inline void operator delete(void* ptr) {bfree(ptr);}
9
};
10
obs-studio-18.0.1.tar.xz/UI/window-basic-settings.cpp -> obs-studio-18.0.2.tar.xz/UI/window-basic-settings.cpp
Changed
29
1
2
"Renderer");
3
4
ui->renderer->addItem(QT_UTF8("Direct3D 11"));
5
- ui->renderer->addItem(QT_UTF8("OpenGL"));
6
+ if (opt_allow_opengl || strcmp(renderer, "OpenGL") == 0)
7
+ ui->renderer->addItem(QT_UTF8("OpenGL"));
8
9
int idx = ui->renderer->findText(QT_UTF8(renderer));
10
if (idx == -1)
11
idx = 0;
12
13
- if (strcmp(renderer, "OpenGL") == 0) {
14
- delete ui->adapter;
15
- delete ui->adapterLabel;
16
- ui->adapter = nullptr;
17
- ui->adapterLabel = nullptr;
18
- }
19
+ // the video adapter selection is not currently implemented, hide for now
20
+ // to avoid user confusion. was previously protected by
21
+ // if (strcmp(renderer, "OpenGL") == 0)
22
+ delete ui->adapter;
23
+ delete ui->adapterLabel;
24
+ ui->adapter = nullptr;
25
+ ui->adapterLabel = nullptr;
26
27
ui->renderer->setCurrentIndex(idx);
28
#endif
29
obs-studio-18.0.1.tar.xz/UI/window-basic-source-select.cpp -> obs-studio-18.0.2.tar.xz/UI/window-basic-source-select.cpp
Changed
67
1
2
obs_sceneitem_set_visible(sceneitem, data->visible);
3
}
4
5
-static void AddExisting(const char *name, const bool visible)
6
+static char *get_new_source_name(const char *name)
7
+{
8
+ struct dstr new_name = {0};
9
+ int inc = 0;
10
+
11
+ dstr_copy(&new_name, name);
12
+
13
+ for (;;) {
14
+ obs_source_t *existing_source = obs_get_source_by_name(
15
+ new_name.array);
16
+ if (!existing_source)
17
+ break;
18
+
19
+ obs_source_release(existing_source);
20
+
21
+ dstr_printf(&new_name, "%s %d", name, ++inc + 1);
22
+ }
23
+
24
+ return new_name.array;
25
+}
26
+
27
+static void AddExisting(const char *name, bool visible, bool duplicate)
28
{
29
OBSBasic *main = reinterpret_cast<OBSBasic*>(App()->GetMainWindow());
30
OBSScene scene = main->GetCurrentScene();
31
32
33
obs_source_t *source = obs_get_source_by_name(name);
34
if (source) {
35
+ if (duplicate) {
36
+ obs_source_t *from = source;
37
+ char *new_name = get_new_source_name(name);
38
+ source = obs_source_duplicate(from, new_name, false);
39
+ bfree(new_name);
40
+ obs_source_release(from);
41
+
42
+ if (!source)
43
+ return;
44
+ }
45
+
46
AddSourceData data;
47
data.source = source;
48
data.visible = visible;
49
50
if (!item)
51
return;
52
53
- AddExisting(QT_TO_UTF8(item->text()), visible);
54
+ AddExisting(QT_TO_UTF8(item->text()), visible, false);
55
} else {
56
if (ui->sourceName->text().isEmpty()) {
57
QMessageBox::information(this,
58
59
obs_enum_sources(EnumSources, this);
60
}
61
}
62
+
63
+void OBSBasicSourceSelect::SourcePaste(const char *name, bool visible, bool dup)
64
+{
65
+ AddExisting(name, visible, dup);
66
+}
67
obs-studio-18.0.1.tar.xz/UI/window-basic-source-select.hpp -> obs-studio-18.0.2.tar.xz/UI/window-basic-source-select.hpp
Changed
8
1
2
OBSBasicSourceSelect(OBSBasic *parent, const char *id);
3
4
OBSSource newSource;
5
+
6
+ static void SourcePaste(const char *name, bool visible, bool duplicate);
7
};
8
obs-studio-18.0.1.tar.xz/UI/window-remux.cpp -> obs-studio-18.0.2.tar.xz/UI/window-remux.cpp
Changed
69
1
2
ui->setupUi(this);
3
4
ui->progressBar->setVisible(false);
5
- ui->remux->setEnabled(false);
6
+ ui->buttonBox->button(QDialogButtonBox::Ok)->
7
+ setEnabled(false);
8
ui->targetFile->setEnabled(false);
9
ui->browseTarget->setEnabled(false);
10
11
12
[&]() { BrowseInput(); });
13
connect(ui->browseTarget, &QPushButton::clicked,
14
[&]() { BrowseOutput(); });
15
- connect(ui->remux, &QPushButton::clicked, [&]() { Remux(); });
16
17
connect(ui->sourceFile, &QLineEdit::textChanged,
18
this, &OBSRemux::inputChanged);
19
20
+ ui->buttonBox->button(QDialogButtonBox::Ok)->
21
+ setText(QTStr("Remux.Remux"));
22
+
23
+ connect(ui->buttonBox->button(QDialogButtonBox::Ok),
24
+ SIGNAL(clicked()), this, SLOT(Remux()));
25
+
26
+ connect(ui->buttonBox->button(QDialogButtonBox::Close),
27
+ SIGNAL(clicked()), this, SLOT(close()));
28
+
29
worker->moveToThread(&remuxer);
30
remuxer.start();
31
32
33
void OBSRemux::inputChanged(const QString &path)
34
{
35
if (!QFileInfo::exists(path)) {
36
- ui->remux->setEnabled(false);
37
+ ui->buttonBox->button(QDialogButtonBox::Ok)->
38
+ setEnabled(false);
39
return;
40
}
41
42
ui->sourceFile->setText(path);
43
- ui->remux->setEnabled(true);
44
+ ui->buttonBox->button(QDialogButtonBox::Ok)->
45
+ setEnabled(true);
46
47
QFileInfo fi(path);
48
QString mp4 = fi.path() + "/" + fi.baseName() + ".mp4";
49
50
worker->lastProgress = 0.f;
51
52
ui->progressBar->setVisible(true);
53
- ui->remux->setEnabled(false);
54
+ ui->buttonBox->button(QDialogButtonBox::Ok)->
55
+ setEnabled(false);
56
57
emit remux();
58
}
59
60
61
worker->job.reset();
62
ui->progressBar->setVisible(false);
63
- ui->remux->setEnabled(true);
64
+ ui->buttonBox->button(QDialogButtonBox::Ok)->
65
+ setEnabled(true);
66
}
67
68
RemuxWorker::RemuxWorker()
69
obs-studio-18.0.1.tar.xz/UI/window-remux.hpp -> obs-studio-18.0.2.tar.xz/UI/window-remux.hpp
Changed
17
1
2
3
void BrowseInput();
4
void BrowseOutput();
5
- void Remux();
6
7
bool Stop();
8
9
10
public slots:
11
void updateProgress(float percent);
12
void remuxFinished(bool success);
13
+ void Remux();
14
15
signals:
16
void remux();
17
obs-studio-18.0.1.tar.xz/deps/CMakeLists.txt -> obs-studio-18.0.2.tar.xz/deps/CMakeLists.txt
Changed
15
1
2
3
add_subdirectory(glad)
4
add_subdirectory(ipc-util)
5
-add_subdirectory(libff)
6
+
7
+if(BUILD_LIBFF)
8
+ add_subdirectory(libff)
9
+endif()
10
+
11
+add_subdirectory(media-playback)
12
add_subdirectory(file-updater)
13
14
if(WIN32)
15
obs-studio-18.0.2.tar.xz/deps/jansson/test/suites/.gitattributes
Added
5
1
2
+api/ text=auto
3
+* text eol=lf
4
\ No newline at end of file
5
obs-studio-18.0.1.tar.xz/deps/libff/libff/ff-util.c -> obs-studio-18.0.2.tar.xz/deps/libff/libff/ff-util.c
Changed
10
1
2
void ff_init()
3
{
4
av_register_all();
5
- avdevice_register_all();
6
+ //avdevice_register_all();
7
avcodec_register_all();
8
avformat_network_init();
9
}
10
obs-studio-18.0.2.tar.xz/deps/media-playback
Added
2
1
+(directory)
2
obs-studio-18.0.2.tar.xz/deps/media-playback/CMakeLists.txt
Added
38
1
2
+project(media-playback)
3
+
4
+find_package(FFmpeg REQUIRED
5
+ COMPONENTS avcodec avdevice avutil avformat)
6
+
7
+include_directories(
8
+ ${CMAKE_SOURCE_DIR}/libobs
9
+ ${FFMPEG_INCLUDE_DIRS}
10
+ )
11
+
12
+set(media-playback_HEADERS
13
+ media-playback/decode.h
14
+ media-playback/media.h
15
+ )
16
+set(media-playback_SOURCES
17
+ media-playback/decode.c
18
+ media-playback/media.c
19
+ )
20
+
21
+add_library(media-playback STATIC
22
+ ${media-playback_HEADERS}
23
+ ${media-playback_SOURCES}
24
+ )
25
+target_include_directories(media-playback
26
+ PUBLIC .
27
+ )
28
+
29
+if(NOT MSVC)
30
+ if(NOT MINGW)
31
+ target_compile_options(media-playback PRIVATE -fPIC)
32
+ endif()
33
+endif()
34
+
35
+target_link_libraries(media-playback
36
+ ${FFMPEG_LIBRARIES}
37
+ )
38
obs-studio-18.0.2.tar.xz/deps/media-playback/media-playback
Added
2
1
+(directory)
2
obs-studio-18.0.2.tar.xz/deps/media-playback/media-playback/closest-format.h
Added
74
1
2
+/*
3
+ * Copyright (c) 2017 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
+static enum AVPixelFormat closest_format(enum AVPixelFormat fmt)
21
+{
22
+ switch (fmt) {
23
+ case AV_PIX_FMT_YUYV422:
24
+ return AV_PIX_FMT_YUYV422;
25
+
26
+ case AV_PIX_FMT_YUV422P:
27
+ case AV_PIX_FMT_YUVJ422P:
28
+ case AV_PIX_FMT_UYVY422:
29
+ case AV_PIX_FMT_YUV422P16LE:
30
+ case AV_PIX_FMT_YUV422P16BE:
31
+ case AV_PIX_FMT_YUV422P10BE:
32
+ case AV_PIX_FMT_YUV422P10LE:
33
+ case AV_PIX_FMT_YUV422P9BE:
34
+ case AV_PIX_FMT_YUV422P9LE:
35
+ case AV_PIX_FMT_YVYU422:
36
+ case AV_PIX_FMT_YUV422P12BE:
37
+ case AV_PIX_FMT_YUV422P12LE:
38
+ case AV_PIX_FMT_YUV422P14BE:
39
+ case AV_PIX_FMT_YUV422P14LE:
40
+ return AV_PIX_FMT_UYVY422;
41
+
42
+ case AV_PIX_FMT_NV12:
43
+ case AV_PIX_FMT_NV21:
44
+ return AV_PIX_FMT_NV12;
45
+
46
+ case AV_PIX_FMT_YUV420P:
47
+ case AV_PIX_FMT_YUVJ420P:
48
+ case AV_PIX_FMT_YUV411P:
49
+ case AV_PIX_FMT_UYYVYY411:
50
+ case AV_PIX_FMT_YUV410P:
51
+ case AV_PIX_FMT_YUV420P16LE:
52
+ case AV_PIX_FMT_YUV420P16BE:
53
+ case AV_PIX_FMT_YUV420P9BE:
54
+ case AV_PIX_FMT_YUV420P9LE:
55
+ case AV_PIX_FMT_YUV420P10BE:
56
+ case AV_PIX_FMT_YUV420P10LE:
57
+ case AV_PIX_FMT_YUV420P12BE:
58
+ case AV_PIX_FMT_YUV420P12LE:
59
+ case AV_PIX_FMT_YUV420P14BE:
60
+ case AV_PIX_FMT_YUV420P14LE:
61
+ return AV_PIX_FMT_YUV420P;
62
+
63
+ case AV_PIX_FMT_RGBA:
64
+ case AV_PIX_FMT_BGRA:
65
+ case AV_PIX_FMT_BGR0:
66
+ return fmt;
67
+
68
+ default:
69
+ break;
70
+ }
71
+
72
+ return AV_PIX_FMT_BGRA;
73
+}
74
obs-studio-18.0.2.tar.xz/deps/media-playback/media-playback/decode.c
Added
201
1
2
+/*
3
+ * Copyright (c) 2017 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
+#include "decode.h"
19
+#include "media.h"
20
+
21
+static AVCodec *find_hardware_decoder(enum AVCodecID id)
22
+{
23
+ AVHWAccel *hwa = av_hwaccel_next(NULL);
24
+ AVCodec *c = NULL;
25
+
26
+ while (hwa) {
27
+ if (hwa->id == id) {
28
+ if (hwa->pix_fmt == AV_PIX_FMT_VDA_VLD ||
29
+ hwa->pix_fmt == AV_PIX_FMT_DXVA2_VLD ||
30
+ hwa->pix_fmt == AV_PIX_FMT_VAAPI_VLD) {
31
+ c = avcodec_find_decoder_by_name(hwa->name);
32
+ if (c)
33
+ break;
34
+ }
35
+ }
36
+
37
+ hwa = av_hwaccel_next(hwa);
38
+ }
39
+
40
+ return c;
41
+}
42
+
43
+static int mp_open_codec(struct mp_decode *d)
44
+{
45
+ AVCodecContext *c;
46
+ int ret;
47
+
48
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(57, 40, 101)
49
+ c = avcodec_alloc_context3(d->codec);
50
+ if (!c) {
51
+ blog(LOG_WARNING, "MP: Failed to allocate context");
52
+ return -1;
53
+ }
54
+
55
+ ret = avcodec_parameters_to_context(c, d->stream->codecpar);
56
+ if (ret < 0)
57
+ goto fail;
58
+#else
59
+ c = d->stream->codec;
60
+#endif
61
+
62
+ if (c->thread_count == 1 &&
63
+ c->codec_id != AV_CODEC_ID_PNG &&
64
+ c->codec_id != AV_CODEC_ID_TIFF &&
65
+ c->codec_id != AV_CODEC_ID_JPEG2000 &&
66
+ c->codec_id != AV_CODEC_ID_MPEG4 &&
67
+ c->codec_id != AV_CODEC_ID_WEBP)
68
+ c->thread_count = 0;
69
+
70
+ ret = avcodec_open2(c, d->codec, NULL);
71
+ if (ret < 0)
72
+ goto fail;
73
+
74
+ d->decoder = c;
75
+ return ret;
76
+
77
+fail:
78
+ avcodec_close(c);
79
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(57, 40, 101)
80
+ av_free(d->decoder);
81
+#endif
82
+ return ret;
83
+}
84
+
85
+bool mp_decode_init(mp_media_t *m, enum AVMediaType type, bool hw)
86
+{
87
+ struct mp_decode *d = type == AVMEDIA_TYPE_VIDEO ? &m->v : &m->a;
88
+ enum AVCodecID id;
89
+ AVStream *stream;
90
+ int ret;
91
+
92
+ memset(d, 0, sizeof(*d));
93
+ d->m = m;
94
+ d->audio = type == AVMEDIA_TYPE_AUDIO;
95
+
96
+ ret = av_find_best_stream(m->fmt, type, -1, -1, NULL, 0);
97
+ if (ret < 0)
98
+ return false;
99
+ stream = d->stream = m->fmt->streams[ret];
100
+
101
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(57, 40, 101)
102
+ id = stream->codecpar->codec_id;
103
+#else
104
+ id = stream->codec->codec_id;
105
+#endif
106
+
107
+ if (hw) {
108
+ d->codec = find_hardware_decoder(id);
109
+ if (d->codec) {
110
+ ret = mp_open_codec(d);
111
+ if (ret < 0)
112
+ d->codec = NULL;
113
+ }
114
+ }
115
+
116
+ if (!d->codec) {
117
+ if (id == AV_CODEC_ID_VP8)
118
+ d->codec = avcodec_find_decoder_by_name("libvpx");
119
+ else if (id == AV_CODEC_ID_VP9)
120
+ d->codec = avcodec_find_decoder_by_name("libvpx-vp9");
121
+
122
+ if (!d->codec)
123
+ d->codec = avcodec_find_decoder(id);
124
+ if (!d->codec) {
125
+ blog(LOG_WARNING, "MP: Failed to find %s codec",
126
+ av_get_media_type_string(type));
127
+ return false;
128
+ }
129
+
130
+ ret = mp_open_codec(d);
131
+ if (ret < 0) {
132
+ blog(LOG_WARNING, "MP: Failed to open %s decoder: %s",
133
+ av_get_media_type_string(type),
134
+ av_err2str(ret));
135
+ return false;
136
+ }
137
+ }
138
+
139
+ d->frame = av_frame_alloc();
140
+ if (!d->frame) {
141
+ blog(LOG_WARNING, "MP: Failed to allocate %s frame",
142
+ av_get_media_type_string(type));
143
+ return false;
144
+ }
145
+
146
+ if (d->codec->capabilities & CODEC_CAP_TRUNCATED)
147
+ d->decoder->flags |= CODEC_FLAG_TRUNCATED;
148
+ return true;
149
+}
150
+
151
+void mp_decode_clear_packets(struct mp_decode *d)
152
+{
153
+ if (d->packet_pending) {
154
+ av_packet_unref(&d->orig_pkt);
155
+ d->packet_pending = false;
156
+ }
157
+
158
+ while (d->packets.size) {
159
+ AVPacket pkt;
160
+ circlebuf_pop_front(&d->packets, &pkt, sizeof(pkt));
161
+ av_packet_unref(&pkt);
162
+ }
163
+}
164
+
165
+void mp_decode_free(struct mp_decode *d)
166
+{
167
+ mp_decode_clear_packets(d);
168
+ circlebuf_free(&d->packets);
169
+
170
+ if (d->decoder) {
171
+ avcodec_close(d->decoder);
172
+#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(57, 40, 101)
173
+ av_free(d->decoder);
174
+#endif
175
+ }
176
+
177
+ if (d->frame)
178
+ av_free(d->frame);
179
+
180
+ memset(d, 0, sizeof(*d));
181
+}
182
+
183
+void mp_decode_push_packet(struct mp_decode *decode, AVPacket *packet)
184
+{
185
+ circlebuf_push_back(&decode->packets, packet, sizeof(*packet));
186
+}
187
+
188
+static inline int64_t get_estimated_duration(struct mp_decode *d,
189
+ int64_t last_pts)
190
+{
191
+ if (last_pts)
192
+ return d->frame_pts - last_pts;
193
+
194
+ if (d->audio) {
195
+ return av_rescale_q(d->frame->nb_samples,
196
+ (AVRational){1, d->frame->sample_rate},
197
+ (AVRational){1, 1000000000});
198
+ } else {
199
+ if (d->last_duration)
200
+ return d->last_duration;
201
obs-studio-18.0.2.tar.xz/deps/media-playback/media-playback/decode.h
Added
77
1
2
+/*
3
+ * Copyright (c) 2017 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
+#ifdef __cplusplus
21
+extern "C" {
22
+#endif
23
+
24
+#include <util/circlebuf.h>
25
+
26
+#ifdef _MSC_VER
27
+#pragma warning(push)
28
+#pragma warning(disable : 4244)
29
+#pragma warning(disable : 4204)
30
+#endif
31
+
32
+#include <libavformat/avformat.h>
33
+#include <libavcodec/avcodec.h>
34
+#include <util/threading.h>
35
+
36
+#ifdef _MSC_VER
37
+#pragma warning(pop)
38
+#endif
39
+
40
+struct mp_media;
41
+
42
+struct mp_decode {
43
+ struct mp_media *m;
44
+ AVStream *stream;
45
+ bool audio;
46
+
47
+ AVCodecContext *decoder;
48
+ AVCodec *codec;
49
+
50
+ int64_t last_duration;
51
+ int64_t frame_pts;
52
+ int64_t next_pts;
53
+ AVFrame *frame;
54
+ bool got_first_keyframe;
55
+ bool frame_ready;
56
+ bool eof;
57
+
58
+ AVPacket orig_pkt;
59
+ AVPacket pkt;
60
+ bool packet_pending;
61
+ struct circlebuf packets;
62
+};
63
+
64
+extern bool mp_decode_init(struct mp_media *media, enum AVMediaType type,
65
+ bool hw);
66
+extern void mp_decode_free(struct mp_decode *decode);
67
+
68
+extern void mp_decode_clear_packets(struct mp_decode *decode);
69
+
70
+extern void mp_decode_push_packet(struct mp_decode *decode, AVPacket *pkt);
71
+extern bool mp_decode_next(struct mp_decode *decode);
72
+extern void mp_decode_flush(struct mp_decode *decode);
73
+
74
+#ifdef __cplusplus
75
+}
76
+#endif
77
obs-studio-18.0.2.tar.xz/deps/media-playback/media-playback/media.c
Added
201
1
2
+/*
3
+ * Copyright (c) 2017 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
+#include <obs.h>
19
+#include <util/platform.h>
20
+
21
+#include <assert.h>
22
+
23
+#include "media.h"
24
+#include "closest-format.h"
25
+
26
+#include <libavdevice/avdevice.h>
27
+#include <libavutil/imgutils.h>
28
+
29
+static int64_t base_sys_ts = 0;
30
+
31
+static inline enum video_format convert_pixel_format(int f)
32
+{
33
+ switch (f) {
34
+ case AV_PIX_FMT_NONE: return VIDEO_FORMAT_NONE;
35
+ case AV_PIX_FMT_YUV420P: return VIDEO_FORMAT_I420;
36
+ case AV_PIX_FMT_NV12: return VIDEO_FORMAT_NV12;
37
+ case AV_PIX_FMT_YUYV422: return VIDEO_FORMAT_YUY2;
38
+ case AV_PIX_FMT_UYVY422: return VIDEO_FORMAT_UYVY;
39
+ case AV_PIX_FMT_RGBA: return VIDEO_FORMAT_RGBA;
40
+ case AV_PIX_FMT_BGRA: return VIDEO_FORMAT_BGRA;
41
+ case AV_PIX_FMT_BGR0: return VIDEO_FORMAT_BGRX;
42
+ default:;
43
+ }
44
+
45
+ return VIDEO_FORMAT_NONE;
46
+}
47
+
48
+static inline enum audio_format convert_sample_format(int f)
49
+{
50
+ switch (f) {
51
+ case AV_SAMPLE_FMT_U8: return AUDIO_FORMAT_U8BIT;
52
+ case AV_SAMPLE_FMT_S16: return AUDIO_FORMAT_16BIT;
53
+ case AV_SAMPLE_FMT_S32: return AUDIO_FORMAT_32BIT;
54
+ case AV_SAMPLE_FMT_FLT: return AUDIO_FORMAT_FLOAT;
55
+ case AV_SAMPLE_FMT_U8P: return AUDIO_FORMAT_U8BIT_PLANAR;
56
+ case AV_SAMPLE_FMT_S16P: return AUDIO_FORMAT_16BIT_PLANAR;
57
+ case AV_SAMPLE_FMT_S32P: return AUDIO_FORMAT_32BIT_PLANAR;
58
+ case AV_SAMPLE_FMT_FLTP: return AUDIO_FORMAT_FLOAT_PLANAR;
59
+ default:;
60
+ }
61
+
62
+ return AUDIO_FORMAT_UNKNOWN;
63
+}
64
+
65
+static inline enum video_colorspace convert_color_space(enum AVColorSpace s)
66
+{
67
+ return s == AVCOL_SPC_BT709 ? VIDEO_CS_709 : VIDEO_CS_DEFAULT;
68
+}
69
+
70
+static inline enum video_range_type convert_color_range(enum AVColorRange r)
71
+{
72
+ return r == AVCOL_RANGE_JPEG ? VIDEO_RANGE_FULL : VIDEO_RANGE_DEFAULT;
73
+}
74
+
75
+static inline struct mp_decode *get_packet_decoder(mp_media_t *media,
76
+ AVPacket *pkt)
77
+{
78
+ if (media->has_audio && pkt->stream_index == media->a.stream->index)
79
+ return &media->a;
80
+ if (media->has_video && pkt->stream_index == media->v.stream->index)
81
+ return &media->v;
82
+
83
+ return NULL;
84
+}
85
+
86
+static int mp_media_next_packet(mp_media_t *media)
87
+{
88
+ AVPacket new_pkt;
89
+ AVPacket pkt;
90
+ av_init_packet(&pkt);
91
+ new_pkt = pkt;
92
+
93
+ int ret = av_read_frame(media->fmt, &pkt);
94
+ if (ret < 0) {
95
+ if (ret != AVERROR_EOF)
96
+ blog(LOG_WARNING, "MP: av_read_frame failed: %d", ret);
97
+ return ret;
98
+ }
99
+
100
+ struct mp_decode *d = get_packet_decoder(media, &pkt);
101
+ if (d && pkt.size) {
102
+ av_packet_ref(&new_pkt, &pkt);
103
+ mp_decode_push_packet(d, &new_pkt);
104
+ }
105
+
106
+ av_packet_unref(&pkt);
107
+ return ret;
108
+}
109
+
110
+static inline bool mp_media_ready_to_start(mp_media_t *m)
111
+{
112
+ if (m->has_audio && !m->a.eof && !m->a.frame_ready)
113
+ return false;
114
+ if (m->has_video && !m->v.eof && !m->v.frame_ready)
115
+ return false;
116
+ return true;
117
+}
118
+
119
+static inline bool mp_decode_frame(struct mp_decode *d)
120
+{
121
+ return d->frame_ready || mp_decode_next(d);
122
+}
123
+
124
+static inline int get_sws_colorspace(enum AVColorSpace cs)
125
+{
126
+ switch (cs) {
127
+ case AVCOL_SPC_BT709:
128
+ return SWS_CS_ITU709;
129
+ case AVCOL_SPC_FCC:
130
+ return SWS_CS_FCC;
131
+ case AVCOL_SPC_SMPTE170M:
132
+ return SWS_CS_SMPTE170M;
133
+ case AVCOL_SPC_SMPTE240M:
134
+ return SWS_CS_SMPTE240M;
135
+ default:
136
+ break;
137
+ }
138
+
139
+ return SWS_CS_ITU601;
140
+}
141
+
142
+static inline int get_sws_range(enum AVColorRange r)
143
+{
144
+ return r == AVCOL_RANGE_JPEG ? 1 : 0;
145
+}
146
+
147
+#define FIXED_1_0 (1<<16)
148
+
149
+static bool mp_media_init_scaling(mp_media_t *m)
150
+{
151
+ int space = get_sws_colorspace(m->v.decoder->colorspace);
152
+ int range = get_sws_range(m->v.decoder->color_range);
153
+ const int *coeff = sws_getCoefficients(space);
154
+
155
+ m->swscale = sws_getCachedContext(NULL,
156
+ m->v.decoder->width, m->v.decoder->height,
157
+ m->v.decoder->pix_fmt,
158
+ m->v.decoder->width, m->v.decoder->height,
159
+ m->scale_format,
160
+ SWS_FAST_BILINEAR, NULL, NULL, NULL);
161
+ if (!m->swscale) {
162
+ blog(LOG_WARNING, "MP: Failed to initialize scaler");
163
+ return false;
164
+ }
165
+
166
+ sws_setColorspaceDetails(m->swscale, coeff, range, coeff, range, 0,
167
+ FIXED_1_0, FIXED_1_0);
168
+
169
+ int ret = av_image_alloc(m->scale_pic, m->scale_linesizes,
170
+ m->v.decoder->width, m->v.decoder->height,
171
+ m->scale_format, 1);
172
+ if (ret < 0) {
173
+ blog(LOG_WARNING, "MP: Failed to create scale pic data");
174
+ return false;
175
+ }
176
+
177
+ return true;
178
+}
179
+
180
+static bool mp_media_prepare_frames(mp_media_t *m)
181
+{
182
+ while (!mp_media_ready_to_start(m)) {
183
+ if (!m->eof) {
184
+ int ret = mp_media_next_packet(m);
185
+ if (ret == AVERROR_EOF)
186
+ m->eof = true;
187
+ else if (ret < 0)
188
+ return false;
189
+ }
190
+
191
+ if (m->has_video && !mp_decode_frame(&m->v))
192
+ return false;
193
+ if (m->has_audio && !mp_decode_frame(&m->a))
194
+ return false;
195
+ }
196
+
197
+ if (m->has_video && m->v.frame_ready && !m->swscale) {
198
+ m->scale_format = closest_format(m->v.frame->format);
199
+ if (m->scale_format != m->v.frame->format) {
200
+ if (!mp_media_init_scaling(m)) {
201
obs-studio-18.0.2.tar.xz/deps/media-playback/media-playback/media.h
Added
111
1
2
+/*
3
+ * Copyright (c) 2017 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
+#include <obs.h>
21
+#include "decode.h"
22
+
23
+#ifdef __cplusplus
24
+extern "C" {
25
+#endif
26
+
27
+#ifdef _MSC_VER
28
+#pragma warning(push)
29
+#pragma warning(disable : 4244)
30
+#pragma warning(disable : 4204)
31
+#endif
32
+
33
+#include <libavformat/avformat.h>
34
+#include <libavcodec/avcodec.h>
35
+#include <libswscale/swscale.h>
36
+#include <util/threading.h>
37
+
38
+#ifdef _MSC_VER
39
+#pragma warning(pop)
40
+#endif
41
+
42
+typedef void (*mp_video_cb)(void *opaque, struct obs_source_frame *frame);
43
+typedef void (*mp_audio_cb)(void *opaque, struct obs_source_audio *audio);
44
+typedef void (*mp_stop_cb)(void *opaque);
45
+
46
+struct mp_media {
47
+ AVFormatContext *fmt;
48
+
49
+ mp_video_cb v_preload_cb;
50
+ mp_stop_cb stop_cb;
51
+ mp_video_cb v_cb;
52
+ mp_audio_cb a_cb;
53
+ void *opaque;
54
+
55
+ enum AVPixelFormat scale_format;
56
+ struct SwsContext *swscale;
57
+ int scale_linesizes[4];
58
+ uint8_t *scale_pic[4];
59
+
60
+ struct mp_decode v;
61
+ struct mp_decode a;
62
+ bool is_network;
63
+ bool has_video;
64
+ bool has_audio;
65
+ bool is_file;
66
+ bool eof;
67
+
68
+ struct obs_source_frame obsframe;
69
+ enum video_colorspace cur_space;
70
+ enum video_range_type cur_range;
71
+ enum video_range_type force_range;
72
+
73
+ int64_t play_sys_ts;
74
+ int64_t next_pts_ns;
75
+ uint64_t next_ns;
76
+ int64_t start_ts;
77
+ int64_t base_ts;
78
+
79
+ pthread_mutex_t mutex;
80
+ os_sem_t *sem;
81
+ bool stopping;
82
+ bool looping;
83
+ bool active;
84
+ bool reset;
85
+ bool kill;
86
+
87
+ bool thread_valid;
88
+ pthread_t thread;
89
+};
90
+
91
+typedef struct mp_media mp_media_t;
92
+
93
+extern bool mp_media_init(mp_media_t *media,
94
+ const char *path,
95
+ const char *format,
96
+ void *opaque,
97
+ mp_video_cb v_cb,
98
+ mp_audio_cb a_cb,
99
+ mp_stop_cb stop_cb,
100
+ mp_video_cb v_preload_cb,
101
+ bool hardware_decoding,
102
+ enum video_range_type force_range);
103
+extern void mp_media_free(mp_media_t *media);
104
+
105
+extern void mp_media_play(mp_media_t *media, bool loop);
106
+extern void mp_media_stop(mp_media_t *media);
107
+
108
+#ifdef __cplusplus
109
+}
110
+#endif
111
obs-studio-18.0.1.tar.xz/libobs-d3d11/d3d11-subsystem.cpp -> obs-studio-18.0.2.tar.xz/libobs-d3d11/d3d11-subsystem.cpp
Changed
37
1
2
if (FAILED(hr))
3
throw UnsupportedHWError("Failed to create device", hr);
4
5
- blog(LOG_INFO, "D3D11 loaded sucessfully, feature level used: %u",
6
+ blog(LOG_INFO, "D3D11 loaded successfully, feature level used: %u",
7
(unsigned int)levelUsed);
8
}
9
10
11
if (FAILED(hr))
12
continue;
13
14
- /* ignore microsoft's 'basic' renderer' */
15
+ /* ignore Microsoft's 'basic' renderer' */
16
if (desc.VendorId == 0x1414 && desc.DeviceId == 0x8c)
17
continue;
18
19
20
if (FAILED(hr))
21
continue;
22
23
- /* ignore microsoft's 'basic' renderer' */
24
+ /* ignore Microsoft's 'basic' renderer' */
25
if (desc.VendorId == 0x1414 && desc.DeviceId == 0x8c)
26
continue;
27
28
29
30
try {
31
blog(LOG_INFO, "---------------------------------");
32
- blog(LOG_INFO, "Initializing D3D11..");
33
+ blog(LOG_INFO, "Initializing D3D11...");
34
LogD3DAdapters();
35
36
device = new gs_device(adapter);
37
obs-studio-18.0.1.tar.xz/libobs-opengl/gl-stagesurf.c -> obs-studio-18.0.2.tar.xz/libobs-opengl/gl-stagesurf.c
Changed
19
1
2
return false;
3
4
size = surf->width * surf->bytes_per_pixel;
5
- size = (size+3) & 0xFFFFFFFC; /* align width to 4-byte boundry */
6
+ size = (size+3) & 0xFFFFFFFC; /* align width to 4-byte boundary */
7
size *= surf->height;
8
9
glBufferData(GL_PIXEL_PACK_BUFFER, size, 0, GL_DYNAMIC_READ);
10
11
#ifdef __APPLE__
12
13
/* Apparently for mac, PBOs won't do an asynchronous transfer unless you use
14
- * FBOs aong with glReadPixels, which is really dumb. */
15
+ * FBOs along with glReadPixels, which is really dumb. */
16
void device_stage_texture(gs_device_t *device, gs_stagesurf_t *dst,
17
gs_texture_t *src)
18
{
19
obs-studio-18.0.1.tar.xz/libobs-opengl/gl-subsystem.c -> obs-studio-18.0.2.tar.xz/libobs-opengl/gl-subsystem.c
Changed
20
1
2
struct gs_device *device = bzalloc(sizeof(struct gs_device));
3
int errorcode = GS_ERROR_FAIL;
4
5
+ blog(LOG_INFO, "---------------------------------");
6
+ blog(LOG_INFO, "Initializing OpenGL...");
7
+
8
device->plat = gl_platform_create(device, adapter);
9
if (!device->plat)
10
goto fail;
11
12
errorcode = GS_ERROR_NOT_SUPPORTED;
13
goto fail;
14
}
15
+
16
+ blog(LOG_INFO, "OpenGL version: %s", glGetString(GL_VERSION));
17
18
gl_enable(GL_CULL_FACE);
19
20
obs-studio-18.0.1.tar.xz/libobs-opengl/gl-windows.c -> obs-studio-18.0.2.tar.xz/libobs-opengl/gl-windows.c
Changed
10
1
2
}
3
}
4
5
-/* would use designated initializers but microsoft sort of sucks */
6
+/* would use designated initializers but Microsoft sort of sucks */
7
static inline void init_dummy_pixel_format(PIXELFORMATDESCRIPTOR *pfd)
8
{
9
memset(pfd, 0, sizeof(PIXELFORMATDESCRIPTOR));
10
obs-studio-18.0.1.tar.xz/libobs-opengl/gl-x11.c -> obs-studio-18.0.2.tar.xz/libobs-opengl/gl-x11.c
Changed
10
1
2
goto fail_load_gl;
3
}
4
5
- blog(LOG_INFO, "OpenGL version: %s\n", glGetString(GL_VERSION));
6
-
7
goto success;
8
9
fail_make_current:
10
obs-studio-18.0.1.tar.xz/libobs/audio-monitoring/osx/coreaudio-enum-devices.c -> obs-studio-18.0.2.tar.xz/libobs/audio-monitoring/osx/coreaudio-enum-devices.c
Changed
171
1
2
return (bool)CFStringGetCString(ref, buf, size, kCFStringEncodingUTF8);
3
}
4
5
-static void obs_enum_audio_monitoring_device(obs_enum_audio_device_cb cb,
6
- void *data, AudioDeviceID id)
7
+static bool obs_enum_audio_monitoring_device(obs_enum_audio_device_cb cb,
8
+ void *data, AudioDeviceID id, bool allow_inputs)
9
{
10
UInt32 size = 0;
11
CFStringRef cf_name = NULL;
12
13
char name[1024];
14
char uid[1024];
15
OSStatus stat;
16
+ bool cont = true;
17
18
AudioObjectPropertyAddress addr = {
19
kAudioDevicePropertyStreams,
20
21
};
22
23
/* check to see if it's a mac input device */
24
- AudioObjectGetPropertyDataSize(id, &addr, 0, NULL, &size);
25
- if (!size)
26
- return;
27
+ if (!allow_inputs) {
28
+ AudioObjectGetPropertyDataSize(id, &addr, 0, NULL, &size);
29
+ if (!size)
30
+ return true;
31
+ }
32
33
size = sizeof(CFStringRef);
34
35
addr.mSelector = kAudioDevicePropertyDeviceUID;
36
stat = AudioObjectGetPropertyData(id, &addr, 0, NULL, &size, &cf_uid);
37
if (!success(stat, "get audio device UID"))
38
- return;
39
+ return true;
40
41
addr.mSelector = kAudioDevicePropertyDeviceNameCFString;
42
stat = AudioObjectGetPropertyData(id, &addr, 0, NULL, &size, &cf_name);
43
44
goto fail;
45
}
46
47
- cb(data, name, uid);
48
+ cont = cb(data, name, uid);
49
50
fail:
51
if (cf_name)
52
CFRelease(cf_name);
53
if (cf_uid)
54
CFRelease(cf_uid);
55
+ return cont;
56
}
57
58
-void obs_enum_audio_monitoring_devices(obs_enum_audio_device_cb cb, void *data)
59
+static void enum_audio_devices(obs_enum_audio_device_cb cb, void *data,
60
+ bool allow_inputs)
61
{
62
AudioObjectPropertyAddress addr = {
63
kAudioHardwarePropertyDevices,
64
65
stat = AudioObjectGetPropertyData(kAudioObjectSystemObject, &addr,
66
0, NULL, &size, ids);
67
if (success(stat, "get data")) {
68
- for (UInt32 i = 0; i < count; i++)
69
- obs_enum_audio_monitoring_device(cb, data, ids[i]);
70
+ for (UInt32 i = 0; i < count; i++) {
71
+ if (!obs_enum_audio_monitoring_device(cb, data, ids[i],
72
+ allow_inputs))
73
+ break;
74
+ }
75
}
76
77
free(ids);
78
}
79
+
80
+void obs_enum_audio_monitoring_devices(obs_enum_audio_device_cb cb, void *data)
81
+{
82
+ enum_audio_devices(cb, data, false);
83
+}
84
+
85
+static bool alloc_default_id(void *data, const char *name, const char *id)
86
+{
87
+ char **p_id = data;
88
+ UNUSED_PARAMETER(name);
89
+
90
+ *p_id = bstrdup(id);
91
+ return false;
92
+}
93
+
94
+static void get_default_id(char **p_id)
95
+{
96
+ AudioObjectPropertyAddress addr = {
97
+ kAudioHardwarePropertyDefaultSystemOutputDevice,
98
+ kAudioObjectPropertyScopeGlobal,
99
+ kAudioObjectPropertyElementMaster
100
+ };
101
+
102
+ if (*p_id)
103
+ return;
104
+
105
+ OSStatus stat;
106
+ AudioDeviceID id = 0;
107
+ UInt32 size = sizeof(id);
108
+
109
+ stat = AudioObjectGetPropertyData(kAudioObjectSystemObject, &addr, 0,
110
+ NULL, &size, &id);
111
+ if (success(stat, "AudioObjectGetPropertyData"))
112
+ obs_enum_audio_monitoring_device(alloc_default_id, p_id, id,
113
+ true);
114
+ if (!*p_id)
115
+ *p_id = bzalloc(1);
116
+}
117
+
118
+struct device_name_info {
119
+ const char *id;
120
+ char *name;
121
+};
122
+
123
+static bool enum_device_name(void *data, const char *name, const char *id)
124
+{
125
+ struct device_name_info *info = data;
126
+
127
+ if (strcmp(info->id, id) == 0) {
128
+ info->name = bstrdup(name);
129
+ return false;
130
+ }
131
+
132
+ return true;
133
+}
134
+
135
+bool devices_match(const char *id1, const char *id2)
136
+{
137
+ struct device_name_info info = {0};
138
+ char *default_id = NULL;
139
+ char *name1 = NULL;
140
+ char *name2 = NULL;
141
+ bool match;
142
+
143
+ if (!id1 || !id2)
144
+ return false;
145
+
146
+ if (strcmp(id1, "default") == 0) {
147
+ get_default_id(&default_id);
148
+ id1 = default_id;
149
+ }
150
+ if (strcmp(id2, "default") == 0) {
151
+ get_default_id(&default_id);
152
+ id2 = default_id;
153
+ }
154
+
155
+ info.id = id1;
156
+ enum_audio_devices(enum_device_name, &info, true);
157
+ name1 = info.name;
158
+
159
+ info.name = NULL;
160
+ info.id = id2;
161
+ enum_audio_devices(enum_device_name, &info, true);
162
+ name2 = info.name;
163
+
164
+ match = name1 && name2 && strcmp(name1, name2) == 0;
165
+ bfree(default_id);
166
+ bfree(name1);
167
+ bfree(name2);
168
+
169
+ return match;
170
+}
171
obs-studio-18.0.1.tar.xz/libobs/audio-monitoring/osx/coreaudio-output.c -> obs-studio-18.0.2.tar.xz/libobs/audio-monitoring/osx/coreaudio-output.c
Changed
110
1
2
3
volatile bool active;
4
bool paused;
5
+ bool ignore;
6
};
7
8
static inline bool fill_buffer(struct audio_monitor *monitor)
9
10
UNUSED_PARAMETER(aq);
11
}
12
13
-static bool audio_monitor_init(struct audio_monitor *monitor)
14
+extern bool devices_match(const char *id1, const char *id2);
15
+
16
+static bool audio_monitor_init(struct audio_monitor *monitor,
17
+ obs_source_t *source)
18
{
19
const struct audio_output_info *info = audio_output_get_info(
20
obs->audio.audio);
21
22
.mBitsPerChannel = sizeof(float) * 8
23
};
24
25
+ monitor->source = source;
26
+
27
monitor->channels = channels;
28
monitor->buffer_size =
29
channels * sizeof(float) * info->samples_per_sec / 100 * 3;
30
31
32
pthread_mutex_init_value(&monitor->mutex);
33
34
- stat = AudioQueueNewOutput(&desc, buffer_audio, monitor, NULL, NULL, 0,
35
- &monitor->queue);
36
- if (!success(stat, "AudioStreamBasicDescription")) {
37
+ const char *uid = obs->audio.monitoring_device_id;
38
+ if (!uid || !*uid) {
39
return false;
40
}
41
42
- const char *uid = obs->audio.monitoring_device_id;
43
- if (!uid || !*uid) {
44
+ if (source->info.output_flags & OBS_SOURCE_DO_NOT_SELF_MONITOR) {
45
+ obs_data_t *s = obs_source_get_settings(source);
46
+ const char *s_dev_id = obs_data_get_string(s, "device_id");
47
+ bool match = devices_match(s_dev_id, uid);
48
+ obs_data_release(s);
49
+
50
+ if (match) {
51
+ monitor->ignore = true;
52
+ return true;
53
+ }
54
+ }
55
+
56
+ stat = AudioQueueNewOutput(&desc, buffer_audio, monitor, NULL, NULL, 0,
57
+ &monitor->queue);
58
+ if (!success(stat, "AudioStreamBasicDescription")) {
59
return false;
60
}
61
62
63
pthread_mutex_destroy(&monitor->mutex);
64
}
65
66
-static void audio_monitor_init_final(struct audio_monitor *monitor,
67
- obs_source_t *source)
68
+static void audio_monitor_init_final(struct audio_monitor *monitor)
69
{
70
- monitor->source = source;
71
- obs_source_add_audio_capture_callback(source, on_audio_playback,
72
- monitor);
73
+ if (monitor->ignore)
74
+ return;
75
+
76
+ obs_source_add_audio_capture_callback(monitor->source,
77
+ on_audio_playback, monitor);
78
}
79
80
struct audio_monitor *audio_monitor_create(obs_source_t *source)
81
{
82
struct audio_monitor *monitor = bzalloc(sizeof(*monitor));
83
84
- if (!audio_monitor_init(monitor)) {
85
+ if (!audio_monitor_init(monitor, source)) {
86
goto fail;
87
}
88
89
90
da_push_back(obs->audio.monitors, &monitor);
91
pthread_mutex_unlock(&obs->audio.monitoring_mutex);
92
93
- audio_monitor_init_final(monitor, source);
94
+ audio_monitor_init_final(monitor);
95
return monitor;
96
97
fail:
98
99
audio_monitor_free(monitor);
100
memset(monitor, 0, sizeof(*monitor));
101
102
- success = audio_monitor_init(monitor);
103
+ success = audio_monitor_init(monitor, source);
104
if (success)
105
- audio_monitor_init_final(monitor, source);
106
+ audio_monitor_init_final(monitor);
107
}
108
109
void audio_monitor_destroy(struct audio_monitor *monitor)
110
obs-studio-18.0.1.tar.xz/libobs/audio-monitoring/win32/wasapi-enum-devices.c -> obs-studio-18.0.2.tar.xz/libobs/audio-monitoring/win32/wasapi-enum-devices.c
Changed
68
1
2
safe_release(enumerator);
3
safe_release(collection);
4
}
5
+
6
+static void get_default_id(char **p_id)
7
+{
8
+ IMMDeviceEnumerator *immde = NULL;
9
+ IMMDevice *device = NULL;
10
+ WCHAR *w_id = NULL;
11
+ HRESULT hr;
12
+
13
+ if (*p_id)
14
+ return;
15
+
16
+ hr = CoCreateInstance(&CLSID_MMDeviceEnumerator, NULL, CLSCTX_ALL,
17
+ &IID_IMMDeviceEnumerator, &immde);
18
+ if (FAILED(hr)) {
19
+ goto fail;
20
+ }
21
+
22
+ hr = immde->lpVtbl->GetDefaultAudioEndpoint(immde,
23
+ eRender, eConsole, &device);
24
+ if (FAILED(hr)) {
25
+ goto fail;
26
+ }
27
+
28
+ hr = device->lpVtbl->GetId(device, &w_id);
29
+ if (FAILED(hr)) {
30
+ goto fail;
31
+ }
32
+
33
+ os_wcs_to_utf8_ptr(w_id, 0, p_id);
34
+
35
+fail:
36
+ if (!*p_id)
37
+ *p_id = bzalloc(1);
38
+ if (immde)
39
+ immde->lpVtbl->Release(immde);
40
+ if (device)
41
+ device->lpVtbl->Release(device);
42
+ if (w_id)
43
+ CoTaskMemFree(w_id);
44
+}
45
+
46
+bool devices_match(const char *id1, const char *id2)
47
+{
48
+ char *default_id = NULL;
49
+ bool match;
50
+
51
+ if (!id1 || !id2)
52
+ return false;
53
+
54
+ if (strcmp(id1, "default") == 0) {
55
+ get_default_id(&default_id);
56
+ id1 = default_id;
57
+ }
58
+ if (strcmp(id2, "default") == 0) {
59
+ get_default_id(&default_id);
60
+ id2 = default_id;
61
+ }
62
+
63
+ match = strcmp(id1, id2) == 0;
64
+ bfree(default_id);
65
+
66
+ return match;
67
+}
68
obs-studio-18.0.1.tar.xz/libobs/audio-monitoring/win32/wasapi-output.c -> obs-studio-18.0.2.tar.xz/libobs/audio-monitoring/win32/wasapi-output.c
Changed
116
1
2
uint32_t sample_rate;
3
uint32_t channels;
4
bool source_has_video : 1;
5
+ bool ignore : 1;
6
7
int64_t lowest_audio_offset;
8
struct circlebuf delay_buffer;
9
10
11
static inline void audio_monitor_free(struct audio_monitor *monitor)
12
{
13
+ if (monitor->ignore)
14
+ return;
15
+
16
if (monitor->source) {
17
obs_source_remove_audio_capture_callback(
18
monitor->source, on_audio_playback, monitor);
19
20
return (enum speaker_layout)channels;
21
}
22
23
-static bool audio_monitor_init(struct audio_monitor *monitor)
24
+extern bool devices_match(const char *id1, const char *id2);
25
+
26
+static bool audio_monitor_init(struct audio_monitor *monitor,
27
+ obs_source_t *source)
28
{
29
IMMDeviceEnumerator *immde = NULL;
30
WAVEFORMATEX *wfex = NULL;
31
32
UINT32 frames;
33
HRESULT hr;
34
35
+ pthread_mutex_init_value(&monitor->playback_mutex);
36
+
37
+ monitor->source = source;
38
+
39
const char *id = obs->audio.monitoring_device_id;
40
if (!id) {
41
return false;
42
}
43
44
- pthread_mutex_init_value(&monitor->playback_mutex);
45
+ if (source->info.output_flags & OBS_SOURCE_DO_NOT_SELF_MONITOR) {
46
+ obs_data_t *s = obs_source_get_settings(source);
47
+ const char *s_dev_id = obs_data_get_string(s, "device_id");
48
+ bool match = devices_match(s_dev_id, id);
49
+ obs_data_release(s);
50
+
51
+ if (match) {
52
+ monitor->ignore = true;
53
+ return true;
54
+ }
55
+ }
56
57
/* ------------------------------------------ *
58
* Init device */
59
60
return success;
61
}
62
63
-static void audio_monitor_init_final(struct audio_monitor *monitor,
64
- obs_source_t *source)
65
+static void audio_monitor_init_final(struct audio_monitor *monitor)
66
{
67
- monitor->source = source;
68
+ if (monitor->ignore)
69
+ return;
70
+
71
monitor->source_has_video =
72
- (source->info.output_flags & OBS_SOURCE_VIDEO) != 0;
73
- obs_source_add_audio_capture_callback(source, on_audio_playback,
74
- monitor);
75
+ (monitor->source->info.output_flags & OBS_SOURCE_VIDEO) != 0;
76
+ obs_source_add_audio_capture_callback(monitor->source,
77
+ on_audio_playback, monitor);
78
}
79
80
struct audio_monitor *audio_monitor_create(obs_source_t *source)
81
82
struct audio_monitor monitor = {0};
83
struct audio_monitor *out;
84
85
- if (!audio_monitor_init(&monitor)) {
86
+ if (!audio_monitor_init(&monitor, source)) {
87
goto fail;
88
}
89
90
91
da_push_back(obs->audio.monitors, &out);
92
pthread_mutex_unlock(&obs->audio.monitoring_mutex);
93
94
- audio_monitor_init_final(out, source);
95
+ audio_monitor_init_final(out);
96
return out;
97
98
fail:
99
100
bool success;
101
102
pthread_mutex_lock(&monitor->playback_mutex);
103
- success = audio_monitor_init(&new_monitor);
104
+ success = audio_monitor_init(&new_monitor, monitor->source);
105
pthread_mutex_unlock(&monitor->playback_mutex);
106
107
if (success) {
108
obs_source_t *source = monitor->source;
109
audio_monitor_free(monitor);
110
*monitor = new_monitor;
111
- audio_monitor_init_final(monitor, source);
112
+ audio_monitor_init_final(monitor);
113
} else {
114
audio_monitor_free(&new_monitor);
115
}
116
obs-studio-18.0.1.tar.xz/libobs/callback/calldata.h -> obs-studio-18.0.2.tar.xz/libobs/callback/calldata.h
Changed
10
1
2
}
3
4
/* ------------------------------------------------------------------------- */
5
-/* NOTE: 'get' functions return true only if paramter exists, and is the
6
+/* NOTE: 'get' functions return true only if parameter exists, and is the
7
* same type. They return false otherwise. */
8
9
static inline bool calldata_get_int(const calldata_t *data, const char *name,
10
obs-studio-18.0.1.tar.xz/libobs/callback/decl.c -> obs-studio-18.0.2.tar.xz/libobs/callback/decl.c
Changed
28
1
2
int code;
3
struct decl_param param = {0};
4
5
- /* get stprage specifiers */
6
+ /* get storage specifiers */
7
code = cf_next_name_ref(cfp, &ref, TYPE_OR_STORAGE, ",");
8
if (code != PARSE_SUCCESS)
9
return code;
10
11
return code;
12
}
13
14
- /* parameters not marked with specifers are input parameters */
15
+ /* parameters not marked with specifiers are input parameters */
16
if (param.flags == 0)
17
param.flags = CALL_PARAM_IN;
18
19
20
ret_param.flags = CALL_PARAM_OUT;
21
22
cf_parser_init(&cfp);
23
- if (!cf_parser_parse(&cfp, decl_string, "declaraion"))
24
+ if (!cf_parser_parse(&cfp, decl_string, "declaration"))
25
goto fail;
26
27
code = cf_get_name_ref(&cfp, &ret_type, "return type", NULL);
28
obs-studio-18.0.1.tar.xz/libobs/graphics/graphics.h -> obs-studio-18.0.2.tar.xz/libobs/graphics/graphics.h
Changed
19
1
2
* Draws a 2D sprite
3
*
4
* If width or height is 0, the width or height of the texture will be used.
5
- * The flip value specifies whether the texture shoudl be flipped on the U or V
6
+ * The flip value specifies whether the texture should be flipped on the U or V
7
* axis with GS_FLIP_U and GS_FLIP_V.
8
*/
9
EXPORT void gs_draw_sprite(gs_texture_t *tex, uint32_t flip, uint32_t width,
10
11
/** sets the viewport to current swap chain size */
12
EXPORT void gs_reset_viewport(void);
13
14
-/** sets default screen-sized orthographich mode */
15
+/** sets default screen-sized orthographic mode */
16
EXPORT void gs_set_2d_mode(void);
17
/** sets default screen-sized perspective mode */
18
EXPORT void gs_set_3d_mode(double fovy, double znear, double zvar);
19
obs-studio-18.0.1.tar.xz/libobs/obs-audio-controls.h -> obs-studio-18.0.2.tar.xz/libobs/obs-audio-controls.h
Changed
16
1
2
EXPORT void obs_volmeter_detach_source(obs_volmeter_t *volmeter);
3
4
/**
5
- * @brief Get signal handler for the volume meter object
6
- * @param volmeter pointer to the volume meter object
7
- * @return signal handler
8
- */
9
-EXPORT signal_handler_t *obs_volmeter_get_signal_handler(
10
- obs_volmeter_t *volmeter);
11
-
12
-/**
13
* @brief Set the update interval for the volume meter
14
* @param volmeter pointer to the volume meter object
15
* @param ms update interval in ms
16
obs-studio-18.0.1.tar.xz/libobs/obs-audio.c -> obs-studio-18.0.2.tar.xz/libobs/obs-audio.c
Changed
39
1
2
/* if perpetually pending data, it means the audio has stopped,
3
* so clear the audio data */
4
if (last_size == size) {
5
+ if (!source->pending_stop) {
6
+ source->pending_stop = true;
7
+#if DEBUG_AUDIO == 1
8
+ blog(LOG_DEBUG, "doing pending stop trick: '%s'",
9
+ source->context.name);
10
+#endif
11
+ return true;
12
+ }
13
+
14
for (size_t ch = 0; ch < channels; ch++)
15
circlebuf_pop_front(&source->audio_input_buf[ch], NULL,
16
source->audio_input_buf[ch].size);
17
18
+ source->pending_stop = false;
19
source->audio_ts = 0;
20
source->last_audio_input_buf_size = 0;
21
#if DEBUG_AUDIO == 1
22
23
if (start_point == AUDIO_OUTPUT_FRAMES) {
24
#if DEBUG_AUDIO == 1
25
if (is_audio_source)
26
- blog(LOG_DEBUG, "can't dicard, start point is "
27
+ blog(LOG_DEBUG, "can't discard, start point is "
28
"at audio frame count");
29
#endif
30
return;
31
32
ts->end);
33
#endif
34
35
+ source->pending_stop = false;
36
source->audio_ts = ts->end;
37
}
38
39
obs-studio-18.0.1.tar.xz/libobs/obs-config.h -> obs-studio-18.0.2.tar.xz/libobs/obs-config.h
Changed
10
1
2
*
3
* Reset to zero each major or minor version
4
*/
5
-#define LIBOBS_API_PATCH_VER 1
6
+#define LIBOBS_API_PATCH_VER 2
7
8
#define MAKE_SEMANTIC_VERSION(major, minor, patch) \
9
((major << 24) | \
10
obs-studio-18.0.1.tar.xz/libobs/obs-encoder.h -> obs-studio-18.0.2.tar.xz/libobs/obs-encoder.h
Changed
10
1
2
3
/**
4
* Updates the settings for this encoder (usually used for things like
5
- * changeing birate while active)
6
+ * changing bitrate while active)
7
*
8
* @param data Data associated with this encoder context
9
* @param settings New settings for this encoder
10
obs-studio-18.0.1.tar.xz/libobs/obs-hotkey.h -> obs-studio-18.0.2.tar.xz/libobs/obs-hotkey.h
Changed
10
1
2
* that may not have translations. If the operating system can provide
3
* translations for these keys, it will use the operating system's translation
4
* over these translations. If no translations are specified, it will use
5
- * the default english translations for that specific operating system. */
6
+ * the default English translations for that specific operating system. */
7
EXPORT void obs_hotkeys_set_translations_s(
8
struct obs_hotkeys_translations *translations, size_t size);
9
10
obs-studio-18.0.1.tar.xz/libobs/obs-internal.h -> obs-studio-18.0.2.tar.xz/libobs/obs-internal.h
Changed
17
1
2
/* audio */
3
bool audio_failed;
4
bool audio_pending;
5
+ bool pending_stop;
6
bool user_muted;
7
bool muted;
8
struct obs_source *next_audio_source;
9
10
bool async_flip;
11
bool async_active;
12
bool async_update_texture;
13
+ struct obs_source_frame *async_preload_frame;
14
DARRAY(struct async_frame) async_cache;
15
DARRAY(struct obs_source_frame*)async_frames;
16
pthread_mutex_t async_mutex;
17
obs-studio-18.0.1.tar.xz/libobs/obs-module.h -> obs-studio-18.0.2.tar.xz/libobs/obs-module.h
Changed
10
1
2
* may need loading.
3
*
4
* @return Return true to continue loading the module, otherwise
5
- * false to indcate failure and unload the module
6
+ * false to indicate failure and unload the module
7
*/
8
MODULE_EXPORT bool obs_module_load(void);
9
10
obs-studio-18.0.1.tar.xz/libobs/obs-output.c -> obs-studio-18.0.2.tar.xz/libobs/obs-output.c
Changed
19
1
2
struct encoder_packet out = output->interleaved_packets.array[0];
3
4
/* do not send an interleaved packet if there's no packet of the
5
- * opposing type of a higher timstamp in the interleave buffer.
6
+ * opposing type of a higher timestamp in the interleave buffer.
7
* this ensures that the timestamps are monotonic */
8
if (!has_higher_opposing_ts(output, &out))
9
return;
10
11
if (!active(output))
12
return;
13
14
- // split text into 32 charcter strings
15
+ // split text into 32 character strings
16
int size = (int)strlen(text);
17
int r;
18
size_t char_count;
19
obs-studio-18.0.1.tar.xz/libobs/obs-scene.h -> obs-studio-18.0.2.tar.xz/libobs/obs-scene.h
Changed
10
1
2
uint32_t align;
3
4
/* last width/height of the source, this is used to check whether
5
- * ths transform needs updating */
6
+ * the transform needs updating */
7
uint32_t last_width;
8
uint32_t last_height;
9
10
obs-studio-18.0.1.tar.xz/libobs/obs-source.c -> obs-studio-18.0.2.tar.xz/libobs/obs-source.c
Changed
166
1
2
if (!private)
3
obs_source_init_audio_hotkeys(source);
4
5
+ source->flags = source->default_flags;
6
+
7
/* allow the source to be created even if creation fails so that the
8
* user's data doesn't become lost */
9
if (info)
10
11
private ? "private " : "", name, id);
12
obs_source_dosignal(source, "source_create", NULL);
13
14
- source->flags = source->default_flags;
15
source->enabled = true;
16
return source;
17
18
19
return obs_source_create_internal(id, name, settings, NULL, true);
20
}
21
22
+static char *get_new_filter_name(obs_source_t *dst, const char *name)
23
+{
24
+ struct dstr new_name = {0};
25
+ int inc = 0;
26
+
27
+ dstr_copy(&new_name, name);
28
+
29
+ for (;;) {
30
+ obs_source_t *existing_filter = obs_source_get_filter_by_name(
31
+ dst, new_name.array);
32
+ if (!existing_filter)
33
+ break;
34
+
35
+ obs_source_release(existing_filter);
36
+
37
+ dstr_printf(&new_name, "%s %d", name, ++inc + 1);
38
+ }
39
+
40
+ return new_name.array;
41
+}
42
+
43
static void duplicate_filters(obs_source_t *dst, obs_source_t *src,
44
bool private)
45
{
46
47
48
for (size_t i = filters.num; i > 0; i--) {
49
obs_source_t *src_filter = filters.array[i - 1];
50
+ char *new_name = get_new_filter_name(dst,
51
+ src_filter->context.name);
52
+
53
obs_source_t *dst_filter = obs_source_duplicate(src_filter,
54
- src_filter->context.name, private);
55
+ new_name, private);
56
57
+ bfree(new_name);
58
obs_source_filter_add(dst, dst_filter);
59
obs_source_release(dst_filter);
60
obs_source_release(src_filter);
61
62
da_free(filters);
63
}
64
65
+void obs_source_copy_filters(obs_source_t *dst, obs_source_t *src)
66
+{
67
+ duplicate_filters(dst, src, dst->context.private ?
68
+ OBS_SCENE_DUP_PRIVATE_COPY :
69
+ OBS_SCENE_DUP_COPY);
70
+
71
+ obs_source_release(src);
72
+}
73
+
74
obs_source_t *obs_source_duplicate(obs_source_t *source,
75
const char *new_name, bool create_private)
76
{
77
78
audio_resampler_destroy(source->resampler);
79
bfree(source->audio_output_buf[0][0]);
80
81
+ obs_source_frame_destroy(source->async_preload_frame);
82
+
83
if (source->info.type == OBS_SOURCE_TYPE_TRANSITION)
84
obs_transition_free(source);
85
86
87
88
source->last_audio_input_buf_size = 0;
89
source->audio_ts = os_time;
90
+ source->next_audio_sys_ts_min = os_time;
91
}
92
93
static void handle_ts_jump(obs_source_t *source, uint64_t expected,
94
95
}
96
}
97
98
+static inline bool preload_frame_changed(obs_source_t *source,
99
+ const struct obs_source_frame *in)
100
+{
101
+ if (!source->async_preload_frame)
102
+ return true;
103
+
104
+ return in->width != source->async_preload_frame->width ||
105
+ in->height != source->async_preload_frame->height ||
106
+ in->format != source->async_preload_frame->format;
107
+}
108
+
109
+void obs_source_preload_video(obs_source_t *source,
110
+ const struct obs_source_frame *frame)
111
+{
112
+ if (!obs_source_valid(source, "obs_source_preload_video"))
113
+ return;
114
+ if (!frame)
115
+ return;
116
+
117
+ obs_enter_graphics();
118
+
119
+ if (preload_frame_changed(source, frame)) {
120
+ obs_source_frame_destroy(source->async_preload_frame);
121
+ source->async_preload_frame = obs_source_frame_create(
122
+ frame->format,
123
+ frame->width,
124
+ frame->height);
125
+ }
126
+
127
+ copy_frame_data(source->async_preload_frame, frame);
128
+ set_async_texture_size(source, source->async_preload_frame);
129
+ update_async_texture(source, source->async_preload_frame,
130
+ source->async_texture,
131
+ source->async_texrender);
132
+
133
+ source->last_frame_ts = frame->timestamp;
134
+
135
+ obs_leave_graphics();
136
+}
137
+
138
+void obs_source_show_preloaded_video(obs_source_t *source)
139
+{
140
+ uint64_t sys_ts;
141
+
142
+ if (!obs_source_valid(source, "obs_source_show_preloaded_video"))
143
+ return;
144
+
145
+ source->async_active = true;
146
+
147
+ pthread_mutex_lock(&source->audio_buf_mutex);
148
+ sys_ts = os_gettime_ns();
149
+ reset_audio_timing(source, source->last_frame_ts, sys_ts);
150
+ reset_audio_data(source, sys_ts);
151
+ pthread_mutex_unlock(&source->audio_buf_mutex);
152
+}
153
+
154
static inline struct obs_audio_data *filter_async_audio(obs_source_t *source,
155
struct obs_audio_data *in)
156
{
157
158
159
if (!obs_source_valid(source, "obs_source_set_monitoring_type"))
160
return;
161
- if (source->info.output_flags & OBS_SOURCE_DO_NOT_MONITOR)
162
- return;
163
if (source->monitoring_type == type)
164
return;
165
166
obs-studio-18.0.1.tar.xz/libobs/obs-source.h -> obs-studio-18.0.2.tar.xz/libobs/obs-source.h
Changed
43
1
2
/**
3
* Source cannot have its audio monitored
4
*
5
- * Specifies that this source may cause a feedback loop if audio is monitored.
6
+ * Specifies that this source may cause a feedback loop if audio is monitored
7
+ * with a device selected as desktop audio.
8
+ *
9
* This is used primarily with desktop audio capture sources.
10
*/
11
-#define OBS_SOURCE_DO_NOT_MONITOR (1<<9)
12
+#define OBS_SOURCE_DO_NOT_SELF_MONITOR (1<<9)
13
14
/** @} */
15
16
17
* Creates the source data for the source
18
*
19
* @param settings Settings to initialize the source with
20
- * @param source Source that this data is assoicated with
21
+ * @param source Source that this data is associated with
22
* @return The data associated with this source
23
*/
24
void *(*create)(obs_data_t *settings, obs_source_t *source);
25
26
* If the source output flags do not include SOURCE_CUSTOM_DRAW, all
27
* a source needs to do is set the "image" parameter of the effect to
28
* the desired texture, and then draw. If the output flags include
29
- * SOURCE_COLOR_MATRIX, you may optionally set the the "color_matrix"
30
+ * SOURCE_COLOR_MATRIX, you may optionally set the "color_matrix"
31
* parameter of the effect to a custom 4x4 conversion matrix (by
32
* default it will be set to an YUV->RGB conversion matrix)
33
*
34
35
size_t size);
36
37
/**
38
- * Regsiters a source definition to the current obs context. This should be
39
+ * Registers a source definition to the current obs context. This should be
40
* used in obs_module_load.
41
*
42
* @param info Pointer to the source definition structure
43
obs-studio-18.0.1.tar.xz/libobs/obs-ui.h -> obs-studio-18.0.2.tar.xz/libobs/obs-ui.h
Changed
10
1
2
};
3
4
/**
5
- * Regsiters a modal UI definition to the current obs context. This should be
6
+ * Registers a modal UI definition to the current obs context. This should be
7
* used in obs_module_load.
8
*
9
* @param info Pointer to the modal definition structure
10
obs-studio-18.0.1.tar.xz/libobs/obs.c -> obs-studio-18.0.2.tar.xz/libobs/obs.c
Changed
57
1
2
} while (false)
3
4
FREE_REGISTERED_TYPES(obs_source_info, obs->source_types);
5
- FREE_REGISTERED_TYPES(obs_source_info, obs->input_types);
6
- FREE_REGISTERED_TYPES(obs_source_info, obs->filter_types);
7
- FREE_REGISTERED_TYPES(obs_source_info, obs->transition_types);
8
FREE_REGISTERED_TYPES(obs_output_info, obs->output_types);
9
FREE_REGISTERED_TYPES(obs_encoder_info, obs->encoder_types);
10
FREE_REGISTERED_TYPES(obs_service_info, obs->service_types);
11
12
13
#undef FREE_REGISTERED_TYPES
14
15
+ da_free(obs->input_types);
16
+ da_free(obs->filter_types);
17
+ da_free(obs->transition_types);
18
+
19
stop_video();
20
stop_hotkeys();
21
22
23
obs_data_t *hotkeys = obs_data_get_obj(source_data, "hotkeys");
24
double volume;
25
int64_t sync;
26
- uint32_t flags;
27
uint32_t mixers;
28
int di_order;
29
int di_mode;
30
31
mixers = (uint32_t)obs_data_get_int(source_data, "mixers");
32
obs_source_set_audio_mixers(source, mixers);
33
34
- obs_data_set_default_int(source_data, "flags", source->default_flags);
35
- flags = (uint32_t)obs_data_get_int(source_data, "flags");
36
- obs_source_set_flags(source, flags);
37
-
38
obs_data_set_default_bool(source_data, "enabled", true);
39
obs_source_set_enabled(source,
40
obs_data_get_bool(source_data, "enabled"));
41
42
float volume = obs_source_get_volume(source);
43
uint32_t mixers = obs_source_get_audio_mixers(source);
44
int64_t sync = obs_source_get_sync_offset(source);
45
- uint32_t flags = obs_source_get_flags(source);
46
const char *name = obs_source_get_name(source);
47
const char *id = obs_source_get_id(source);
48
bool enabled = obs_source_enabled(source);
49
50
obs_data_set_obj (source_data, "settings", settings);
51
obs_data_set_int (source_data, "mixers", mixers);
52
obs_data_set_int (source_data, "sync", sync);
53
- obs_data_set_int (source_data, "flags", flags);
54
obs_data_set_double(source_data, "volume", volume);
55
obs_data_set_bool (source_data, "enabled", enabled);
56
obs_data_set_bool (source_data, "muted", muted);
57
obs-studio-18.0.1.tar.xz/libobs/obs.h -> obs-studio-18.0.2.tar.xz/libobs/obs.h
Changed
83
1
2
EXPORT profiler_name_store_t *obs_get_profiler_name_store(void);
3
4
/**
5
- * Sets base video ouput base resolution/fps/format.
6
+ * Sets base video output base resolution/fps/format.
7
*
8
- * @note This data cannot be changed if an output is corrently active.
9
+ * @note This data cannot be changed if an output is currently active.
10
* @note The graphics module cannot be changed without fully destroying the
11
* OBS context.
12
*
13
* @param ovi Pointer to an obs_video_info structure containing the
14
* specification of the graphics subsystem,
15
- * @return OBS_VIDEO_SUCCESS if sucessful
16
+ * @return OBS_VIDEO_SUCCESS if successful
17
* OBS_VIDEO_NOT_SUPPORTED if the adapter lacks capabilities
18
* OBS_VIDEO_INVALID_PARAM if a parameter is invalid
19
* OBS_VIDEO_CURRENTLY_ACTIVE if video is currently active
20
21
22
/**
23
* Initializes the module, which calls its obs_module_load export. If the
24
- * module is alrady loaded, then this function does nothing and returns
25
+ * module is already loaded, then this function does nothing and returns
26
* successful.
27
*/
28
EXPORT bool obs_init_module(obs_module_t *module);
29
30
EXPORT obs_source_t *obs_source_get_filter_by_name(obs_source_t *source,
31
const char *name);
32
33
+EXPORT void obs_source_copy_filters(obs_source_t *dst, obs_source_t *src);
34
+
35
EXPORT bool obs_source_enabled(const obs_source_t *source);
36
EXPORT void obs_source_set_enabled(obs_source_t *source, bool enabled);
37
38
39
EXPORT void obs_source_output_video(obs_source_t *source,
40
const struct obs_source_frame *frame);
41
42
+/** Preloads asynchronous video data to allow instantaneous playback */
43
+EXPORT void obs_source_preload_video(obs_source_t *source,
44
+ const struct obs_source_frame *frame);
45
+
46
+/** Shows any preloaded video data */
47
+EXPORT void obs_source_show_preloaded_video(obs_source_t *source);
48
+
49
/** Outputs audio data (always asynchronous) */
50
EXPORT void obs_source_output_audio(obs_source_t *source,
51
const struct obs_source_audio *audio);
52
53
* Creates a scene.
54
*
55
* A scene is a source which is a container of other sources with specific
56
- * display oriantations. Scenes can also be used like any other source.
57
+ * display orientations. Scenes can also be used like any other source.
58
*/
59
EXPORT obs_scene_t *obs_scene_create(const char *name);
60
61
62
EXPORT void obs_sceneitem_select(obs_sceneitem_t *item, bool select);
63
EXPORT bool obs_sceneitem_selected(const obs_sceneitem_t *item);
64
65
-/* Functions for gettings/setting specific orientation of a scene item */
66
+/* Functions for getting/setting specific orientation of a scene item */
67
EXPORT void obs_sceneitem_set_pos(obs_sceneitem_t *item, const struct vec2 *pos);
68
EXPORT void obs_sceneitem_set_rot(obs_sceneitem_t *item, float rot_deg);
69
EXPORT void obs_sceneitem_set_scale(obs_sceneitem_t *item,
70
71
EXPORT proc_handler_t *obs_output_get_proc_handler(const obs_output_t *output);
72
73
/**
74
- * Sets the current video media context associated with this output,
75
- * required for non-encoded outputs
76
- */
77
-EXPORT void obs_output_set_video(obs_output_t *output, video_t *video);
78
-
79
-/**
80
* Sets the current audio/video media contexts associated with this output,
81
* required for non-encoded outputs. Can be null.
82
*/
83
obs-studio-18.0.1.tar.xz/libobs/util/base.h -> obs-studio-18.0.2.tar.xz/libobs/util/base.h
Changed
17
1
2
* Use if a problem occurs that doesn't affect the program and is
3
* recoverable.
4
*
5
- * Use in places where where failure isn't entirely unexpected, and can
6
+ * Use in places where failure isn't entirely unexpected, and can
7
* be handled safely.
8
*/
9
LOG_WARNING = 200,
10
11
/**
12
- * Informative essage to be displayed in the log.
13
+ * Informative message to be displayed in the log.
14
*/
15
LOG_INFO = 300,
16
17
obs-studio-18.0.1.tar.xz/libobs/util/c99defs.h -> obs-studio-18.0.2.tar.xz/libobs/util/c99defs.h
Changed
10
1
2
* incredibly inept moron could possibly be managing the visual C compiler
3
* project. They should be fired, and legally forbidden to have a job in
4
* ANYTHING even REMOTELY related to programming. FOREVER. This should also
5
- * apply to the next 10 generations all of their descendents. */
6
+ * apply to the next 10 generations all of their descendants. */
7
#ifndef __cplusplus
8
#define inline __inline
9
#endif
10
obs-studio-18.0.1.tar.xz/libobs/util/cf-lexer.h -> obs-studio-18.0.2.tar.xz/libobs/util/cf-lexer.h
Changed
10
1
2
* + option to exclude features such as #import, variadic macros, and other
3
* features for certain language implementations
4
* + macro parameter string operator #
5
- * + macro parameter token concactenation operator ##
6
+ * + macro parameter token concatenation operator ##
7
* + predefined macros
8
* + restricted macros
9
*/
10
obs-studio-18.0.1.tar.xz/libobs/util/config-file.h -> obs-studio-18.0.2.tar.xz/libobs/util/config-file.h
Changed
10
1
2
* These do *not* actually set any values, they only set what values will be
3
* returned for config_get_* if the specified variable does not exist.
4
*
5
- * You can initialize the defaults programmitically using config_set_default_*
6
+ * You can initialize the defaults programmatically using config_set_default_*
7
* functions (recommended for most cases), or you can initialize it via a file
8
* with config_open_defaults.
9
*/
10
obs-studio-18.0.1.tar.xz/libobs/util/darray.h -> obs-studio-18.0.2.tar.xz/libobs/util/darray.h
Changed
19
1
2
* NOTE: Not type-safe when using directly.
3
* Specifying size per call with inline maximizes compiler optimizations
4
*
5
- * See DARRAY macro at the bottom of thhe file for slightly safer usage.
6
+ * See DARRAY macro at the bottom of the file for slightly safer usage.
7
*/
8
9
#define DARRAY_INVALID ((size_t)-1)
10
11
* Makes it a little easier to use as well.
12
*
13
* I did -not- want to use a gigantic macro to generate a crapload of
14
- * typsafe inline functions per type. It just feels like a mess to me.
15
+ * typesafe inline functions per type. It just feels like a mess to me.
16
*/
17
18
#define DARRAY(type) \
19
obs-studio-18.0.1.tar.xz/libobs/util/text-lookup.h -> obs-studio-18.0.2.tar.xz/libobs/util/text-lookup.h
Changed
19
1
2
/*
3
* Text Lookup interface
4
*
5
- * Used for storing and looking up localized strings. Stores locazation
6
+ * Used for storing and looking up localized strings. Stores localization
7
* strings in a radix/trie tree to efficiently look up associated strings via a
8
* unique string identifier name.
9
*/
10
11
extern "C" {
12
#endif
13
14
-/* opaque typdef */
15
+/* opaque typedef */
16
struct text_lookup;
17
typedef struct text_lookup lookup_t;
18
19
obs-studio-18.0.1.tar.xz/libobs/util/utf8.c -> obs-studio-18.0.2.tar.xz/libobs/util/utf8.c
Changed
10
1
2
3
/*
4
* NOTE: do not check here for forbidden UTF-8 characters.
5
- * They cannot appear here because we do proper convertion.
6
+ * They cannot appear here because we do proper conversion.
7
*/
8
9
p += n;
10
obs-studio-18.0.1.tar.xz/libobs/util/vc/vc_stdint.h -> obs-studio-18.0.2.tar.xz/libobs/util/vc/vc_stdint.h
Changed
10
1
2
3
/* 7.18.4.1 Macros for minimum-width integer constants
4
5
- Accoding to Douglas Gwyn <gwyn@arl.mil>:
6
+ According to Douglas Gwyn <gwyn@arl.mil>:
7
"This spec was changed in ISO/IEC 9899:1999 TC1; in ISO/IEC
8
9899:1999 as initially published, the expansion was required
9
to be an integer constant of precisely matching type, which
10
obs-studio-18.0.2.tar.xz/plugins/decklink/audio-repack.c
Added
116
1
2
+#include "audio-repack.h"
3
+
4
+#include <emmintrin.h>
5
+
6
+int check_buffer(struct audio_repack *repack,
7
+ uint32_t frame_count)
8
+{
9
+ const uint32_t new_size = frame_count * repack->base_dst_size
10
+ + repack->extra_dst_size;
11
+
12
+ if (repack->packet_size < new_size) {
13
+ repack->packet_buffer = brealloc(
14
+ repack->packet_buffer, new_size);
15
+ if (!repack->packet_buffer)
16
+ return -1;
17
+
18
+ repack->packet_size = new_size;
19
+ }
20
+
21
+ return 0;
22
+}
23
+
24
+/*
25
+ Swap channel between LFE and FC, and
26
+ squash data array
27
+
28
+ | FL | FR |LFE | FC | BL | BR |emp |emp |
29
+ | | x | |
30
+ | FL | FR | FC |LFE | BL | BR |
31
+ */
32
+int repack_8to6ch_swap23(struct audio_repack *repack,
33
+ const uint8_t *bsrc, uint32_t frame_count)
34
+{
35
+ if (check_buffer(repack, frame_count) < 0)
36
+ return -1;
37
+
38
+ const uint32_t size = frame_count * repack->base_src_size;
39
+
40
+ const __m128i *src = (__m128i *)bsrc;
41
+ const __m128i *esrc = src + frame_count;
42
+ uint32_t *dst = (uint32_t *)repack->packet_buffer;
43
+ while (src != esrc) {
44
+ __m128i target = _mm_load_si128(src++);
45
+ __m128i buf = _mm_shufflelo_epi16(target, _MM_SHUFFLE(2, 3, 1, 0));
46
+ _mm_storeu_si128((__m128i *)dst, buf);
47
+ dst += 3;
48
+ }
49
+
50
+ return 0;
51
+}
52
+
53
+/*
54
+ Swap channel between LFE and FC
55
+
56
+ | FL | FR |LFE | FC | BL | BR |SBL |SBR |
57
+ | | x | | | |
58
+ | FL | FR | FC |LFE | BL | BR |SBL |SBR |
59
+ */
60
+int repack_8ch_swap23(struct audio_repack *repack,
61
+ const uint8_t *bsrc, uint32_t frame_count)
62
+{
63
+ if (check_buffer(repack, frame_count) < 0)
64
+ return -1;
65
+
66
+ const uint32_t size = frame_count * repack->base_src_size;
67
+
68
+ const __m128i *src = (__m128i *)bsrc;
69
+ const __m128i *esrc = src + frame_count;
70
+ __m128i *dst = (__m128i *)repack->packet_buffer;
71
+ while (src != esrc) {
72
+ __m128i target = _mm_load_si128(src++);
73
+ __m128i buf = _mm_shufflelo_epi16(target, _MM_SHUFFLE(2, 3, 1, 0));
74
+ _mm_store_si128(dst++, buf);
75
+ }
76
+
77
+ return 0;
78
+}
79
+
80
+int audio_repack_init(struct audio_repack *repack,
81
+ audio_repack_mode_t repack_mode, uint8_t sample_bit)
82
+{
83
+ memset(repack, 0, sizeof(*repack));
84
+
85
+ if (sample_bit != 16)
86
+ return -1;
87
+
88
+ switch (repack_mode) {
89
+ case repack_mode_8to6ch_swap23:
90
+ repack->base_src_size = 8 * (16 / 8);
91
+ repack->base_dst_size = 6 * (16 / 8);
92
+ repack->extra_dst_size = 2;
93
+ repack->repack_func = &repack_8to6ch_swap23;
94
+ break;
95
+
96
+ case repack_mode_8ch_swap23:
97
+ repack->base_src_size = 8 * (16 / 8);
98
+ repack->base_dst_size = 8 * (16 / 8);
99
+ repack->extra_dst_size = 0;
100
+ repack->repack_func = &repack_8ch_swap23;
101
+ break;
102
+
103
+ default: return -1;
104
+ }
105
+
106
+ return 0;
107
+}
108
+
109
+void audio_repack_free(struct audio_repack *repack)
110
+{
111
+ if (repack->packet_buffer)
112
+ bfree(repack->packet_buffer);
113
+
114
+ memset(repack, 0, sizeof(*repack));
115
+}
116
obs-studio-18.0.2.tar.xz/plugins/decklink/audio-repack.h
Added
43
1
2
+#pragma once
3
+
4
+#ifdef __cplusplus
5
+extern "C" {
6
+#endif
7
+
8
+#include <stdint.h>
9
+#include <string.h>
10
+
11
+#include <obs.h>
12
+
13
+struct audio_repack;
14
+
15
+typedef int (*audio_repack_func_t)(struct audio_repack *,
16
+ const uint8_t *, uint32_t);
17
+
18
+struct audio_repack {
19
+ uint8_t *packet_buffer;
20
+ uint32_t packet_size;
21
+
22
+ uint32_t base_src_size;
23
+ uint32_t base_dst_size;
24
+ uint32_t extra_dst_size;
25
+
26
+ audio_repack_func_t repack_func;
27
+};
28
+
29
+enum _audio_repack_mode {
30
+ repack_mode_8to6ch_swap23,
31
+ repack_mode_8ch_swap23,
32
+};
33
+
34
+typedef enum _audio_repack_mode audio_repack_mode_t;
35
+
36
+extern int audio_repack_init(struct audio_repack *repack,
37
+ audio_repack_mode_t repack_mode, uint8_t sample_bit);
38
+extern void audio_repack_free(struct audio_repack *repack);
39
+
40
+#ifdef __cplusplus
41
+}
42
+#endif
43
obs-studio-18.0.2.tar.xz/plugins/decklink/audio-repack.hpp
Added
27
1
2
+#pragma once
3
+
4
+#include "audio-repack.h"
5
+
6
+class AudioRepacker {
7
+ struct audio_repack arepack;
8
+
9
+public:
10
+ inline AudioRepacker(audio_repack_mode_t repack_mode)
11
+ {
12
+ audio_repack_init(&arepack, repack_mode, 16);
13
+ }
14
+ inline ~AudioRepacker()
15
+ {
16
+ audio_repack_free(&arepack);
17
+ }
18
+
19
+ inline int repack(const uint8_t *src, uint32_t frame_size)
20
+ {
21
+ return (*arepack.repack_func)(&arepack, src, frame_size);
22
+ }
23
+
24
+ inline operator struct audio_repack*() {return &arepack;}
25
+ inline struct audio_repack *operator->() {return &arepack;}
26
+};
27
obs-studio-18.0.1.tar.xz/plugins/decklink/data/locale/en-US.ini -> obs-studio-18.0.2.tar.xz/plugins/decklink/data/locale/en-US.ini
Changed
11
1
2
Mode="Mode"
3
Buffering="Use Buffering"
4
PixelFormat="Pixel Format"
5
+ChannelFormat="Channel"
6
+ChannelFormat.None="None"
7
+ChannelFormat.2_0ch="2ch"
8
+ChannelFormat.5_1ch="5.1ch"
9
+ChannelFormat.5_1chBack="5.1ch (Back)"
10
+ChannelFormat.7_1ch="7.1ch"
11
obs-studio-18.0.1.tar.xz/plugins/decklink/decklink-device-instance.cpp -> obs-studio-18.0.2.tar.xz/plugins/decklink/decklink-device-instance.cpp
Changed
199
1
2
#include "decklink-device-instance.hpp"
3
+#include "audio-repack.hpp"
4
5
#include <util/platform.h>
6
#include <util/threading.h>
7
8
#define LOG(level, message, ...) blog(level, "%s: " message, \
9
obs_source_get_name(this->decklink->GetSource()), ##__VA_ARGS__)
10
11
+#define ISSTEREO(flag) ((flag) == SPEAKERS_STEREO)
12
+
13
static inline enum video_format ConvertPixelFormat(BMDPixelFormat format)
14
{
15
switch (format) {
16
17
return VIDEO_FORMAT_UYVY;
18
}
19
20
+static inline int ConvertChannelFormat(speaker_layout format)
21
+{
22
+ switch (format) {
23
+ case SPEAKERS_5POINT1:
24
+ case SPEAKERS_5POINT1_SURROUND:
25
+ case SPEAKERS_7POINT1:
26
+ return 8;
27
+
28
+ default:
29
+ case SPEAKERS_STEREO:
30
+ return 2;
31
+ }
32
+}
33
+
34
+static inline audio_repack_mode_t ConvertRepackFormat(speaker_layout format)
35
+{
36
+ switch (format) {
37
+ case SPEAKERS_5POINT1:
38
+ case SPEAKERS_5POINT1_SURROUND:
39
+ return repack_mode_8to6ch_swap23;
40
+
41
+ case SPEAKERS_7POINT1:
42
+ return repack_mode_8ch_swap23;
43
+
44
+ default:
45
+ assert(false && "No repack requested");
46
+ return (audio_repack_mode_t)-1;
47
+ }
48
+}
49
+
50
DeckLinkDeviceInstance::DeckLinkDeviceInstance(DeckLink *decklink_,
51
DeckLinkDevice *device_) :
52
currentFrame(), currentPacket(), decklink(decklink_), device(device_)
53
54
return;
55
}
56
57
- currentPacket.data[0] = (uint8_t *)bytes;
58
- currentPacket.frames = (uint32_t)audioPacket->GetSampleFrameCount();
59
- currentPacket.timestamp = timestamp;
60
+ const uint32_t frameCount = (uint32_t)audioPacket->GetSampleFrameCount();
61
+ currentPacket.frames = frameCount;
62
+ currentPacket.timestamp = timestamp;
63
+
64
+ if (!ISSTEREO(channelFormat)) {
65
+ if (audioRepacker->repack((uint8_t *)bytes, frameCount) < 0) {
66
+ LOG(LOG_ERROR, "Failed to convert audio packet data");
67
+ return;
68
+ }
69
+
70
+ currentPacket.data[0] = (*audioRepacker)->packet_buffer;
71
+ } else {
72
+ currentPacket.data[0] = (uint8_t *)bytes;
73
+ }
74
+
75
+ nextAudioTS = timestamp +
76
+ ((uint64_t)frameCount * 1000000000ULL / 48000ULL) + 1;
77
78
obs_source_output_audio(decklink->GetSource(), ¤tPacket);
79
}
80
81
obs_source_output_video(decklink->GetSource(), ¤tFrame);
82
}
83
84
+void DeckLinkDeviceInstance::FinalizeStream()
85
+{
86
+ input->SetCallback(nullptr);
87
+
88
+ if (audioRepacker != nullptr)
89
+ {
90
+ delete audioRepacker;
91
+ audioRepacker = nullptr;
92
+ }
93
+
94
+ mode = nullptr;
95
+}
96
+
97
bool DeckLinkDeviceInstance::StartCapture(DeckLinkDeviceMode *mode_)
98
{
99
if (mode != nullptr)
100
101
pixelFormat = decklink->GetPixelFormat();
102
currentFrame.format = ConvertPixelFormat(pixelFormat);
103
104
- input->SetCallback(this);
105
-
106
const BMDDisplayMode displayMode = mode_->GetDisplayMode();
107
108
const HRESULT videoResult = input->EnableVideoInput(displayMode,
109
110
111
if (videoResult != S_OK) {
112
LOG(LOG_ERROR, "Failed to enable video input");
113
- input->SetCallback(nullptr);
114
return false;
115
}
116
117
- const HRESULT audioResult = input->EnableAudioInput(
118
- bmdAudioSampleRate48kHz, bmdAudioSampleType16bitInteger,
119
- 2);
120
+ channelFormat = decklink->GetChannelFormat();
121
+ currentPacket.speakers = channelFormat;
122
+
123
+ if (channelFormat != SPEAKERS_UNKNOWN) {
124
+ const int channel = ConvertChannelFormat(channelFormat);
125
+ const HRESULT audioResult = input->EnableAudioInput(
126
+ bmdAudioSampleRate48kHz, bmdAudioSampleType16bitInteger,
127
+ channel);
128
129
- if (audioResult != S_OK)
130
- LOG(LOG_WARNING, "Failed to enable audio input; continuing...");
131
+ if (audioResult != S_OK)
132
+ LOG(LOG_WARNING, "Failed to enable audio input; continuing...");
133
+
134
+ if (!ISSTEREO(channelFormat)) {
135
+ const audio_repack_mode_t repack_mode = ConvertRepackFormat(channelFormat);
136
+ audioRepacker = new AudioRepacker(repack_mode);
137
+ }
138
+ }
139
+
140
+ if (input->SetCallback(this) != S_OK) {
141
+ LOG(LOG_ERROR, "Failed to set callback");
142
+ FinalizeStream();
143
+ return false;
144
+ }
145
146
if (input->StartStreams() != S_OK) {
147
LOG(LOG_ERROR, "Failed to start streams");
148
- input->SetCallback(nullptr);
149
- input->DisableVideoInput();
150
- input->DisableAudioInput();
151
+ FinalizeStream();
152
return false;
153
}
154
155
156
GetDevice()->GetDisplayName().c_str());
157
158
input->StopStreams();
159
- input->SetCallback(nullptr);
160
- input->DisableVideoInput();
161
- input->DisableAudioInput();
162
-
163
- mode = nullptr;
164
+ FinalizeStream();
165
166
return true;
167
}
168
169
BMDTimeValue videoDur = 0;
170
BMDTimeValue audioTS = 0;
171
172
- if (videoFrame)
173
+ if (videoFrame) {
174
videoFrame->GetStreamTime(&videoTS, &videoDur, TIME_BASE);
175
- if (audioPacket)
176
- audioPacket->GetPacketTime(&audioTS, TIME_BASE);
177
+ lastVideoTS = (uint64_t)videoTS;
178
+ }
179
+ if (audioPacket) {
180
+ BMDTimeValue newAudioTS = 0;
181
+ int64_t diff;
182
+
183
+ audioPacket->GetPacketTime(&newAudioTS, TIME_BASE);
184
+ audioTS = newAudioTS + audioOffset;
185
+
186
+ diff = (int64_t)audioTS - (int64_t)nextAudioTS;
187
+ if (diff > 10000000LL) {
188
+ audioOffset -= diff;
189
+ audioTS = newAudioTS + audioOffset;
190
+
191
+ } else if (diff < -1000000) {
192
+ audioOffset = 0;
193
+ audioTS = newAudioTS;
194
+ }
195
+ }
196
197
if (videoFrame && videoTS >= 0)
198
HandleVideoFrame(videoFrame, (uint64_t)videoTS);
199
obs-studio-18.0.1.tar.xz/plugins/decklink/decklink-device-instance.hpp -> obs-studio-18.0.2.tar.xz/plugins/decklink/decklink-device-instance.hpp
Changed
32
1
2
3
#include "decklink-device.hpp"
4
5
+class AudioRepacker;
6
+
7
class DeckLinkDeviceInstance : public IDeckLinkInputCallback {
8
protected:
9
struct obs_source_frame currentFrame;
10
11
BMDPixelFormat pixelFormat = bmdFormat8BitYUV;
12
ComPtr<IDeckLinkInput> input;
13
volatile long refCount = 1;
14
+ int64_t audioOffset = 0;
15
+ uint64_t nextAudioTS = 0;
16
+ uint64_t lastVideoTS = 0;
17
+ AudioRepacker *audioRepacker = nullptr;
18
+ speaker_layout channelFormat = SPEAKERS_STEREO;
19
+
20
+ void FinalizeStream();
21
22
void HandleAudioPacket(IDeckLinkAudioInputPacket *audioPacket,
23
const uint64_t timestamp);
24
25
}
26
27
inline BMDPixelFormat GetActivePixelFormat() const {return pixelFormat;}
28
+ inline speaker_layout GetActiveChannelFormat() const {return channelFormat;}
29
30
inline DeckLinkDeviceMode *GetMode() const {return mode;}
31
32
obs-studio-18.0.1.tar.xz/plugins/decklink/decklink-device.cpp -> obs-studio-18.0.2.tar.xz/plugins/decklink/decklink-device.cpp
Changed
26
1
2
if (result != S_OK)
3
return true;
4
5
+ int64_t channels;
6
+ /* Intensity Shuttle for Thunderbolt return 2; however, it supports 8 channels */
7
+ if (name == "Intensity Shuttle Thunderbolt")
8
+ maxChannel = 8;
9
+ else if (attributes->GetInt(BMDDeckLinkMaximumAudioChannels, &channels) == S_OK)
10
+ maxChannel = (int32_t)channels;
11
+ else
12
+ maxChannel = 2;
13
+
14
/* http://forum.blackmagicdesign.com/viewtopic.php?f=12&t=33967
15
* BMDDeckLinkTopologicalID for older devices
16
* BMDDeckLinkPersistentID for newer ones */
17
18
{
19
return name;
20
}
21
+
22
+const int32_t DeckLinkDevice::GetMaxChannel(void) const
23
+{
24
+ return maxChannel;
25
+}
26
obs-studio-18.0.1.tar.xz/plugins/decklink/decklink-device.hpp -> obs-studio-18.0.2.tar.xz/plugins/decklink/decklink-device.hpp
Changed
17
1
2
std::string name;
3
std::string displayName;
4
std::string hash;
5
+ int32_t maxChannel;
6
volatile long refCount = 1;
7
8
public:
9
10
const std::string& GetHash(void) const;
11
const std::vector<DeckLinkDeviceMode *>& GetModes(void) const;
12
const std::string& GetName(void) const;
13
+ const int32_t GetMaxChannel(void) const;
14
15
bool GetInput(IDeckLinkInput **input);
16
17
obs-studio-18.0.1.tar.xz/plugins/decklink/decklink.cpp -> obs-studio-18.0.2.tar.xz/plugins/decklink/decklink.cpp
Changed
11
1
2
if (!isActive)
3
return false;
4
if (instance->GetActiveModeId() == modeId &&
5
- instance->GetActivePixelFormat() == pixelFormat)
6
+ instance->GetActivePixelFormat() == pixelFormat &&
7
+ instance->GetActiveChannelFormat() == channelFormat)
8
return false;
9
}
10
11
obs-studio-18.0.1.tar.xz/plugins/decklink/decklink.hpp -> obs-studio-18.0.2.tar.xz/plugins/decklink/decklink.hpp
Changed
21
1
2
volatile long activateRefs = 0;
3
std::recursive_mutex deviceMutex;
4
BMDPixelFormat pixelFormat = bmdFormat8BitYUV;
5
+ speaker_layout channelFormat = SPEAKERS_STEREO;
6
7
void SaveSettings();
8
static void DevicesChanged(void *param, DeckLinkDevice *device,
9
10
{
11
pixelFormat = format;
12
}
13
+ inline speaker_layout GetChannelFormat() const {return channelFormat;}
14
+ inline void SetChannelFormat(speaker_layout format)
15
+ {
16
+ channelFormat = format;
17
+ }
18
19
bool Activate(DeckLinkDevice *device, long long modeId);
20
void Deactivate();
21
obs-studio-18.0.1.tar.xz/plugins/decklink/linux/CMakeLists.txt -> obs-studio-18.0.2.tar.xz/plugins/decklink/linux/CMakeLists.txt
Changed
18
1
2
../decklink-device-discovery.hpp
3
../decklink-device.hpp
4
../decklink-device-mode.hpp
5
+ ../audio-repack.h
6
+ ../audio-repack.hpp
7
)
8
9
set(linux-decklink_SOURCES
10
11
../decklink-device-discovery.cpp
12
../decklink-device.cpp
13
../decklink-device-mode.cpp
14
+ ../audio-repack.c
15
platform.cpp)
16
17
add_library(linux-decklink MODULE
18
obs-studio-18.0.1.tar.xz/plugins/decklink/mac/CMakeLists.txt -> obs-studio-18.0.2.tar.xz/plugins/decklink/mac/CMakeLists.txt
Changed
18
1
2
../decklink-device-discovery.hpp
3
../decklink-device.hpp
4
../decklink-device-mode.hpp
5
+ ../audio-repack.h
6
+ ../audio-repack.hpp
7
)
8
9
set(mac-decklink_SOURCES
10
11
../decklink-device-discovery.cpp
12
../decklink-device.cpp
13
../decklink-device-mode.cpp
14
+ ../audio-repack.c
15
platform.cpp)
16
17
add_library(mac-decklink MODULE
18
obs-studio-18.0.1.tar.xz/plugins/decklink/plugin-main.cpp -> obs-studio-18.0.2.tar.xz/plugins/decklink/plugin-main.cpp
Changed
178
1
2
OBS_DECLARE_MODULE()
3
OBS_MODULE_USE_DEFAULT_LOCALE("decklink", "en-US")
4
5
+#define DEVICE_HASH "device_hash"
6
+#define DEVICE_NAME "device_name"
7
+#define MODE_ID "mode_id"
8
+#define MODE_NAME "mode_name"
9
+#define CHANNEL_FORMAT "channel_format"
10
+#define PIXEL_FORMAT "pixel_format"
11
+#define BUFFERING "buffering"
12
+
13
+#define TEXT_DEVICE obs_module_text("Device")
14
+#define TEXT_MODE obs_module_text("Mode")
15
+#define TEXT_PIXEL_FORMAT obs_module_text("PixelFormat")
16
+#define TEXT_CHANNEL_FORMAT obs_module_text("ChannelFormat")
17
+#define TEXT_CHANNEL_FORMAT_NONE obs_module_text("ChannelFormat.None")
18
+#define TEXT_CHANNEL_FORMAT_2_0CH obs_module_text("ChannelFormat.2_0ch")
19
+#define TEXT_CHANNEL_FORMAT_5_1CH obs_module_text("ChannelFormat.5_1ch")
20
+#define TEXT_CHANNEL_FORMAT_5_1CH_BACK obs_module_text("ChannelFormat.5_1chBack")
21
+#define TEXT_CHANNEL_FORMAT_7_1CH obs_module_text("ChannelFormat.7_1ch")
22
+#define TEXT_BUFFERING obs_module_text("Buffering")
23
+
24
static DeckLinkDeviceDiscovery *deviceEnum = nullptr;
25
26
static void decklink_enable_buffering(DeckLink *decklink, bool enabled)
27
28
DeckLink *decklink = new DeckLink(source, deviceEnum);
29
30
decklink_enable_buffering(decklink,
31
- obs_data_get_bool(settings, "buffering"));
32
+ obs_data_get_bool(settings, BUFFERING));
33
34
obs_source_update(source, settings);
35
return decklink;
36
37
static void decklink_update(void *data, obs_data_t *settings)
38
{
39
DeckLink *decklink = (DeckLink *)data;
40
- const char *hash = obs_data_get_string(settings, "device_hash");
41
- long long id = obs_data_get_int(settings, "mode_id");
42
- BMDPixelFormat format = (BMDPixelFormat)obs_data_get_int(settings,
43
- "pixel_format");
44
+ const char *hash = obs_data_get_string(settings, DEVICE_HASH);
45
+ long long id = obs_data_get_int(settings, MODE_ID);
46
+ BMDPixelFormat pixelFormat = (BMDPixelFormat)obs_data_get_int(settings,
47
+ PIXEL_FORMAT);
48
+ speaker_layout channelFormat = (speaker_layout)obs_data_get_int(settings,
49
+ CHANNEL_FORMAT);
50
51
decklink_enable_buffering(decklink,
52
- obs_data_get_bool(settings, "buffering"));
53
+ obs_data_get_bool(settings, BUFFERING));
54
55
ComPtr<DeckLinkDevice> device;
56
device.Set(deviceEnum->FindByHash(hash));
57
58
- decklink->SetPixelFormat(format);
59
+ decklink->SetPixelFormat(pixelFormat);
60
+ decklink->SetChannelFormat(channelFormat);
61
decklink->Activate(device, id);
62
}
63
64
static void decklink_get_defaults(obs_data_t *settings)
65
{
66
- obs_data_set_default_bool(settings, "buffering", true);
67
- obs_data_set_default_int(settings, "pixel_format", bmdFormat8BitYUV);
68
+ obs_data_set_default_bool(settings, BUFFERING, true);
69
+ obs_data_set_default_int(settings, PIXEL_FORMAT, bmdFormat8BitYUV);
70
+ obs_data_set_default_int(settings, CHANNEL_FORMAT, SPEAKERS_STEREO);
71
}
72
73
static const char *decklink_get_name(void*)
74
75
static bool decklink_device_changed(obs_properties_t *props,
76
obs_property_t *list, obs_data_t *settings)
77
{
78
- const char *name = obs_data_get_string(settings, "device_name");
79
- const char *hash = obs_data_get_string(settings, "device_hash");
80
- const char *mode = obs_data_get_string(settings, "mode_name");
81
- long long modeId = obs_data_get_int(settings, "mode_id");
82
+ const char *name = obs_data_get_string(settings, DEVICE_NAME);
83
+ const char *hash = obs_data_get_string(settings, DEVICE_HASH);
84
+ const char *mode = obs_data_get_string(settings, MODE_NAME);
85
+ long long modeId = obs_data_get_int(settings, MODE_ID);
86
87
size_t itemCount = obs_property_list_item_count(list);
88
bool itemFound = false;
89
90
obs_property_list_item_disable(list, 0, true);
91
}
92
93
- list = obs_properties_get(props, "mode_id");
94
+ obs_property_t *modeList = obs_properties_get(props, MODE_ID);
95
+ obs_property_t *channelList = obs_properties_get(props, CHANNEL_FORMAT);
96
+
97
+ obs_property_list_clear(modeList);
98
99
- obs_property_list_clear(list);
100
+ obs_property_list_clear(channelList);
101
+ obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_NONE,
102
+ SPEAKERS_UNKNOWN);
103
+ obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_2_0CH,
104
+ SPEAKERS_STEREO);
105
106
ComPtr<DeckLinkDevice> device;
107
device.Set(deviceEnum->FindByHash(hash));
108
109
if (!device) {
110
- obs_property_list_add_int(list, mode, modeId);
111
- obs_property_list_item_disable(list, 0, true);
112
+ obs_property_list_add_int(modeList, mode, modeId);
113
+ obs_property_list_item_disable(modeList, 0, true);
114
} else {
115
const std::vector<DeckLinkDeviceMode*> &modes =
116
device->GetModes();
117
118
for (DeckLinkDeviceMode *mode : modes) {
119
- obs_property_list_add_int(list,
120
+ obs_property_list_add_int(modeList,
121
mode->GetName().c_str(),
122
mode->GetId());
123
}
124
+
125
+ if (device->GetMaxChannel() >= 8) {
126
+ obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_5_1CH,
127
+ SPEAKERS_5POINT1);
128
+ obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_5_1CH_BACK,
129
+ SPEAKERS_5POINT1_SURROUND);
130
+ obs_property_list_add_int(channelList, TEXT_CHANNEL_FORMAT_7_1CH,
131
+ SPEAKERS_7POINT1);
132
+ }
133
}
134
135
return true;
136
137
{
138
obs_properties_t *props = obs_properties_create();
139
140
- obs_property_t *list = obs_properties_add_list(props, "device_hash",
141
- obs_module_text("Device"), OBS_COMBO_TYPE_LIST,
142
- OBS_COMBO_FORMAT_STRING);
143
+ obs_property_t *list = obs_properties_add_list(props, DEVICE_HASH,
144
+ TEXT_DEVICE, OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_STRING);
145
obs_property_set_modified_callback(list, decklink_device_changed);
146
147
fill_out_devices(list);
148
149
- list = obs_properties_add_list(props, "mode_id",
150
- obs_module_text("Mode"), OBS_COMBO_TYPE_LIST,
151
- OBS_COMBO_FORMAT_INT);
152
+ list = obs_properties_add_list(props, MODE_ID, TEXT_MODE,
153
+ OBS_COMBO_TYPE_LIST, OBS_COMBO_FORMAT_INT);
154
155
- list = obs_properties_add_list(props, "pixel_format",
156
- obs_module_text("PixelFormat"), OBS_COMBO_TYPE_LIST,
157
+ list = obs_properties_add_list(props, PIXEL_FORMAT,
158
+ TEXT_PIXEL_FORMAT, OBS_COMBO_TYPE_LIST,
159
OBS_COMBO_FORMAT_INT);
160
-
161
obs_property_list_add_int(list, "8-bit YUV", bmdFormat8BitYUV);
162
obs_property_list_add_int(list, "8-bit BGRA", bmdFormat8BitBGRA);
163
164
- obs_properties_add_bool(props, "buffering",
165
- obs_module_text("Buffering"));
166
+ list = obs_properties_add_list(props, CHANNEL_FORMAT,
167
+ TEXT_CHANNEL_FORMAT, OBS_COMBO_TYPE_LIST,
168
+ OBS_COMBO_FORMAT_INT);
169
+ obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_NONE,
170
+ SPEAKERS_UNKNOWN);
171
+ obs_property_list_add_int(list, TEXT_CHANNEL_FORMAT_2_0CH,
172
+ SPEAKERS_STEREO);
173
+
174
+ obs_properties_add_bool(props, BUFFERING, TEXT_BUFFERING);
175
176
UNUSED_PARAMETER(data);
177
return props;
178
obs-studio-18.0.1.tar.xz/plugins/decklink/win/CMakeLists.txt -> obs-studio-18.0.2.tar.xz/plugins/decklink/win/CMakeLists.txt
Changed
18
1
2
../decklink-device-discovery.hpp
3
../decklink-device.hpp
4
../decklink-device-mode.hpp
5
+ ../audio-repack.h
6
+ ../audio-repack.hpp
7
)
8
9
set(win-decklink_SOURCES
10
11
../decklink-device-discovery.cpp
12
../decklink-device.cpp
13
../decklink-device-mode.cpp
14
+ ../audio-repack.c
15
platform.cpp)
16
17
add_idl_files(win-decklink-sdk_GENERATED_FILES
18
obs-studio-18.0.1.tar.xz/plugins/enc-amf/#Resources/Installer.in.iss -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/#Resources/Installer.in.iss
Changed
10
1
2
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
3
4
#define MyAppName "AMD Encoder for OBS Studio"
5
-#define MyAppVersion "@enc-amf_VERSION_MAJOR@.@enc-amf_VERSION_MINOR@.@enc-amf_VERSION_PATCH@.@enc-amf_VERSION_BUILD@"
6
+#define MyAppVersion "@enc-amf_VERSION_MAJOR@.@enc-amf_VERSION_MINOR@.@enc-amf_VERSION_PATCH@"
7
#define MyAppPublisher "Xaymars Technology Workshop"
8
#define MyAppURL "http://www.xaymar.com/portfolio/plugin-amd-vce-plugin-for-obs-studio/"
9
10
obs-studio-18.0.1.tar.xz/plugins/enc-amf/#Resources/PATCH_NOTES.md -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/#Resources/PATCH_NOTES.md
Changed
48
1
2
-# 1.4.3.8 - Settings Transfer, Automatic VBV Buffer adjustment and Fixes (Hotfix 2)
3
-Another day, another new feature: this time it is transferring settings between versions, so that you will no longer use settings when a change to a setting is made. Since it only just now started tracking the config version, it will only work with settings created between 1.4.3.0 and 1.4.3.5, any other version might end up with broken settings.
4
+# 2.0.0.0 - The 'Ashes of the Phoenix' Update
5
+The plugin rises from the no-update-phase back to bring you an even better experience with High Efficiency Video Coding (HEVC) encoding, Variance Based Adaptive Quantitization (VBAQ), Pre-Pass support and Asynchronous Queue mode.
6
7
-Another change has been done to the Automatic VBV Buffer Size, which will now behave much more predictable. A value of 0% is completely unrestricted, 50% matches the calculated bitrate and 100% matches the calculated strict bitrate.
8
+High Efficiency Video Coding (H265/HEVC) is available on the Polaris architecture and offers massively better quality for the same bitrate, essentially resulting in lower bitrates looking much better. This means that at 1000 kbit H265/HEVC you can get close or surpass the quality of 2500 kbit H264/AVC in many types of scenes and motion. Unfortunately it never took off as it only got slightly better quality than VP9 and AV1 is already beating it in terms of speed and quality.
9
10
-Presets will also now use the proper minimum and maximum QP values and the minimum QP default value has been increased to 11.
11
+Variance Based Adaptive Quantitization (VBAQ) and Pre-Pass are both methods to better distribute the Bitrate in a given frame. VBAQ works on the principle of visual perception, while Pre-Pass looks at which areas need more Bitrate to not end up being blocky. Enabling both will result in a much better output with no change in Bitrate.
12
13
-Hotfix 1: Fix enumeration based properties not working correctly due to a programming error.
14
-Hotfix 2: Actually fix the enumeration based properties for real this time.
15
+Asynchronous Queue is a new feature that used to be the standard behaviour in earlier versions. Since no two CPUs are the same, Asynchronous Queue offers a way to use multiple cores of the CPU for the encoding task, instead of just handling everything on a single core. This feature is in very early stages, so it will probably cause issues unless absolutely needed.
16
17
## Changelog
18
-* Added: Version-specific setting transfer code which should reduce the lost settings between updates.
19
-* Changed: VBV Buffer Strictness is now linear with three steps: 100000 (0%), Target Bitrate (50%) and Strict Target Bitrate (100%).
20
-* Changed: Default for Minimum QP is now 11.
21
-* Fixed: Presets not using the proper QP Minimum and Maximum.
22
-* Fixed: Startup log messages not showing proper error codes.
23
-* Hotfix: Fix enumeration based properties not using the correct values.
24
-* Hotfix: Fix the default value for B-Frame Pattern being '-1' due to an oversight in code.
25
\ No newline at end of file
26
+* Redesigned the internal structure to be much faster for much less CPU usage.
27
+* Fixed several object lifetime issues that were only visible while debugging.
28
+* Massively improved capability testing which now allows us to see the exact limits of the encoder.
29
+* Fixed a crash-to-desktop on closing OBS.
30
+* Added H264/AVC and H265/HEVC encoders.
31
+* Slightly redesigned the UI to further improve quality of life.
32
+* Removed 'OpenGL' and 'Host' entries from the Video API field as they aren't actual APIs. (#216)
33
+* Removed the useless 'Usage' field, which was causing a lot of PEBKAC issues. (#210)
34
+* Added the ability to use Keyframe Interval in 'Master' View Mode.
35
+* Updated preset 'High Quality' to use a QP value of 18/18/18.
36
+* Updated preset 'Indistinguishable' to use a QP value of 15/15/15.
37
+* Fixed a crash with 'Automatic' VBV Buffer while using 'Constant QP'.
38
+* Fixed 'Filler Data' and 'Enforce HRD' not working properly at all times. (#215)
39
+* Changed the behaviour of 'Automatic' VBV Buffer to be linear with 'Constant QP'.
40
+* Massively improved output timestamps.
41
+* Fired Steve.
42
+* Fixed a rare crash that could happen with certain translations.
43
+* Changed the default for 'VBAQ' to 'Enabled' for H264 and H265.
44
+* Added an Asynchronous Queue mode which enables safe multi-threading for slightly higher CPU usage and encoding latency. (#211)
45
+* Split the 'OpenCL' field into 'OpenCL Transfer' (Use OpenCL to send the frame to the GPU?) and 'OpenCL Conversion' (Use OpenCL instead of DirectCompute for frame conversion?). (#212, #214)
46
+* Fixed certain presets permanently locking the Keyframe Interval and IDR Period to low numbers. (#213)
47
+* Improved Performance Tracking which is visible when starting OBS with --verbose --log_unfiltered.
48
obs-studio-18.0.1.tar.xz/plugins/enc-amf/#Resources/package.in.bat -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/#Resources/package.in.bat
Changed
10
1
2
@ECHO OFF
3
REM Shut up, I'm just as lazy as anyone else.
4
SET "CURDIR=%~dp0"
5
-SET "FINALNAME=AMD-Encoder-for-OBS-Studio.@enc-amf_VERSION_MAJOR@.@enc-amf_VERSION_MINOR@.@enc-amf_VERSION_PATCH@.@enc-amf_VERSION_BUILD@"
6
+SET "FINALNAME=AMD-Encoder-for-OBS-Studio.@enc-amf_VERSION_MAJOR@.@enc-amf_VERSION_MINOR@.@enc-amf_VERSION_PATCH@"
7
8
SET "SevenZip=C:\Program Files\7-Zip\7z.exe"
9
SET "InnoSetup=C:\Program Files (x86)\Inno Setup 5\Compil32.exe"
10
obs-studio-18.0.2.tar.xz/plugins/enc-amf/.gitattributes
Added
65
1
2
+###############################################################################
3
+# Set default behavior to automatically normalize line endings.
4
+###############################################################################
5
+* text=auto
6
+
7
+###############################################################################
8
+# Set default behavior for command prompt diff.
9
+#
10
+# This is need for earlier builds of msysgit that does not have it on by
11
+# default for csharp files.
12
+# Note: This is only used by command line
13
+###############################################################################
14
+#*.cs diff=csharp
15
+
16
+###############################################################################
17
+# Set the merge driver for project and solution files
18
+#
19
+# Merging from the command prompt will add diff markers to the files if there
20
+# are conflicts (Merging from VS is not affected by the settings below, in VS
21
+# the diff markers are never inserted). Diff markers may cause the following
22
+# file extensions to fail to load in VS. An alternative would be to treat
23
+# these files as binary and thus will always conflict and require user
24
+# intervention with every merge. To do so, just uncomment the entries below
25
+###############################################################################
26
+#*.sln merge=binary
27
+#*.csproj merge=binary
28
+#*.vbproj merge=binary
29
+#*.vcxproj merge=binary
30
+#*.vcproj merge=binary
31
+#*.dbproj merge=binary
32
+#*.fsproj merge=binary
33
+#*.lsproj merge=binary
34
+#*.wixproj merge=binary
35
+#*.modelproj merge=binary
36
+#*.sqlproj merge=binary
37
+#*.wwaproj merge=binary
38
+
39
+###############################################################################
40
+# behavior for image files
41
+#
42
+# image files are treated as binary by default.
43
+###############################################################################
44
+#*.jpg binary
45
+#*.png binary
46
+#*.gif binary
47
+
48
+###############################################################################
49
+# diff behavior for common document formats
50
+#
51
+# Convert binary document formats to text before diffing them. This feature
52
+# is only available from the command line. Turn it on by uncommenting the
53
+# entries below.
54
+###############################################################################
55
+#*.doc diff=astextplain
56
+#*.DOC diff=astextplain
57
+#*.docx diff=astextplain
58
+#*.DOCX diff=astextplain
59
+#*.dot diff=astextplain
60
+#*.DOT diff=astextplain
61
+#*.pdf diff=astextplain
62
+#*.PDF diff=astextplain
63
+#*.rtf diff=astextplain
64
+#*.RTF diff=astextplain
65
obs-studio-18.0.2.tar.xz/plugins/enc-amf/.mailmap
Added
4
1
2
+Jim <obs.jim@gmail.com>
3
+Michael Fabian Dirks <info@xaymar.com> <michael.dirks@xaymar.com>
4
obs-studio-18.0.2.tar.xz/plugins/enc-amf/AUTHORS
Added
41
1
2
+Contributors:
3
+- Michael Fabian 'Xaymar' Dirks <michael.dirks@xaymar.com>
4
+- max20091
5
+- Marcos Vidal Martinez
6
+- Viacheslav
7
+- jackun
8
+- jp9000
9
+- nwgat
10
+- wazer
11
+- Horváth Dániel
12
+- M4RK22
13
+- Richard Stanway
14
+
15
+Patrons on Patreon (https://patreon.com/xaymar/):
16
+- Anaz Haidhar
17
+- AJ
18
+- Benjamin Hoffmeister
19
+- Bo
20
+- Bryan Furia
21
+- DaOrgest
22
+- Dominik Roth
23
+- Jeremy "razorlikes" Nieth
24
+- Kristian Kirkesæther
25
+- Kuo Shih
26
+- Kytos
27
+- Nicholas Kreimeyer
28
+- Nico Thate
29
+- NoxiousPluK
30
+- nwgat.ninja
31
+- Oldgam3r
32
+- Omega Drik Mage
33
+- prefixs
34
+- Rene "vDex" Dirks
35
+- shiny
36
+- Simon Vacker
37
+- SneakyJoe
38
+- Spikeypup
39
+- Vinicius Guilherme
40
\ No newline at end of file
41
obs-studio-18.0.1.tar.xz/plugins/enc-amf/CMakeLists.txt -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/CMakeLists.txt
Changed
201
1
2
cmake_minimum_required(VERSION 2.8.12)
3
-
4
-# Shared (OBS Studio & Standalone)
5
PROJECT(enc-amf)
6
+
7
+################################################################################
8
+# Version
9
+################################################################################
10
+SET(enc-amf_VERSION_MAJOR 2)
11
+SET(enc-amf_VERSION_MINOR 1)
12
+SET(enc-amf_VERSION_PATCH 0)
13
+configure_file(
14
+ "${PROJECT_SOURCE_DIR}/#Resources/package.in.bat"
15
+ "${PROJECT_SOURCE_DIR}/#Resources/package.bat"
16
+)
17
+configure_file(
18
+ "${PROJECT_SOURCE_DIR}/#Resources/Installer.in.iss"
19
+ "${PROJECT_SOURCE_DIR}/#Resources/Installer.iss"
20
+)
21
+configure_file(
22
+ "${PROJECT_SOURCE_DIR}/Include/Version.h.in"
23
+ "${PROJECT_BINARY_DIR}/Include/Version.h"
24
+)
25
+
26
+################################################################################
27
+# Code
28
+################################################################################
29
SET(enc-amf_HEADERS
30
"Include/amf.h"
31
"Include/amf-capabilities.h"
32
- "Include/amf-h264.h"
33
+ "Include/amf-encoder.h"
34
"Include/api-base.h"
35
- "Include/api-d3d9.h"
36
- "Include/api-d3d11.h"
37
"Include/api-host.h"
38
"Include/api-opengl.h"
39
- "Include/enc-h264.h"
40
+ "Include/utility.h"
41
"Include/plugin.h"
42
+ "Include/strings.h"
43
"${PROJECT_BINARY_DIR}/Include/Version.h"
44
)
45
SET(enc-amf_SOURCES
46
"Source/amf.cpp"
47
"Source/amf-capabilities.cpp"
48
- "Source/amf-h264.cpp"
49
+ "Source/amf-encoder.cpp"
50
"Source/api-base.cpp"
51
"Source/api-host.cpp"
52
- "Source/api-d3d9.cpp"
53
- "Source/api-d3d11.cpp"
54
"Source/api-opengl.cpp"
55
- "Source/enc-h264.cpp"
56
- "Source/misc-util.cpp"
57
+ "Source/utility.cpp"
58
"Source/plugin.cpp"
59
)
60
SET(enc-amf_LIBRARIES
61
62
winmm
63
)
64
65
-# Version
66
-SET(enc-amf_VERSION_MAJOR 1)
67
-SET(enc-amf_VERSION_MINOR 4)
68
-SET(enc-amf_VERSION_PATCH 3)
69
-SET(enc-amf_VERSION_BUILD 11)
70
-configure_file(
71
- "${PROJECT_SOURCE_DIR}/#Resources/package.in.bat"
72
- "${PROJECT_SOURCE_DIR}/#Resources/package.bat"
73
-)
74
-configure_file(
75
- "${PROJECT_SOURCE_DIR}/#Resources/Installer.in.iss"
76
- "${PROJECT_SOURCE_DIR}/#Resources/Installer.iss"
77
-)
78
-configure_file(
79
- "${PROJECT_SOURCE_DIR}/Include/Version.h.in"
80
- "${PROJECT_BINARY_DIR}/Include/Version.h"
81
-)
82
+# Windows Only
83
+if (WIN32)
84
+ LIST(APPEND enc-amf_HEADERS
85
+ "Include/api-d3d9.h"
86
+ "Include/api-d3d11.h"
87
+ )
88
+ LIST(APPEND enc-amf_SOURCES
89
+ "Source/api-d3d9.cpp"
90
+ "Source/api-d3d11.cpp"
91
+ )
92
+endif()
93
94
-# OBS Studio Specific
95
+################################################################################
96
+# Standalone and OBS Studio Build Data
97
+################################################################################
98
if(BUILD_AMF_ENCODER)
99
+ # OBS Studio Specific
100
+
101
+ # Variables
102
OPTION(AMDAMF_Disable "Disable AMD Advanced Media Framework support" OFF)
103
SET(AMDAMF_SDKDir "" CACHE PATH "AMD Advanced Media Framework SDK Directory")
104
105
+ # Tests
106
if(AMDAMF_Disable)
107
message(STATUS "AMD AMF support disabled")
108
return()
109
110
return()
111
endif()
112
113
+ # Directories
114
INCLUDE_DIRECTORIES(
115
"${CMAKE_SOURCE_DIR}"
116
"${PROJECT_BINARY_DIR}"
117
118
)
119
SET(LIBOBS_LIBRARIES libobs)
120
else()
121
-# Standlone Specific
122
+ # Standlone Specific
123
124
# Variables
125
SET(PATH_AMDAMFSDK "" CACHE PATH "AMD Advanced Media Framework SDK Directory")
126
SET(PATH_OBSStudio "" CACHE PATH "OBS Studio Source Code Directory")
127
- #SET(PATH_libobs "" CACHE PATH "Path to obs.lib from OBS Studio")
128
129
+ # Tests
130
if(PATH_AMDAMFSDK STREQUAL "")
131
message(STATUS "PATH_AMDAMFSDK not set!")
132
return()
133
134
return()
135
endif()
136
137
- # Stuff
138
+ # Find OBS Libraries
139
SET(obsPath "${PATH_OBSStudio}")
140
INCLUDE("${PATH_OBSStudio}/cmake/external/Findlibobs.cmake")
141
142
143
"${PATH_AMDAMFSDK}/amf/public/include"
144
"${PATH_OBSStudio}/"
145
)
146
+ add_definitions(-D_CRT_SECURE_NO_WARNINGS)
147
endif()
148
149
+################################################################################
150
+# Optional Features
151
+################################################################################
152
+# AVC Encoding
153
+OPTION(BUILD_AMF_AVC "AMF Plugin: Build AVC (H264) support" ON)
154
+
155
+if(BUILD_AMF_AVC)
156
+ add_definitions(-DWITH_AVC)
157
+ LIST(APPEND enc-amf_HEADERS
158
+ "Include/amf-encoder-h264.h"
159
+ "Include/enc-h264.h"
160
+ )
161
+ LIST(APPEND enc-amf_SOURCES
162
+ "Source/amf-encoder-h264.cpp"
163
+ "Source/enc-h264.cpp"
164
+ )
165
+endif()
166
+
167
+# HEVC Encoding
168
+OPTION(BUILD_AMF_HEVC "AMF Plugin: Build HEVC support" ON)
169
+if(BUILD_AMF_HEVC)
170
+ add_definitions(-DWITH_HEVC)
171
+ LIST(APPEND enc-amf_HEADERS
172
+ "Include/amf-encoder-h265.h"
173
+ "Include/enc-h265.h"
174
+ )
175
+ LIST(APPEND enc-amf_SOURCES
176
+ "Source/amf-encoder-h265.cpp"
177
+ "Source/enc-h265.cpp"
178
+ )
179
+endif()
180
+
181
+################################################################################
182
+# Build
183
+################################################################################
184
ADD_LIBRARY(enc-amf MODULE
185
${enc-amf_HEADERS}
186
${enc-amf_SOURCES}
187
188
${enc-amf_LIBRARIES}
189
)
190
191
+# All Warnings, Extra Warnings, Pedantic
192
+if(MSVC)
193
+ # Force to always compile with W4
194
+ if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
195
+ string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
196
+ else()
197
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
198
+ endif()
199
+elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
200
+ # Update if necessary
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/CONTRIBUTING.md -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/CONTRIBUTING.md
Changed
21
1
2
3
* AMF: amf.cpp, amf.h, amf-capabilities.cpp, amf-capabilities.h
4
* Encoder: amf-encoder.cpp, amf-encoder.h
5
-* H264: amf-h264.cpp, amf-h264.h, enc-h264.cpp, enc-h264.h
6
+* H264: amf-encoder-h264.cpp, amf-encoder-h264.h, enc-h264.cpp, enc-h264.h
7
+* H265: amf-encoder-h265.cpp, amf-encoder-h265.h, enc-h265.cpp, enc-h265.h
8
* API: api-base.cpp, api-base.h
9
* API-OpenGL: api-opengl.cpp, api-opengl.h
10
* API-Direct3D9: api-d3d9.cpp, api-d3d9.h
11
* API-Direct3D11: api-d3d11.cpp, api-d3d11.h
12
* API-Host: api-host.cpp, api-host.h
13
* Plugin: plugin.cpp, plugin.h, CMakeLists.txt
14
-* Utilities: misc-util.cpp
15
-* Locale: Any locale files
16
+* Utilities: utility.cpp, utility.h
17
+* Locale: strings.h, Any locale files
18
* Resources: Any resource files
19
20
### Commits
21
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Include/Version.h.in -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/Version.h.in
Changed
37
1
2
+/*
3
+MIT License
4
5
-#define PLUGIN_VERSION_MAJOR @enc-amf_VERSION_MAJOR@
6
-#define PLUGIN_VERSION_MINOR @enc-amf_VERSION_MINOR@
7
-#define PLUGIN_VERSION_PATCH @enc-amf_VERSION_PATCH@
8
-#define PLUGIN_VERSION_BUILD @enc-amf_VERSION_BUILD@
9
\ No newline at end of file
10
+Copyright (c) 2016-2017
11
+
12
+Permission is hereby granted, free of charge, to any person obtaining a copy
13
+of this software and associated documentation files (the "Software"), to deal
14
+in the Software without restriction, including without limitation the rights
15
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
16
+copies of the Software, and to permit persons to whom the Software is
17
+furnished to do so, subject to the following conditions:
18
+
19
+The above copyright notice and this permission notice shall be included in all
20
+copies or substantial portions of the Software.
21
+
22
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
23
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
24
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
25
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
26
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
27
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
28
+SOFTWARE.
29
+*/
30
+
31
+#pragma once
32
+
33
+const uint16_t PLUGIN_VERSION_MAJOR = @enc-amf_VERSION_MAJOR@;
34
+const uint16_t PLUGIN_VERSION_MINOR = @enc-amf_VERSION_MINOR@;
35
+const uint32_t PLUGIN_VERSION_PATCH = @enc-amf_VERSION_PATCH@;
36
+const uint64_t PLUGIN_VERSION_FULL = (((uint64_t)(PLUGIN_VERSION_MAJOR & 0xFFFF) << 48ull) | ((uint64_t)(PLUGIN_VERSION_MINOR & 0xFFFF) << 32ull) | ((uint64_t)(PLUGIN_VERSION_PATCH) & 0xFFFFFFFF));
37
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Include/amf-capabilities.h -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/amf-capabilities.h
Changed
109
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
// Plugin
12
#include "plugin.h"
13
#include "amf.h"
14
-#include "amf-h264.h"
15
+#include "amf-encoder.h"
16
+#include "amf-encoder-h264.h"
17
+#include "amf-encoder-h265.h"
18
#include "api-base.h"
19
20
// AMF
21
22
23
namespace Plugin {
24
namespace AMD {
25
- volatile struct VCEDeviceCapabilities {
26
- amf::AMF_ACCELERATION_TYPE acceleration_type;
27
- uint32_t maxProfile;
28
- uint32_t maxProfileLevel;
29
- uint32_t maxBitrate;
30
- uint32_t minReferenceFrames;
31
- uint32_t maxReferenceFrames;
32
- bool supportsBFrames;
33
- bool supportsFixedSliceMode;
34
- uint32_t maxTemporalLayers;
35
- uint32_t maxNumOfStreams;
36
- uint32_t maxNumOfHwInstances;
37
-
38
- struct IOCaps {
39
- int32_t minWidth, maxWidth;
40
- int32_t minHeight, maxHeight;
41
- bool supportsInterlaced;
42
- uint32_t verticalAlignment;
43
-
44
- std::vector<std::pair<amf::AMF_SURFACE_FORMAT, bool>> formats;
45
- std::vector<std::pair<amf::AMF_MEMORY_TYPE, bool>> memoryTypes;
46
- } input, output;
47
-
48
- Plugin::AMD::VCEDeviceCapabilities::VCEDeviceCapabilities();
49
- };
50
-
51
- class VCECapabilities {
52
- //////////////////////////////////////////////////////////////////////////
53
- // Singleton
54
- //////////////////////////////////////////////////////////////////////////
55
+ class CapabilityManager {
56
+ #pragma region Singleton
57
public:
58
- static std::shared_ptr<Plugin::AMD::VCECapabilities> GetInstance();
59
- static void ReportCapabilities(std::shared_ptr<Plugin::API::Base> api);
60
- static void ReportAdapterCapabilities(std::shared_ptr<Plugin::API::Base> api,
61
- Plugin::API::Adapter adapter);
62
- static void ReportAdapterTypeCapabilities(std::shared_ptr<Plugin::API::Base> api,
63
- Plugin::API::Adapter adapter,
64
- H264EncoderType type);
65
- static void ReportAdapterTypeIOCapabilities(std::shared_ptr<Plugin::API::Base> api,
66
- Plugin::API::Adapter adapter,
67
- H264EncoderType type,
68
- bool output);
69
-
70
- //////////////////////////////////////////////////////////////////////////
71
- // Class
72
- //////////////////////////////////////////////////////////////////////////
73
- public:
74
- VCECapabilities();
75
- ~VCECapabilities();
76
-
77
- bool Refresh();
78
- std::vector<std::pair<H264EncoderType, VCEDeviceCapabilities>>
79
- GetAllAdapterCapabilities(std::shared_ptr<Plugin::API::Base> api, Plugin::API::Adapter adapter);
80
- VCEDeviceCapabilities
81
- GetAdapterCapabilities(std::shared_ptr<Plugin::API::Base> api, Plugin::API::Adapter adapter, H264EncoderType type);
82
+ static void Initialize();
83
+ static CapabilityManager* Instance();
84
+ static void Finalize();
85
+
86
+ private: // Private Initializer & Finalizer
87
+ CapabilityManager();
88
+ ~CapabilityManager();
89
+
90
+ public: // Remove all Copy operators
91
+ CapabilityManager(CapabilityManager const&) = delete;
92
+ void operator=(CapabilityManager const&) = delete;
93
+ #pragma endregion Singleton
94
+
95
+ bool IsCodecSupported(AMD::Codec codec);
96
+ bool IsCodecSupportedByAPI(AMD::Codec codec, API::Type api);
97
+ bool IsCodecSupportedByAPIAdapter(AMD::Codec codec, API::Type api, API::Adapter adapter);
98
99
private:
100
- std::map<std::tuple<std::string, Plugin::API::Adapter, Plugin::AMD::H264EncoderType>, VCEDeviceCapabilities> capabilityMap;
101
+ std::map<
102
+ std::tuple<API::Type, API::Adapter, AMD::Codec>,
103
+ bool> m_CapabilityMap;
104
+
105
};
106
}
107
}
108
\ No newline at end of file
109
obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/amf-encoder-h264.h
Added
201
1
2
+/*
3
+MIT License
4
+
5
+Copyright (c) 2016-2017
6
+
7
+Permission is hereby granted, free of charge, to any person obtaining a copy
8
+of this software and associated documentation files (the "Software"), to deal
9
+in the Software without restriction, including without limitation the rights
10
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+copies of the Software, and to permit persons to whom the Software is
12
+furnished to do so, subject to the following conditions:
13
+
14
+The above copyright notice and this permission notice shall be included in all
15
+copies or substantial portions of the Software.
16
+
17
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+SOFTWARE.
24
+*/
25
+
26
+#pragma once
27
+
28
+#include "plugin.h"
29
+#include "amf-encoder.h"
30
+#include "components/VideoEncoderVCE.h"
31
+
32
+namespace Plugin {
33
+ namespace AMD {
34
+ namespace H264 {
35
+ enum class SliceMode : uint8_t {
36
+ Row = 1, // Horizontal?
37
+ Column = 2, // Vertical?
38
+ };
39
+ }
40
+
41
+ class EncoderH264 : public Encoder {
42
+ public:
43
+ EncoderH264(
44
+ std::shared_ptr<API::IAPI> videoAPI, API::Adapter videoAdapter = API::Adapter::Adapter(),
45
+ bool useOpenCLSubmission = false, bool useOpenCLConversion = false,
46
+ ColorFormat colorFormat = ColorFormat::NV12, ColorSpace colorSpace = ColorSpace::BT709, bool fullRangeColor = false,
47
+ bool useAsyncQueue = false, size_t asyncQueueSize = 0);
48
+ virtual ~EncoderH264();
49
+
50
+ // Properties - Initialization
51
+ virtual std::vector<Usage> CapsUsage() override;
52
+ virtual void SetUsage(Usage v) override;
53
+ virtual Usage GetUsage() override;
54
+
55
+ // Properties - Static
56
+ virtual std::vector<QualityPreset> CapsQualityPreset() override;
57
+ virtual void SetQualityPreset(QualityPreset v) override;
58
+ virtual QualityPreset GetQualityPreset() override;
59
+
60
+ virtual std::vector<Profile> CapsProfile() override;
61
+ virtual void SetProfile(Profile v) override;
62
+ virtual Profile GetProfile() override;
63
+
64
+ virtual std::vector<ProfileLevel> CapsProfileLevel() override;
65
+ virtual void SetProfileLevel(ProfileLevel v) override;
66
+ virtual ProfileLevel GetProfileLevel() override;
67
+
68
+ virtual std::pair<uint64_t, uint64_t> CapsMaximumReferenceFrames() override;
69
+ virtual void SetMaximumReferenceFrames(uint64_t v) override;
70
+ virtual uint64_t GetMaximumReferenceFrames() override;
71
+
72
+ virtual std::pair<std::pair<uint32_t, uint32_t>, std::pair<uint32_t, uint32_t>> CapsResolution() override;
73
+ virtual void SetResolution(std::pair<uint32_t, uint32_t> v) override;
74
+ virtual std::pair<uint32_t, uint32_t> GetResolution() override;
75
+
76
+ virtual void SetAspectRatio(std::pair<uint32_t, uint32_t> v) override;
77
+ virtual std::pair<uint32_t, uint32_t> GetAspectRatio() override;
78
+
79
+ virtual void SetFrameRate(std::pair<uint32_t, uint32_t> v) override;
80
+ virtual std::pair<uint32_t, uint32_t> GetFrameRate() override;
81
+
82
+ virtual std::vector<CodingType> CapsCodingType() override;
83
+ virtual void SetCodingType(CodingType v) override;
84
+ virtual CodingType GetCodingType() override;
85
+
86
+ virtual std::pair<uint32_t, uint32_t> CapsMaximumLongTermReferenceFrames() override;
87
+ virtual void SetMaximumLongTermReferenceFrames(uint32_t v) override;
88
+ virtual uint32_t GetMaximumLongTermReferenceFrames() override;
89
+
90
+ // Properties - Dynamic
91
+ virtual std::vector<RateControlMethod> CapsRateControlMethod() override;
92
+ virtual void SetRateControlMethod(RateControlMethod v) override;
93
+ virtual RateControlMethod GetRateControlMethod() override;
94
+
95
+ virtual std::vector<PrePassMode> CapsPrePassMode() override;
96
+ virtual void SetPrePassMode(PrePassMode v) override;
97
+ virtual PrePassMode GetPrePassMode() override;
98
+
99
+ virtual void SetVarianceBasedAdaptiveQuantizationEnabled(bool v) override;
100
+ virtual bool IsVarianceBasedAdaptiveQuantizationEnabled() override;
101
+
102
+ virtual void SetFrameSkippingEnabled(bool v) override;
103
+ virtual bool IsFrameSkippingEnabled() override;
104
+
105
+ virtual void SetEnforceHRDEnabled(bool v) override;
106
+ virtual bool IsEnforceHRDEnabled() override;
107
+
108
+ virtual void SetFillerDataEnabled(bool v) override;
109
+ virtual bool IsFillerDataEnabled() override;
110
+
111
+ void SetQPMinimum(uint8_t v);
112
+ uint8_t GetQPMinimum();
113
+
114
+ void SetQPMaximum(uint8_t v);
115
+ uint8_t GetQPMaximum();
116
+
117
+ virtual std::pair<uint64_t, uint64_t> CapsTargetBitrate() override;
118
+ virtual void SetTargetBitrate(uint64_t v) override;
119
+ virtual uint64_t GetTargetBitrate() override;
120
+
121
+ virtual std::pair<uint64_t, uint64_t> CapsPeakBitrate() override;
122
+ virtual void SetPeakBitrate(uint64_t v) override;
123
+ virtual uint64_t GetPeakBitrate() override;
124
+
125
+ virtual void SetIFrameQP(uint8_t v) override;
126
+ virtual uint8_t GetIFrameQP() override;
127
+
128
+ virtual void SetPFrameQP(uint8_t v) override;
129
+ virtual uint8_t GetPFrameQP() override;
130
+
131
+ virtual void SetBFrameQP(uint8_t v);
132
+ virtual uint8_t GetBFrameQP();
133
+
134
+ virtual void SetMaximumAccessUnitSize(uint32_t v) override;
135
+ virtual uint32_t GetMaximumAccessUnitSize() override;
136
+
137
+ virtual std::pair<uint64_t, uint64_t> CapsVBVBufferSize() override;
138
+ virtual void SetVBVBufferSize(uint64_t v) override;
139
+ virtual uint64_t GetVBVBufferSize() override;
140
+
141
+ virtual void SetVBVBufferInitialFullness(double v) override;
142
+ virtual float GetInitialVBVBufferFullness() override;
143
+
144
+ // Properties - Picture Control
145
+ virtual void SetIDRPeriod(uint32_t v) override;
146
+ virtual uint32_t GetIDRPeriod() override;
147
+
148
+ void SetHeaderInsertionSpacing(uint32_t v);
149
+ uint32_t GetHeaderInsertionSpacing();
150
+
151
+ virtual void SetGOPAlignmentEnabled(bool v) override;
152
+ virtual bool IsGOPAlignmentEnabled() override;
153
+
154
+ virtual void SetDeblockingFilterEnabled(bool v) override;
155
+ virtual bool IsDeblockingFilterEnabled() override;
156
+
157
+ virtual uint8_t CapsBFramePattern();
158
+ virtual void SetBFramePattern(uint8_t v);
159
+ virtual uint8_t GetBFramePattern();
160
+
161
+ virtual void SetBFrameDeltaQP(int8_t v);
162
+ virtual int8_t GetBFrameDeltaQP();
163
+
164
+ virtual void SetBFrameReferenceEnabled(bool v);
165
+ virtual bool IsBFrameReferenceEnabled();
166
+
167
+ virtual void SetBFrameReferenceDeltaQP(int8_t v);
168
+ virtual int8_t GetBFrameReferenceDeltaQP();
169
+
170
+ // Properties - Motion Estimation
171
+ virtual void SetMotionEstimationQuarterPixelEnabled(bool v) override;
172
+ virtual bool IsMotionEstimationQuarterPixelEnabled() override;
173
+
174
+ virtual void SetMotionEstimationHalfPixelEnabled(bool v) override;
175
+ virtual bool IsMotionEstimationHalfPixelEnabled() override;
176
+
177
+ // Properties - Intra-Refresh
178
+ std::pair<uint32_t, uint32_t> CapsIntraRefreshNumMBsPerSlot();
179
+ void SetIntraRefreshNumMBsPerSlot(uint32_t v);
180
+ uint32_t GetIntraRefreshNumMBsPerSlot();
181
+
182
+ void SetIntraRefreshNumOfStripes(uint32_t v);
183
+ uint32_t GetIntraRefreshNumOfStripes();
184
+
185
+ // Properties - Slicing
186
+ void SetSliceMode(H264::SliceMode v);
187
+ H264::SliceMode GetSliceMode();
188
+
189
+ virtual std::pair<uint32_t, uint32_t> CapsSlicesPerFrame() override;
190
+ virtual void SetSlicesPerFrame(uint32_t v) override;
191
+ virtual uint32_t GetSlicesPerFrame() override;
192
+
193
+ virtual void SetSliceControlMode(SliceControlMode v) override;
194
+ virtual SliceControlMode GetSliceControlMode() override;
195
+
196
+ virtual std::pair<uint32_t, uint32_t> CapsSliceControlSize() override;
197
+ virtual void SetSliceControlSize(uint32_t v) override;
198
+ virtual uint32_t GetSliceControlSize() override;
199
+
200
+ std::pair<uint32_t, uint32_t> CapsMaximumSliceSize();
201
obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/amf-encoder-h265.h
Added
201
1
2
+/*
3
+MIT License
4
+
5
+Copyright (c) 2016-2017
6
+
7
+Permission is hereby granted, free of charge, to any person obtaining a copy
8
+of this software and associated documentation files (the "Software"), to deal
9
+in the Software without restriction, including without limitation the rights
10
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+copies of the Software, and to permit persons to whom the Software is
12
+furnished to do so, subject to the following conditions:
13
+
14
+The above copyright notice and this permission notice shall be included in all
15
+copies or substantial portions of the Software.
16
+
17
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+SOFTWARE.
24
+*/
25
+
26
+#pragma once
27
+
28
+#include "plugin.h"
29
+#include "amf-encoder.h"
30
+#include "components/VideoEncoderHEVC.h"
31
+
32
+namespace Plugin {
33
+ namespace AMD {
34
+ namespace H265 {
35
+ enum class Tier : uint8_t {
36
+ Main,
37
+ High,
38
+ };
39
+ enum class GOPType : uint8_t {
40
+ Fixed, // Fixed Interval GOP
41
+ Variable, // Variable Interval GOP
42
+ };
43
+ enum class HeaderInsertionMode : uint8_t {
44
+ None = 0,
45
+ AlignedToGOP = 1,
46
+ AlignedToIDR = 2,
47
+ };
48
+ }
49
+
50
+ class EncoderH265 : public Encoder {
51
+ public:
52
+ EncoderH265(
53
+ std::shared_ptr<API::IAPI> videoAPI, API::Adapter videoAdapter = API::Adapter::Adapter(),
54
+ bool useOpenCLSubmission = false, bool useOpenCLConversion = false,
55
+ ColorFormat colorFormat = ColorFormat::NV12, ColorSpace colorSpace = ColorSpace::BT709, bool fullRangeColor = false,
56
+ bool useAsyncQueue = false, size_t asyncQueueSize = 0);
57
+ virtual ~EncoderH265();
58
+
59
+ // Initialization
60
+ virtual std::vector<Usage> CapsUsage() override;
61
+ virtual void SetUsage(Usage v) override;
62
+ virtual Usage GetUsage() override;
63
+
64
+ // Static
65
+ virtual std::vector<QualityPreset> CapsQualityPreset() override;
66
+ virtual void SetQualityPreset(QualityPreset v) override;
67
+ virtual QualityPreset GetQualityPreset() override;
68
+
69
+ virtual std::pair<std::pair<uint32_t, uint32_t>, std::pair<uint32_t, uint32_t>> CapsResolution() override;
70
+ virtual void SetResolution(std::pair<uint32_t, uint32_t> v) override;
71
+ virtual std::pair<uint32_t, uint32_t> GetResolution() override;
72
+
73
+ virtual void SetAspectRatio(std::pair<uint32_t, uint32_t> v) override;
74
+ virtual std::pair<uint32_t, uint32_t> GetAspectRatio() override;
75
+
76
+ virtual void SetFrameRate(std::pair<uint32_t, uint32_t> v) override;
77
+ virtual std::pair<uint32_t, uint32_t> GetFrameRate() override;
78
+
79
+ virtual std::vector<Profile> CapsProfile() override;
80
+ virtual void SetProfile(Profile v) override;
81
+ virtual Profile GetProfile() override;
82
+
83
+ virtual std::vector<ProfileLevel> CapsProfileLevel() override;
84
+ virtual void SetProfileLevel(ProfileLevel v) override;
85
+ virtual ProfileLevel GetProfileLevel() override;
86
+
87
+ std::vector<H265::Tier> CapsTier();
88
+ void SetTier(H265::Tier v);
89
+ H265::Tier GetTier();
90
+
91
+ virtual std::pair<uint64_t, uint64_t> CapsMaximumReferenceFrames() override;
92
+ virtual void SetMaximumReferenceFrames(uint64_t v) override;
93
+ virtual uint64_t GetMaximumReferenceFrames() override;
94
+
95
+ virtual std::vector<CodingType> CapsCodingType() override;
96
+ virtual void SetCodingType(CodingType v) override;
97
+ virtual CodingType GetCodingType() override;
98
+
99
+ virtual std::pair<uint32_t, uint32_t> CapsMaximumLongTermReferenceFrames() override;
100
+ virtual void SetMaximumLongTermReferenceFrames(uint32_t v) override;
101
+ virtual uint32_t GetMaximumLongTermReferenceFrames() override;
102
+
103
+ /// Rate Control
104
+ virtual std::vector<RateControlMethod> CapsRateControlMethod() override;
105
+ virtual void SetRateControlMethod(RateControlMethod v) override;
106
+ virtual RateControlMethod GetRateControlMethod() override;
107
+
108
+ virtual std::vector<PrePassMode> CapsPrePassMode() override;
109
+ virtual void SetPrePassMode(PrePassMode v) override;
110
+ virtual PrePassMode GetPrePassMode() override;
111
+
112
+ virtual void SetVarianceBasedAdaptiveQuantizationEnabled(bool v) override;
113
+ virtual bool IsVarianceBasedAdaptiveQuantizationEnabled() override;
114
+
115
+ /// VBV Buffer
116
+ virtual std::pair<uint64_t, uint64_t> CapsVBVBufferSize() override;
117
+ virtual void SetVBVBufferSize(uint64_t v) override;
118
+ virtual uint64_t GetVBVBufferSize() override;
119
+
120
+ virtual void SetVBVBufferInitialFullness(double v) override;
121
+ virtual float GetInitialVBVBufferFullness() override;
122
+
123
+ /// Picture Control
124
+ std::vector<H265::GOPType> CapsGOPType();
125
+ void SetGOPType(H265::GOPType v);
126
+ H265::GOPType GetGOPType();
127
+
128
+ void SetGOPSize(uint32_t v);
129
+ uint32_t GetGOPSize();
130
+
131
+ void SetGOPSizeMin(uint32_t v);
132
+ uint32_t GetGOPSizeMin();
133
+
134
+ void SetGOPSizeMax(uint32_t v);
135
+ uint32_t GetGOPSizeMax();
136
+
137
+ virtual void SetGOPAlignmentEnabled(bool v) override;
138
+ virtual bool IsGOPAlignmentEnabled() override;
139
+
140
+ virtual void SetIDRPeriod(uint32_t v) override; // Distance in GOPs
141
+ virtual uint32_t GetIDRPeriod() override;
142
+
143
+ void SetHeaderInsertionMode(H265::HeaderInsertionMode v);
144
+ H265::HeaderInsertionMode GetHeaderInsertionMode();
145
+
146
+ virtual void SetDeblockingFilterEnabled(bool v) override;
147
+ virtual bool IsDeblockingFilterEnabled() override;
148
+
149
+ /// Motion Estimation
150
+ virtual void SetMotionEstimationQuarterPixelEnabled(bool v) override;
151
+ virtual bool IsMotionEstimationQuarterPixelEnabled() override;
152
+
153
+ virtual void SetMotionEstimationHalfPixelEnabled(bool v) override;
154
+ virtual bool IsMotionEstimationHalfPixelEnabled() override;
155
+
156
+ // Dynamic
157
+ virtual void SetFrameSkippingEnabled(bool v) override;
158
+ virtual bool IsFrameSkippingEnabled() override;
159
+
160
+ virtual void SetEnforceHRDEnabled(bool v) override;
161
+ virtual bool IsEnforceHRDEnabled() override;
162
+
163
+ virtual void SetFillerDataEnabled(bool v) override;
164
+ virtual bool IsFillerDataEnabled() override;
165
+
166
+ void SetIFrameQPMinimum(uint8_t v);
167
+ uint8_t GetIFrameQPMinimum();
168
+
169
+ void SetIFrameQPMaximum(uint8_t v);
170
+ uint8_t GetIFrameQPMaximum();
171
+
172
+ void SetPFrameQPMinimum(uint8_t v);
173
+ uint8_t GetPFrameQPMinimum();
174
+
175
+ void SetPFrameQPMaximum(uint8_t v);
176
+ uint8_t GetPFrameQPMaximum();
177
+
178
+ virtual std::pair<uint64_t, uint64_t> CapsTargetBitrate() override;
179
+ virtual void SetTargetBitrate(uint64_t v) override;
180
+ virtual uint64_t GetTargetBitrate() override;
181
+
182
+ virtual std::pair<uint64_t, uint64_t> CapsPeakBitrate() override;
183
+ virtual void SetPeakBitrate(uint64_t v) override;
184
+ virtual uint64_t GetPeakBitrate() override;
185
+
186
+ virtual void SetIFrameQP(uint8_t v) override;
187
+ virtual uint8_t GetIFrameQP() override;
188
+
189
+ virtual void SetPFrameQP(uint8_t v) override;
190
+ virtual uint8_t GetPFrameQP() override;
191
+
192
+ virtual void SetMaximumAccessUnitSize(uint32_t v) override;
193
+ virtual uint32_t GetMaximumAccessUnitSize() override;
194
+
195
+ /// Intra-Refresh
196
+ void SetIntraRefreshMode(uint32_t v); // Description is identical to IntraRefreshNumMBsPerSlot?
197
+ uint32_t GetIntraRefreshMode(); // Does not seem to be an actual property yet.
198
+
199
+ void SetIntraRefreshFrameNum(uint32_t v);
200
+ uint32_t GetIntraRefreshFrameNum();
201
obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/amf-encoder.h
Added
201
1
2
+/*
3
+MIT License
4
+
5
+Copyright (c) 2016-2017
6
+
7
+Permission is hereby granted, free of charge, to any person obtaining a copy
8
+of this software and associated documentation files (the "Software"), to deal
9
+in the Software without restriction, including without limitation the rights
10
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+copies of the Software, and to permit persons to whom the Software is
12
+furnished to do so, subject to the following conditions:
13
+
14
+The above copyright notice and this permission notice shall be included in all
15
+copies or substantial portions of the Software.
16
+
17
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+SOFTWARE.
24
+*/
25
+
26
+#pragma once
27
+
28
+#include <vector>
29
+#include <queue>
30
+#include <thread>
31
+#include <mutex>
32
+#include <condition_variable>
33
+#include <chrono>
34
+
35
+#include "plugin.h"
36
+#include "amf.h"
37
+#include "api-base.h"
38
+
39
+#include "components/Component.h"
40
+
41
+#define AMF_TIMESTAMP_ALLOCATE L"TS_Allocate"
42
+#define AMF_TIME_ALLOCATE L"T_Allocate"
43
+#define AMF_TIMESTAMP_STORE L"TS_Store"
44
+#define AMF_TIME_STORE L"T_Store"
45
+#define AMF_TIMESTAMP_CONVERT L"TS_Convert"
46
+#define AMF_TIME_CONVERT L"T_Convert"
47
+#define AMF_TIMESTAMP_SUBMIT L"TS_Submit"
48
+#define AMF_TIMESTAMP_QUERY L"TS_Query"
49
+#define AMF_TIME_MAIN L"T_Main" // Time between Submit and Query
50
+
51
+#define AMF_PRESENT_TIMESTAMP L"PTS"
52
+
53
+#ifdef _DEBUG
54
+#define AMFTRACECALL { \
55
+ std::mbstate_t state = std::mbstate_t(); \
56
+ auto trace = AMF::Instance()->GetTrace(); \
57
+ const char* file = __FILE__; \
58
+ const char* fname = __FUNCTION_NAME__; \
59
+ std::vector<wchar_t> buf(std::mbsrtowcs(NULL, &file, 0, &state) + 1); \
60
+ std::mbsrtowcs(buf.data(), &file, buf.size(), &state); \
61
+ std::vector<wchar_t> buf2(std::mbsrtowcs(NULL, &fname, 0, &state) + 1); \
62
+ std::mbsrtowcs(buf2.data(), &fname, buf2.size(), &state); \
63
+ trace->TraceW(buf.data(), __LINE__, AMF_TRACE_DEBUG, L"Trace", 1, L"Function: %s", buf2.data()); \
64
+ PLOG_DEBUG("<Trace> " __FUNCTION_NAME__); \
65
+};
66
+#else
67
+#define AMFTRACECALL ;
68
+#endif
69
+
70
+namespace Plugin {
71
+ namespace AMD {
72
+ // Initialization Parameters
73
+ enum class Codec : uint8_t {
74
+ AVC,
75
+ SVC,
76
+ HEVC,
77
+ };
78
+ enum class ColorFormat : uint8_t {
79
+ /* Support Table
80
+ * Open Broadcaster AMD AMF
81
+ * -- 4:2:0 Formats --
82
+ * VIDEO_FORMAT_I420 AMF_SURFACE_YUV420P
83
+ * VIDEO_FORMAT_NV12 AMF_SURFACE_NV12
84
+ * AMF_SURFACE_YV12
85
+ * -- 4:2:2 Formats --
86
+ * VIDEO_FORMAT_YVYV
87
+ * VIDEO_FORMAT_YUY2 AMF_SURFACE_YUY2
88
+ * VIDEO_FORMAT_UYVY
89
+ *
90
+ * -- 4:4:4 Formats --
91
+ * VIDEO_FORMAT_I444
92
+ *
93
+ * -- Packed Uncompressed Formats --
94
+ * VIDEO_FORMAT_RGBA AMF_SURFACE_RGBA
95
+ * VIDEO_FORMAT_BGRA AMF_SURFACE_BGRA
96
+ * AMF_SURFACE_ARGB
97
+ * VIDEO_FORMAT_BGRX
98
+ *
99
+ * -- Single/Dual Channel Formats --
100
+ * VIDEO_FORMAT_Y800 AMF_SURFACE_GRAY8
101
+ * AMF_SURFACE_U8V8
102
+ *
103
+ * -- HDR Color Formats --
104
+ * AMF_SURFACE_P010
105
+ * AMF_SURFACE_RGBA_F16
106
+ */
107
+
108
+ I420,
109
+ NV12,
110
+ YUY2,
111
+ BGRA,
112
+ RGBA,
113
+ GRAY,
114
+ };
115
+ enum class ColorSpace : uint8_t {
116
+ BT601,
117
+ BT709,
118
+ BT2020,
119
+ };
120
+
121
+ // Properties
122
+ enum class Usage : uint8_t {
123
+ Transcoding,
124
+ UltraLowLatency,
125
+ LowLatency,
126
+ Webcam
127
+ };
128
+ enum class QualityPreset : uint8_t {
129
+ Speed,
130
+ Balanced,
131
+ Quality,
132
+ };
133
+ enum class Profile : uint16_t {
134
+ ConstrainedBaseline = 256,
135
+ Baseline = 66,
136
+ Main = 77,
137
+ ConstrainedHigh = 257,
138
+ High = 100,
139
+ };
140
+ enum class ProfileLevel : uint8_t {
141
+ Automatic,
142
+ L10 = 10,
143
+ L11,
144
+ L12,
145
+ L13,
146
+ L20 = 20,
147
+ L21,
148
+ L22,
149
+ L30 = 30,
150
+ L31,
151
+ L32,
152
+ L40 = 40,
153
+ L41,
154
+ L42,
155
+ L50 = 50,
156
+ L51,
157
+ L52,
158
+ L60 = 60,
159
+ L61,
160
+ L62,
161
+ };
162
+ enum class CodingType : uint8_t {
163
+ Automatic,
164
+ CALVC,
165
+ CABAC,
166
+ };
167
+ enum class RateControlMethod : uint8_t {
168
+ ConstantQP,
169
+ LatencyConstrainedVariableBitrate,
170
+ PeakConstrainedVariableBitrate,
171
+ ConstantBitrate,
172
+ };
173
+ enum class PrePassMode : uint8_t {
174
+ Disabled,
175
+ Enabled,
176
+ EnabledAtHalfScale,
177
+ EnabledAtQuarterScale,
178
+ };
179
+ enum class SliceControlMode : uint8_t {
180
+ Unknown0,
181
+ Unknown1,
182
+ Unknown2,
183
+ Unknown3,
184
+ };
185
+
186
+ class Encoder {
187
+ protected:
188
+ Encoder(Codec codec,
189
+ std::shared_ptr<API::IAPI> videoAPI, API::Adapter videoAdapter,
190
+ bool useOpenCLSubmission, bool useOpenCLConversion,
191
+ ColorFormat colorFormat, ColorSpace colorSpace, bool fullRangeColor,
192
+ bool useAsyncQueue, size_t asyncQueueSize);
193
+ public:
194
+ virtual ~Encoder();
195
+
196
+ public:
197
+
198
+ #pragma region Initialization
199
+ uint64_t GetUniqueId();
200
+
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Include/amf.h -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/amf.h
Changed
43
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
class AMF {
12
#pragma region Singleton
13
public:
14
- static std::shared_ptr<Plugin::AMD::AMF> GetInstance();
15
- #pragma endregion Singleton
16
+ static void Initialize();
17
+ static AMF* Instance();
18
+ static void Finalize();
19
20
- public:
21
+ private: // Private Initializer & Finalizer
22
AMF();
23
~AMF();
24
25
+ public: // Remove all Copy operators
26
+ AMF(AMF const&) = delete;
27
+ void operator=(AMF const&) = delete;
28
+ #pragma endregion Singleton
29
+
30
+ public:
31
amf::AMFFactory* GetFactory();
32
amf::AMFTrace* GetTrace();
33
amf::AMFDebug* GetDebug();
34
35
36
/// AMF Values
37
HMODULE m_AMFModule;
38
- uint64_t m_AMFVersion_Compiler;
39
+ uint64_t m_AMFVersion_Plugin;
40
uint64_t m_AMFVersion_Runtime;
41
42
/// AMF Functions
43
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Include/api-base.h -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/api-base.h
Changed
129
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
*/
12
13
#pragma once
14
-//////////////////////////////////////////////////////////////////////////
15
-// Includes
16
-//////////////////////////////////////////////////////////////////////////
17
#include "plugin.h"
18
-
19
#include <vector>
20
#include <map>
21
+#include <string.h>
22
+#include <memory>
23
24
-//////////////////////////////////////////////////////////////////////////
25
-// Code
26
-//////////////////////////////////////////////////////////////////////////
27
namespace Plugin {
28
namespace API {
29
- enum class Type {
30
+ /**
31
+ *
32
+ */
33
+ enum class Type : uint8_t {
34
Host,
35
Direct3D9,
36
Direct3D11,
37
OpenGL,
38
};
39
40
+ // An Adapter on an API
41
struct Adapter {
42
int32_t idLow, idHigh;
43
std::string Name;
44
45
- Adapter() : idLow(0), idHigh(0), Name("Invalid Device") {}
46
- Adapter(int32_t idLow, int32_t idHigh, std::string Name) : idLow(idLow), idHigh(idHigh), Name(Name) {}
47
+ Adapter()
48
+ : idLow(0), idHigh(0), Name("Invalid Device") {}
49
+ Adapter(int32_t p_idLow, int32_t p_idHigh, std::string p_Name)
50
+ : idLow(p_idLow), idHigh(p_idHigh), Name(p_Name) {}
51
+ Adapter(Adapter const& o) {
52
+ idLow = o.idLow;
53
+ idHigh = o.idHigh;
54
+ Name = o.Name;
55
+ }
56
+ void operator=(Adapter const& o) {
57
+ idLow = o.idLow;
58
+ idHigh = o.idHigh;
59
+ Name = o.Name;
60
+ }
61
62
friend bool operator<(const Plugin::API::Adapter& left, const Plugin::API::Adapter& right);
63
friend bool operator>(const Plugin::API::Adapter& left, const Plugin::API::Adapter& right);
64
65
friend bool operator!=(const Plugin::API::Adapter& left, const Plugin::API::Adapter& right);
66
};
67
68
- class Base {
69
- //////////////////////////////////////////////////////////////////////////
70
- // API Index
71
- //////////////////////////////////////////////////////////////////////////
72
+ // Instance of an API Adapter
73
+ struct Instance {
74
public:
75
- static void Initialize();
76
-
77
- static size_t GetAPICount();
78
- static std::shared_ptr<Base> GetAPIInstance(size_t index);
79
- static std::string GetAPIName(size_t index);
80
- static std::shared_ptr<Base> GetAPIByName(std::string name);
81
- static std::vector<std::shared_ptr<Base>> EnumerateAPIs();
82
- static std::vector<std::string> EnumerateAPINames();
83
-
84
- //////////////////////////////////////////////////////////////////////////
85
- // API
86
- //////////////////////////////////////////////////////////////////////////
87
+ Instance();
88
+ virtual ~Instance();
89
+
90
+ virtual Adapter GetAdapter() = 0;
91
+ virtual void* GetContext() = 0;
92
+ };
93
+
94
+ // API Interface
95
+ class IAPI {
96
public:
97
+ IAPI();
98
+ virtual ~IAPI();
99
+
100
virtual std::string GetName() = 0;
101
virtual Type GetType() = 0;
102
103
virtual std::vector<Adapter> EnumerateAdapters() = 0;
104
- virtual Adapter GetAdapterById(uint32_t idLow, uint32_t idHigh) = 0;
105
- virtual Adapter GetAdapterByName(std::string name) = 0;
106
+ Adapter GetAdapterById(int32_t idLow, int32_t idHigh);
107
+ Adapter GetAdapterByName(std::string name);
108
109
- virtual void* CreateInstanceOnAdapter(Adapter adapter) = 0;
110
- virtual Adapter GetAdapterForInstance(void* instance) = 0;
111
- virtual void* GetContextFromInstance(void* instance) = 0;
112
- virtual void DestroyInstance(void* instance) = 0;
113
+ virtual std::shared_ptr<Instance> CreateInstance(Adapter adapter) = 0;
114
};
115
+
116
+ // Static API Stuff
117
+ void InitializeAPIs();
118
+ void FinalizeAPIs();
119
+ size_t CountAPIs();
120
+ std::string GetAPIName(size_t index);
121
+ std::shared_ptr<IAPI> GetAPI(size_t index);
122
+ std::shared_ptr<IAPI> GetAPI(std::string name);
123
+ std::shared_ptr<IAPI> GetAPI(Type type);
124
+ std::vector<std::shared_ptr<IAPI>> EnumerateAPIs();
125
+ std::vector<std::string> EnumerateAPINames();
126
}
127
}
128
\ No newline at end of file
129
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Include/api-d3d11.h -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/api-d3d11.h
Changed
77
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
*/
12
13
#pragma once
14
-
15
-//////////////////////////////////////////////////////////////////////////
16
-// Includes
17
-//////////////////////////////////////////////////////////////////////////
18
#include "api-base.h"
19
-
20
-//////////////////////////////////////////////////////////////////////////
21
-// Code
22
-//////////////////////////////////////////////////////////////////////////
23
+#include <vector>
24
+#include <map>
25
+#include <mutex>
26
+#include <dxgi.h>
27
+#include <d3d11.h>
28
+#include <atlutil.h>
29
30
namespace Plugin {
31
namespace API {
32
- class Direct3D11 : public Base {
33
+ class Direct3D11 : public IAPI {
34
+ friend class Direct3D11Instance;
35
+ public:
36
+
37
+ Direct3D11();
38
+ ~Direct3D11();
39
+
40
virtual std::string GetName() override;
41
virtual Type GetType() override;
42
-
43
virtual std::vector<Adapter> EnumerateAdapters() override;
44
- virtual Adapter GetAdapterById(uint32_t idLow, uint32_t idHigh) override;
45
- virtual Adapter GetAdapterByName(std::string name) override;
46
+ virtual std::shared_ptr<Instance> CreateInstance(Adapter adapter) override;
47
+
48
+ protected:
49
+ ATL::CComPtr<IDXGIFactory1> m_DXGIFactory;
50
+ //std::mutex m_InstanceMapMutex;
51
+ //std::map<std::pair<int32_t, int32_t>, std::shared_ptr<Instance>> m_InstanceMap;
52
+
53
+ private:
54
+ std::vector<Adapter> m_AdapterList;
55
+ };
56
+
57
+ class Direct3D11Instance : public Instance {
58
+ public:
59
+ Direct3D11Instance(Direct3D11* api, Adapter adapter);
60
+ ~Direct3D11Instance();
61
+
62
+ virtual Adapter GetAdapter() override;
63
+ virtual void* GetContext() override;
64
65
- virtual void* CreateInstanceOnAdapter(Adapter adapter) override;
66
- virtual Adapter GetAdapterForInstance(void* pInstance) override;
67
- virtual void* GetContextFromInstance(void* pInstance) override;
68
- virtual void DestroyInstance(void* pInstance) override;
69
+ private:
70
+ Direct3D11* m_API;
71
+ Adapter m_Adapter;
72
+ ID3D11DeviceContext* m_DeviceContext;
73
+ ID3D11Device* m_Device;
74
};
75
}
76
}
77
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Include/api-d3d9.h -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/api-d3d9.h
Changed
75
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
*/
12
13
#pragma once
14
-
15
-//////////////////////////////////////////////////////////////////////////
16
-// Includes
17
-//////////////////////////////////////////////////////////////////////////
18
#include "api-base.h"
19
+#include <d3d9.h>
20
+#include <atlutil.h>
21
22
-//////////////////////////////////////////////////////////////////////////
23
-// Code
24
-//////////////////////////////////////////////////////////////////////////
25
+#ifdef _DEBUG
26
+#define D3D_DEBUG_INFO
27
+#endif
28
+#pragma comment(lib, "d3d9.lib")
29
30
namespace Plugin {
31
namespace API {
32
- class Direct3D9 : public Base {
33
+ class Direct3D9 : public IAPI {
34
+ friend class Direct3D9Instance;
35
+ public:
36
+
37
+ Direct3D9();
38
+ ~Direct3D9();
39
+
40
virtual std::string GetName() override;
41
virtual Type GetType() override;
42
-
43
virtual std::vector<Adapter> EnumerateAdapters() override;
44
- virtual Adapter GetAdapterById(uint32_t idLow, uint32_t idHigh);
45
- virtual Adapter GetAdapterByName(std::string name);
46
+ virtual std::shared_ptr<Instance> CreateInstance(Adapter adapter) override;
47
+
48
+ protected:
49
+ IDirect3D9Ex* m_Direct3D9Ex;
50
+ //std::map<std::pair<int32_t, int32_t>, std::shared_ptr<Instance>> m_InstanceMap;
51
+
52
+ private:
53
+ std::vector<Adapter> m_Adapters;
54
+ };
55
+
56
+ class Direct3D9Instance : public Instance {
57
+ public:
58
+ Direct3D9Instance(Direct3D9* api, Adapter adapter);
59
+ ~Direct3D9Instance();
60
+
61
+ virtual Adapter GetAdapter() override;
62
+ virtual void* GetContext() override;
63
64
- virtual void* CreateInstanceOnAdapter(Adapter adapter) override;
65
- virtual Adapter GetAdapterForInstance(void* pInstance) override;
66
- virtual void* GetContextFromInstance(void* pInstance) override;
67
- virtual void DestroyInstance(void* pInstance) override;
68
+ private:
69
+ Direct3D9* m_API;
70
+ Adapter m_Adapter;
71
+ IDirect3DDevice9Ex* m_Device;
72
};
73
}
74
}
75
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Include/api-host.h -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/api-host.h
Changed
49
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
*/
12
13
#pragma once
14
-
15
-//////////////////////////////////////////////////////////////////////////
16
-// Includes
17
-//////////////////////////////////////////////////////////////////////////
18
#include "api-base.h"
19
20
-//////////////////////////////////////////////////////////////////////////
21
-// Code
22
-//////////////////////////////////////////////////////////////////////////
23
-
24
namespace Plugin {
25
namespace API {
26
- class Host : public Base {
27
+ class Host : public IAPI {
28
+ public:
29
virtual std::string GetName() override;
30
virtual Type GetType() override;
31
-
32
virtual std::vector<Adapter> EnumerateAdapters() override;
33
- virtual Adapter GetAdapterById(uint32_t idLow, uint32_t idHigh);
34
- virtual Adapter GetAdapterByName(std::string name);
35
+ virtual std::shared_ptr<Instance> CreateInstance(Adapter adapter) override;
36
+ };
37
38
- virtual void* CreateInstanceOnAdapter(Adapter adapter) override;
39
- virtual Adapter GetAdapterForInstance(void* pInstance) override;
40
- virtual void* GetContextFromInstance(void* pInstance) override;
41
- virtual void DestroyInstance(void* pInstance) override;
42
+ class HostInstance : public Instance {
43
+ public:
44
+ virtual Adapter GetAdapter() override;
45
+ virtual void* GetContext() override;
46
};
47
}
48
}
49
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Include/api-opengl.h -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/api-opengl.h
Changed
62
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
*/
12
13
#pragma once
14
-
15
-//////////////////////////////////////////////////////////////////////////
16
-// Includes
17
-//////////////////////////////////////////////////////////////////////////
18
#include "api-base.h"
19
20
-//////////////////////////////////////////////////////////////////////////
21
-// Code
22
-//////////////////////////////////////////////////////////////////////////
23
+#ifdef _WIN32
24
+#include <windows.h>
25
+#endif
26
+#include <gl/GL.h>
27
28
namespace Plugin {
29
namespace API {
30
- class OpenGL : public Base {
31
+ class OpenGL : public IAPI {
32
+ public:
33
+ OpenGL();
34
+ ~OpenGL();
35
+
36
virtual std::string GetName() override;
37
virtual Type GetType() override;
38
-
39
virtual std::vector<Adapter> EnumerateAdapters() override;
40
- virtual Adapter GetAdapterById(uint32_t idLow, uint32_t idHigh);
41
- virtual Adapter GetAdapterByName(std::string name);
42
+ virtual std::shared_ptr<Instance> CreateInstance(Adapter adapter) override;
43
+ };
44
+
45
+ class OpenGLInstance : public Instance {
46
+ public:
47
+ OpenGLInstance();
48
+ ~OpenGLInstance();
49
+
50
+ virtual Adapter GetAdapter() override;
51
+ virtual void* GetContext() override;
52
53
- virtual void* CreateInstanceOnAdapter(Adapter adapter) override;
54
- virtual Adapter GetAdapterForInstance(void* instance) override;
55
- virtual void* GetContextFromInstance(void* instance) override;
56
- virtual void DestroyInstance(void* instance) override;
57
+ private:
58
+ Adapter adapter;
59
};
60
}
61
}
62
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Include/enc-h264.h -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/enc-h264.h
Changed
188
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
*/
12
13
#pragma once
14
-//////////////////////////////////////////////////////////////////////////
15
-// Includes
16
-//////////////////////////////////////////////////////////////////////////
17
-// Plugin
18
+#include "amf-encoder-h264.h"
19
#include "plugin.h"
20
-#include "amf-capabilities.h"
21
-#include "amf-h264.h"
22
23
-//////////////////////////////////////////////////////////////////////////
24
-// Defines - Translation Strings
25
-//////////////////////////////////////////////////////////////////////////
26
-
27
-// Presets
28
-#define AMF_H264_PRESET TEXT_AMF_H264("Preset")
29
-#define AMF_H264_PRESET_RESETTODEFAULTS TEXT_AMF_H264("Preset.ResetToDefaults")
30
-#define AMF_H264_PRESET_RECORDING TEXT_AMF_H264("Preset.Recording")
31
-#define AMF_H264_PRESET_HIGHQUALITY TEXT_AMF_H264("Preset.HighQuality")
32
-#define AMF_H264_PRESET_INDISTINGUISHABLE TEXT_AMF_H264("Preset.Indistinguishable")
33
-#define AMF_H264_PRESET_LOSSLESS TEXT_AMF_H264("Preset.Lossless")
34
-#define AMF_H264_PRESET_TWITCH TEXT_AMF_H264("Preset.Twitch")
35
-#define AMF_H264_PRESET_YOUTUBE TEXT_AMF_H264("Preset.YouTube")
36
-
37
-// Startup Properties
38
-#define AMF_H264_USAGE TEXT_AMF_H264("Usage")
39
-#define AMF_H264_USAGE_DESCRIPTION TEXT_AMF_H264("Usage.Description")
40
-#define AMF_H264_USAGE_TRANSCODING TEXT_AMF_H264("Usage.Transcoding")
41
-#define AMF_H264_USAGE_ULTRALOWLATENCY TEXT_AMF_H264("Usage.UltraLowLatency")
42
-#define AMF_H264_USAGE_LOWLATENCY TEXT_AMF_H264("Usage.LowLatency")
43
-#define AMF_H264_USAGE_WEBCAM TEXT_AMF_H264("Usage.Webcam")
44
-#define AMF_H264_QUALITY_PRESET TEXT_AMF_H264("QualityPreset")
45
-#define AMF_H264_QUALITY_PRESET_DESCRIPTION TEXT_AMF_H264("QualityPreset.Description")
46
-#define AMF_H264_QUALITY_PRESET_SPEED TEXT_AMF_H264("QualityPreset.Speed")
47
-#define AMF_H264_QUALITY_PRESET_BALANCED TEXT_AMF_H264("QualityPreset.Balanced")
48
-#define AMF_H264_QUALITY_PRESET_QUALITY TEXT_AMF_H264("QualityPreset.Quality")
49
-#define AMF_H264_PROFILE TEXT_AMF_H264("Profile")
50
-#define AMF_H264_PROFILE_DESCRIPTION TEXT_AMF_H264("Profile.Description")
51
-#define AMF_H264_PROFILELEVEL TEXT_AMF_H264("ProfileLevel")
52
-#define AMF_H264_PROFILELEVEL_DESCRIPTION TEXT_AMF_H264("ProfileLevel.Description")
53
-
54
-// Rate Control Properties
55
-#define AMF_H264_RATECONTROLMETHOD TEXT_AMF_H264("RateControlMethod")
56
-#define AMF_H264_RATECONTROLMETHOD_DESCRIPTION TEXT_AMF_H264("RateControlMethod.Description")
57
-#define AMF_H264_RATECONTROLMETHOD_CQP TEXT_AMF_H264("RateControlMethod.CQP")
58
-#define AMF_H264_RATECONTROLMETHOD_CBR TEXT_AMF_H264("RateControlMethod.CBR")
59
-#define AMF_H264_RATECONTROLMETHOD_VBR TEXT_AMF_H264("RateControlMethod.VBR.Peak")
60
-#define AMF_H264_RATECONTROLMETHOD_VBR_LAT TEXT_AMF_H264("RateControlMethod.VBR.Latency")
61
-#define AMF_H264_BITRATE_TARGET TEXT_AMF_H264("Bitrate.Target")
62
-#define AMF_H264_BITRATE_TARGET_DESCRIPTION TEXT_AMF_H264("Bitrate.Target.Description")
63
-#define AMF_H264_BITRATE_PEAK TEXT_AMF_H264("Bitrate.Peak")
64
-#define AMF_H264_BITRATE_PEAK_DESCRIPTION TEXT_AMF_H264("Bitrate.Peak.Description")
65
-#define AMF_H264_QP_MINIMUM TEXT_AMF_H264("QP.Minimum")
66
-#define AMF_H264_QP_MINIMUM_DESCRIPTION TEXT_AMF_H264("QP.Minimum.Description")
67
-#define AMF_H264_QP_MAXIMUM TEXT_AMF_H264("QP.Maximum")
68
-#define AMF_H264_QP_MAXIMUM_DESCRIPTION TEXT_AMF_H264("QP.Maximum.Description")
69
-#define AMF_H264_QP_IFRAME TEXT_AMF_H264("QP.IFrame")
70
-#define AMF_H264_QP_IFRAME_DESCRIPTION TEXT_AMF_H264("QP.IFrame.Description")
71
-#define AMF_H264_QP_PFRAME TEXT_AMF_H264("QP.PFrame")
72
-#define AMF_H264_QP_PFRAME_DESCRIPTION TEXT_AMF_H264("QP.PFrame.Description")
73
-#define AMF_H264_QP_BFRAME TEXT_AMF_H264("QP.BFrame")
74
-#define AMF_H264_QP_BFRAME_DESCRIPTION TEXT_AMF_H264("QP.BFrame.Description")
75
-#define AMF_H264_VBVBUFFER TEXT_AMF_H264("VBVBuffer")
76
-#define AMF_H264_VBVBUFFER_DESCRIPTION TEXT_AMF_H264("VBVBuffer.Description")
77
-#define AMF_H264_VBVBUFFER_STRICTNESS TEXT_AMF_H264("VBVBuffer.Strictness")
78
-#define AMF_H264_VBVBUFFER_STRICTNESS_DESCRIPTION TEXT_AMF_H264("VBVBuffer.Strictness.Description")
79
-#define AMF_H264_VBVBUFFER_SIZE TEXT_AMF_H264("VBVBuffer.Size")
80
-#define AMF_H264_VBVBUFFER_SIZE_DESCRIPTION TEXT_AMF_H264("VBVBuffer.Size.Description")
81
-#define AMF_H264_VBVBUFFER_FULLNESS TEXT_AMF_H264("VBVBuffer.Fullness")
82
-#define AMF_H264_VBVBUFFER_FULLNESS_DESCRIPTION TEXT_AMF_H264("VBVBuffer.Fullness.Description")
83
-#define AMF_H264_FILLERDATA TEXT_AMF_H264("FillerData")
84
-#define AMF_H264_FILLERDATA_DESCRIPTION TEXT_AMF_H264("FillerData.Description")
85
-#define AMF_H264_FRAMESKIPPING TEXT_AMF_H264("FrameSkipping")
86
-#define AMF_H264_FRAMESKIPPING_DESCRIPTION TEXT_AMF_H264("FrameSkipping.Description")
87
-#define AMF_H264_ENFORCEHRDCOMPATIBILITY TEXT_AMF_H264("EnforceHRDCompatibility")
88
-#define AMF_H264_ENFORCEHRDCOMPATIBILITY_DESCRIPTION TEXT_AMF_H264("EnforceHRDCompatibility.Description")
89
-
90
-// Picture Control Properties
91
-#define AMF_H264_KEYFRAME_INTERVAL TEXT_AMF_H264("KeyframeInterval")
92
-#define AMF_H264_KEYFRAME_INTERVAL_DESCRIPTION TEXT_AMF_H264("KeyframeInterval.Description")
93
-#define AMF_H264_IDR_PERIOD TEXT_AMF_H264("IDRPeriod")
94
-#define AMF_H264_IDR_PERIOD_DESCRIPTION TEXT_AMF_H264("IDRPeriod.Description")
95
-#define AMF_H264_BFRAME_PATTERN TEXT_AMF_H264("BFrame.Pattern")
96
-#define AMF_H264_BFRAME_PATTERN_DESCRIPTION TEXT_AMF_H264("BFrame.Pattern.Description")
97
-#define AMF_H264_BFRAME_DELTAQP TEXT_AMF_H264("BFrame.DeltaQP")
98
-#define AMF_H264_BFRAME_DELTAQP_DESCRIPTION TEXT_AMF_H264("BFrame.DeltaQP.Description")
99
-#define AMF_H264_BFRAME_REFERENCE TEXT_AMF_H264("BFrame.Reference")
100
-#define AMF_H264_BFRAME_REFERENCE_DESCRIPTION TEXT_AMF_H264("BFrame.Reference.Description")
101
-#define AMF_H264_BFRAME_REFERENCEDELTAQP TEXT_AMF_H264("BFrame.ReferenceDeltaQP")
102
-#define AMF_H264_BFRAME_REFERENCEDELTAQP_DESCRIPTION TEXT_AMF_H264("BFrame.ReferenceDeltaQP.Description")
103
-#define AMF_H264_DEBLOCKINGFILTER TEXT_AMF_H264("DeblockingFilter")
104
-#define AMF_H264_DEBLOCKINGFILTER_DESCRIPTION TEXT_AMF_H264("DeblockingFilter.Description")
105
-
106
-// Miscellaneous Properties
107
-#define AMF_H264_SCANTYPE TEXT_AMF_H264("ScanType")
108
-#define AMF_H264_SCANTYPE_DESCRIPTION TEXT_AMF_H264("ScanType.Description")
109
-#define AMF_H264_SCANTYPE_PROGRESSIVE TEXT_AMF_H264("ScanType.Progressive")
110
-#define AMF_H264_SCANTYPE_INTERLACED TEXT_AMF_H264("ScanType.Interlaced")
111
-#define AMF_H264_MOTIONESTIMATION TEXT_AMF_H264("MotionEstimation")
112
-#define AMF_H264_MOTIONESTIMATION_DESCRIPTION TEXT_AMF_H264("MotionEstimation.Description")
113
-#define AMF_H264_MOTIONESTIMATION_NONE TEXT_AMF_H264("MotionEstimation.None")
114
-#define AMF_H264_MOTIONESTIMATION_HALF TEXT_AMF_H264("MotionEstimation.Half")
115
-#define AMF_H264_MOTIONESTIMATION_QUARTER TEXT_AMF_H264("MotionEstimation.Quarter")
116
-#define AMF_H264_MOTIONESTIMATION_BOTH TEXT_AMF_H264("MotionEstimation.Both")
117
-
118
-// Experimental Properties
119
-#define AMF_H264_CODINGTYPE TEXT_AMF_H264("CodingType")
120
-#define AMF_H264_CODINGTYPE_DESCRIPTION TEXT_AMF_H264("CodingType.Description")
121
-#define AMF_H264_MAXIMUMLTRFRAMES TEXT_AMF_H264("MaximumLTRFrames")
122
-#define AMF_H264_MAXIMUMLTRFRAMES_DESCRIPTION TEXT_AMF_H264("MaximumLTRFrames.Description")
123
-#define AMF_H264_MAXIMUMACCESSUNITSIZE TEXT_AMF_H264("MaximumAccessUnitSize")
124
-#define AMF_H264_MAXIMUMACCESSUNITSIZE_DESCRIPTION TEXT_AMF_H264("MaximumAccessUnitSize.Description")
125
-#define AMF_H264_HEADER_INSERTION_SPACING TEXT_AMF_H264("HeaderInsertionSpacing")
126
-#define AMF_H264_HEADER_INSERTION_SPACING_DESCRIPTION TEXT_AMF_H264("HeaderInsertionSpacing.Description")
127
-#define AMF_H264_WAITFORTASK TEXT_AMF_H264("WaitForTask")
128
-#define AMF_H264_WAITFORTASK_DESCRIPTION TEXT_AMF_H264("WaitForTask.Description")
129
-#define AMF_H264_PREANALYSISPASS TEXT_AMF_H264("PreanalysisPass")
130
-#define AMF_H264_PREANALYSISPASS_DESCRIPTION TEXT_AMF_H264("PreanalysisPass.Description")
131
-#define AMF_H264_VBAQ TEXT_AMF_H264("VBAQ")
132
-#define AMF_H264_VBAQ_DESCRIPTION TEXT_AMF_H264("VBAQ.Description")
133
-#define AMF_H264_GOPSIZE TEXT_AMF_H264("GOPSize")
134
-#define AMF_H264_GOPSIZE_DESCRIPTION TEXT_AMF_H264("GOPSize.Description")
135
-#define AMF_H264_GOPALIGNMENT TEXT_AMF_H264("GOPAlignment")
136
-#define AMF_H264_GOPALIGNMENT_DESCRIPTION TEXT_AMF_H264("GOPAlignment.Description")
137
-#define AMF_H264_MAXIMUMREFERENCEFRAMES TEXT_AMF_H264("MaximumReferenceFrames")
138
-#define AMF_H264_MAXIMUMREFERENCEFRAMES_DESCRIPTION TEXT_AMF_H264("MaximumReferenceFrames.Description")
139
-#define AMF_H264_SLICESPERFRAME TEXT_AMF_H264("SlicesPerFrame")
140
-#define AMF_H264_SLICESPERFRAME_DESCRIPTION TEXT_AMF_H264("SlicesPerFrame.Description")
141
-#define AMF_H264_SLICEMODE TEXT_AMF_H264("SliceMode")
142
-#define AMF_H264_SLICEMODE_DESCRIPTION TEXT_AMF_H264("SliceMode.Description")
143
-#define AMF_H264_MAXIMUMSLICESIZE TEXT_AMF_H264("MaximumSliceSize")
144
-#define AMF_H264_MAXIMUMSLICESIZE_DESCRIPTION TEXT_AMF_H264("MaximumSliceSize.Description")
145
-#define AMF_H264_SLICECONTROLMODE TEXT_AMF_H264("SliceControlMode")
146
-#define AMF_H264_SLICECONTROLMODE_DESCRIPTION TEXT_AMF_H264("SliceControlMode.Description")
147
-#define AMF_H264_SLICECONTROLSIZE TEXT_AMF_H264("SliceControlSize")
148
-#define AMF_H264_SLICECONTROLSIZE_DESCRIPTION TEXT_AMF_H264("SliceControlSize.Description")
149
-#define AMF_H264_INTRAREFRESH_NUMBEROFSTRIPES TEXT_AMF_H264("IntraRefresh.NumberOfStripes")
150
-#define AMF_H264_INTRAREFRESH_NUMBEROFSTRIPES_DESCRIPTION TEXT_AMF_H264("IntraRefresh.NumberOfStripes.Description")
151
-#define AMF_H264_INTRAREFRESH_MACROBLOCKSPERSLOT TEXT_AMF_H264("IntraRefresh.MacroblocksPerSlot")
152
-#define AMF_H264_INTRAREFRESH_MACROBLOCKSPERSLOT_DESCRIPTION TEXT_AMF_H264("IntraRefresh.MacroblocksPerSlot.Description")
153
-
154
-// System Properties
155
-#define AMF_H264_VIDEOAPI TEXT_AMF_H264("VideoAPI")
156
-#define AMF_H264_VIDEOAPI_DESCRIPTION TEXT_AMF_H264("VideoAPI.Description")
157
-#define AMF_H264_VIDEOADAPTER TEXT_AMF_H264("VideoAdapter")
158
-#define AMF_H264_VIDEOADAPTER_DESCRIPTION TEXT_AMF_H264("VideoAdapter.Description")
159
-#define AMF_H264_OPENCL TEXT_AMF_H264("OpenCL")
160
-#define AMF_H264_OPENCL_DESCRIPTION TEXT_AMF_H264("OpenCL.Description")
161
-#define AMF_H264_VIEW TEXT_AMF_H264("View")
162
-#define AMF_H264_VIEW_DESCRIPTION TEXT_AMF_H264("View.Description")
163
-#define AMF_H264_VIEW_BASIC TEXT_AMF_H264("View.Basic")
164
-#define AMF_H264_VIEW_ADVANCED TEXT_AMF_H264("View.Advanced")
165
-#define AMF_H264_VIEW_EXPERT TEXT_AMF_H264("View.Expert")
166
-#define AMF_H264_VIEW_MASTER TEXT_AMF_H264("View.Master")
167
-#define AMF_H264_DEBUG TEXT_AMF_H264("Debug")
168
-#define AMF_H264_DEBUG_DESCRIPTION TEXT_AMF_H264("Debug.Description")
169
-#define AMF_H264_VERSION TEXT_AMF_H264("Version")
170
-
171
-//////////////////////////////////////////////////////////////////////////
172
-// Code
173
-//////////////////////////////////////////////////////////////////////////
174
namespace Plugin {
175
namespace Interface {
176
class H264Interface {
177
178
// Storage
179
//////////////////////////////////////////////////////////////////////////
180
private:
181
- Plugin::AMD::H264Encoder* m_VideoEncoder;
182
+ std::unique_ptr<Plugin::AMD::EncoderH264> m_VideoEncoder;
183
+ obs_encoder_t* m_Encoder;
184
};
185
}
186
}
187
\ No newline at end of file
188
obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/enc-h265.h
Added
71
1
2
+/*
3
+MIT License
4
+
5
+Copyright (c) 2016-2017
6
+
7
+Permission is hereby granted, free of charge, to any person obtaining a copy
8
+of this software and associated documentation files (the "Software"), to deal
9
+in the Software without restriction, including without limitation the rights
10
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+copies of the Software, and to permit persons to whom the Software is
12
+furnished to do so, subject to the following conditions:
13
+
14
+The above copyright notice and this permission notice shall be included in all
15
+copies or substantial portions of the Software.
16
+
17
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+SOFTWARE.
24
+*/
25
+
26
+#pragma once
27
+#include "amf-encoder-h265.h"
28
+#include "plugin.h"
29
+
30
+namespace Plugin {
31
+ namespace Interface {
32
+ class H265Interface {
33
+ public:
34
+ static void encoder_register();
35
+ static const char* get_name(void* type_data);
36
+ static void get_defaults(obs_data_t *data);
37
+ static obs_properties_t* get_properties(void* ptr);
38
+
39
+ static bool properties_modified(obs_properties_t *props, obs_property_t *, obs_data_t *data);
40
+
41
+ static void* create(obs_data_t* settings, obs_encoder_t* encoder);
42
+ static void destroy(void* ptr);
43
+ static bool update(void *ptr, obs_data_t *data);
44
+ static bool encode(void *ptr, struct encoder_frame * frame, struct encoder_packet * packet, bool * received_packet);
45
+ static void get_video_info(void *ptr, struct video_scale_info *info);
46
+ static bool get_extra_data(void *ptr, uint8_t** extra_data, size_t* size);
47
+
48
+ //////////////////////////////////////////////////////////////////////////
49
+ // Module Code
50
+ //////////////////////////////////////////////////////////////////////////
51
+ public:
52
+
53
+ H265Interface(obs_data_t* data, obs_encoder_t* encoder);
54
+ ~H265Interface();
55
+
56
+ bool update(obs_data_t* data);
57
+ bool encode(struct encoder_frame * frame, struct encoder_packet * packet, bool * received_packet);
58
+ void get_video_info(struct video_scale_info* info);
59
+ bool get_extra_data(uint8_t** extra_data, size_t* size);
60
+
61
+ //////////////////////////////////////////////////////////////////////////
62
+ // Storage
63
+ //////////////////////////////////////////////////////////////////////////
64
+ private:
65
+ std::unique_ptr<Plugin::AMD::EncoderH265> m_VideoEncoder;
66
+ obs_encoder_t* m_Encoder;
67
+ };
68
+ }
69
+}
70
\ No newline at end of file
71
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Include/plugin.h -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/plugin.h
Changed
154
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
*/
12
13
#pragma once
14
-//////////////////////////////////////////////////////////////////////////
15
-// Includes
16
-//////////////////////////////////////////////////////////////////////////
17
+#define NOMINMAX
18
+#define NOINOUT
19
20
-// Microsoft as always does not follow the standard and declares safe functions unsafe.
21
-// Or even straight up marks them as deprecated, what the fuck Microsoft?
22
-#ifdef _MSC_VER
23
-#define _CRT_SECURE_NO_WARNINGS
24
-#pragma warning(disable : 4996)
25
-#endif
26
-
27
-#include <cstdint>
28
-#include <inttypes.h>
29
-#include <exception>
30
-#include <stdexcept>
31
-#include <thread>
32
-#include <memory>
33
-
34
-// Open Broadcaster Software
35
-#pragma warning( disable: 4201 )
36
+#pragma warning (push)
37
+#pragma warning (disable: 4201)
38
#include "libobs/obs-module.h"
39
-#include "libobs/obs-encoder.h"
40
+#include "libobs/util/platform.h"
41
+#pragma warning (pop)
42
43
-MODULE_EXTERN const char *obs_module_text_multi(const char *val, uint8_t depth = (uint8_t)1);
44
+// Plugin
45
+#define PLUGIN_NAME "AMD Advanced Media Framework"
46
+#include "Version.h"
47
48
-//////////////////////////////////////////////////////////////////////////
49
-// Defines
50
-//////////////////////////////////////////////////////////////////////////
51
+#define PLOG(level, ...) blog(level, "[AMF] " __VA_ARGS__);
52
+#define PLOG_ERROR(...) PLOG(LOG_ERROR, __VA_ARGS__)
53
+#define PLOG_WARNING(...) PLOG(LOG_WARNING, __VA_ARGS__)
54
+#define PLOG_INFO(...) PLOG(LOG_INFO, __VA_ARGS__)
55
+#define PLOG_DEBUG(...) PLOG(LOG_DEBUG, __VA_ARGS__)
56
57
+// Utility
58
#define vstr(s) dstr(s)
59
#define dstr(s) #s
60
-#define clamp(val,low,high) (val > high ? high : (val < low ? low : val))
61
62
-#include "Version.h"
63
-#define PLUGIN_VERSION_FULL (((uint64_t)PLUGIN_VERSION_MAJOR << 48ull) | ((uint64_t)PLUGIN_VERSION_MINOR << 32ull) | ((uint64_t)PLUGIN_VERSION_PATCH) << 16ul | ((uint64_t)PLUGIN_VERSION_BUILD))
64
-#define PLUGIN_VERSION_TEXT vstr(PLUGIN_VERSION_MAJOR) "." vstr(PLUGIN_VERSION_MINOR) "." vstr(PLUGIN_VERSION_PATCH) "." vstr(PLUGIN_VERSION_BUILD)
65
+#define clamp(val,low,high) (val > high ? high : (val < low ? low : val))
66
+#ifdef max
67
+#undef max
68
+#endif
69
+#define max(val,high) (val > high ? val : high)
70
+#ifdef min
71
+#undef min
72
+#endif
73
+#define min(val,low ) (val < low ? val : low)
74
75
-#define AMF_LOG(level, format, ...) blog(level, "[AMF Encoder] " format, ##__VA_ARGS__);
76
-#define AMF_LOG_ERROR(format, ...) AMF_LOG(LOG_ERROR, format, ##__VA_ARGS__)
77
-#define AMF_LOG_WARNING(format, ...) AMF_LOG(LOG_WARNING, format, ##__VA_ARGS__)
78
-#define AMF_LOG_INFO(format, ...) AMF_LOG(LOG_INFO, format, ##__VA_ARGS__)
79
-#define AMF_LOG_CONFIG(format, ...) AMF_LOG(350, format, ##__VA_ARGS__)
80
-#define AMF_LOG_DEBUG(format, ...) AMF_LOG(LOG_DEBUG, format, ##__VA_ARGS__)
81
+#ifdef IN
82
+#undef IN
83
+#endif
84
+#define IN
85
+#ifdef OUT
86
+#undef OUT
87
+#endif
88
+#define OUT
89
90
-#define ThrowException(format, ...) {\
91
- std::vector<char> _throwexceptionwithamferror_buf(8192);\
92
- sprintf_s(_throwexceptionwithamferror_buf.data(), _throwexceptionwithamferror_buf.size(), format, ##__VA_ARGS__);\
93
- AMF_LOG_WARNING("%s", _throwexceptionwithamferror_buf.data()); \
94
- throw std::exception(_throwexceptionwithamferror_buf.data()); \
95
-}
96
-#define ThrowExceptionWithAMFError(format, res, ...) {\
97
- std::vector<char> _throwexceptionwithamferror_buf(8192);\
98
- sprintf_s(_throwexceptionwithamferror_buf.data(), _throwexceptionwithamferror_buf.size(), format, ##__VA_ARGS__, Plugin::AMD::AMF::GetInstance()->GetTrace()->GetResultText(res), res);\
99
- AMF_LOG_WARNING("%s", _throwexceptionwithamferror_buf.data()); \
100
- throw std::exception(_throwexceptionwithamferror_buf.data()); \
101
-}
102
+#define QUICK_FORMAT_MESSAGE(var, ...) std::string var = ""; { \
103
+ std::vector<char> QUICK_FORMAT_MESSAGE_buf(1024); \
104
+ snprintf(QUICK_FORMAT_MESSAGE_buf.data(), QUICK_FORMAT_MESSAGE_buf.size(), __VA_ARGS__); \
105
+ var = std::string(QUICK_FORMAT_MESSAGE_buf.data()); \
106
+ }
107
108
#ifndef __FUNCTION_NAME__
109
#if defined(_WIN32) || defined(_WIN64) //WINDOWS
110
111
#endif
112
#endif
113
114
-//////////////////////////////////////////////////////////////////////////
115
-// Defines - Translation Strings
116
-//////////////////////////////////////////////////////////////////////////
117
-
118
-#define TEXT_T(x) obs_module_text_multi(x)
119
-#define TEXT_AMF(x) ("AMF." ## x)
120
-#define TEXT_AMF_H264(x) (TEXT_AMF("H264." ## x))
121
-#define TEXT_AMF_UTIL(x) (TEXT_AMF("Util." ## x))
122
-
123
-// Utility
124
-#define AMF_UTIL_DEFAULT TEXT_AMF_UTIL("Default")
125
-#define AMF_UTIL_AUTOMATIC TEXT_AMF_UTIL("Automatic")
126
-#define AMF_UTIL_MANUAL TEXT_AMF_UTIL("Manual")
127
-#define AMF_UTIL_TOGGLE_DISABLED TEXT_AMF_UTIL("Toggle.Disabled")
128
-#define AMF_UTIL_TOGGLE_ENABLED TEXT_AMF_UTIL("Toggle.Enabled")
129
-
130
-//////////////////////////////////////////////////////////////////////////
131
-// Threading Specific
132
-//////////////////////////////////////////////////////////////////////////
133
-
134
-#if (defined _WIN32) || (defined _WIN64)
135
-void SetThreadName(uint32_t dwThreadID, const char* threadName);
136
-void SetThreadName(const char* threadName);
137
-void SetThreadName(std::thread* thread, const char* threadName);
138
-
139
-#else
140
-void SetThreadName(std::thread* thread, const char* threadName);
141
-void SetThreadName(const char* threadName);
142
-
143
-#endif
144
+enum class Presets : int8_t {
145
+ None = -1,
146
+ ResetToDefaults = 0,
147
+ Recording,
148
+ HighQuality,
149
+ Indistinguishable,
150
+ Lossless,
151
+ Twitch,
152
+ YouTube,
153
+};
154
obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/strings.h
Added
175
1
2
+/*
3
+MIT License
4
+
5
+Copyright (c) 2016-2017
6
+
7
+Permission is hereby granted, free of charge, to any person obtaining a copy
8
+of this software and associated documentation files (the "Software"), to deal
9
+in the Software without restriction, including without limitation the rights
10
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+copies of the Software, and to permit persons to whom the Software is
12
+furnished to do so, subject to the following conditions:
13
+
14
+The above copyright notice and this permission notice shall be included in all
15
+copies or substantial portions of the Software.
16
+
17
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+SOFTWARE.
24
+*/
25
+
26
+#pragma once
27
+#include "plugin.h"
28
+#include "utility.h"
29
+
30
+#define P_TRANSLATE(x) Utility::obs_module_text_multi(x)
31
+#define P_DESC(x) x ".Description"
32
+
33
+// Shared
34
+#define P_VERSION "Version"
35
+#define P_UTIL_DEFAULT "Utility.Default"
36
+#define P_UTIL_AUTOMATIC "Utility.Automatic"
37
+#define P_UTIL_MANUAL "Utility.Manual"
38
+#define P_UTIL_SWITCH_DISABLED "Utility.Switch.Disabled"
39
+#define P_UTIL_SWITCH_ENABLED "Utility.Switch.Enabled"
40
+
41
+// Presets
42
+#define P_PRESET "Preset"
43
+#define P_PRESET_RESETTODEFAULTS "Preset.ResetToDefaults"
44
+#define P_PRESET_RECORDING "Preset.Recording"
45
+#define P_PRESET_HIGHQUALITY "Preset.HighQuality"
46
+#define P_PRESET_INDISTINGUISHABLE "Preset.Indistinguishable"
47
+#define P_PRESET_LOSSLESS "Preset.Lossless"
48
+#define P_PRESET_TWITCH "Preset.Twitch"
49
+#define P_PRESET_YOUTUBE "Preset.YouTube"
50
+
51
+// Static
52
+//#define P_USAGE "Usage"
53
+//#define P_USAGE_TRANSCODING "Usage.Transcoding"
54
+//#define P_USAGE_ULTRALOWLATENCY "Usage.UltraLowLatency"
55
+//#define P_USAGE_LOWLATENCY "Usage.LowLatency"
56
+//#define P_USAGE_WEBCAM "Usage.Webcam"
57
+#define P_QUALITYPRESET "QualityPreset"
58
+#define P_QUALITYPRESET_SPEED "QualityPreset.Speed"
59
+#define P_QUALITYPRESET_BALANCED "QualityPreset.Balanced"
60
+#define P_QUALITYPRESET_QUALITY "QualityPreset.Quality"
61
+#define P_PROFILE "Profile"
62
+#define P_PROFILELEVEL "ProfileLevel"
63
+#define P_TIER "Tier"
64
+#define P_ASPECTRATIO "AspectRatio"
65
+#define P_CODINGTYPE "CodingType"
66
+#define P_CODINGTYPE_CABAC "CodingType.CABAC"
67
+#define P_CODINGTYPE_CAVLC "CodingType.CAVLC"
68
+#define P_MAXIMUMREFERENCEFRAMES "MaximumReferenceFrames"
69
+
70
+// Rate Control
71
+#define P_RATECONTROLMETHOD "RateControlMethod"
72
+#define P_RATECONTROLMETHOD_CQP "RateControlMethod.CQP"
73
+#define P_RATECONTROLMETHOD_CBR "RateControlMethod.CBR"
74
+#define P_RATECONTROLMETHOD_VBR "RateControlMethod.VBR"
75
+#define P_RATECONTROLMETHOD_VBRLAT "RateControlMethod.VBRLAT"
76
+#define P_PREPASSMODE "PrePassMode"
77
+#define P_PREPASSMODE_QUARTER "PrePassMode.Quarter"
78
+#define P_PREPASSMODE_HALF "PrePassMode.Half"
79
+#define P_PREPASSMODE_FULL "PrePassMode.Full"
80
+#define P_BITRATE_TARGET "Bitrate.Target"
81
+#define P_BITRATE_PEAK "Bitrate.Peak"
82
+#define P_QP_MINIMUM "QP.Minimum" // H264
83
+#define P_QP_MAXIMUM "QP.Maximum" // H264
84
+#define P_QP_IFRAME "QP.IFrame"
85
+#define P_QP_IFRAME_MINIMUM "QP.IFrame.Minimum" // H265
86
+#define P_QP_IFRAME_MAXIMUM "QP.IFrame.Maximum" // H265
87
+#define P_QP_PFRAME "QP.PFrame"
88
+#define P_QP_PFRAME_MINIMUM "QP.PFrame.Minimum" // H265
89
+#define P_QP_PFRAME_MAXIMUM "QP.PFrame.Maximum" // H265
90
+#define P_QP_BFRAME "QP.BFrame" // H264
91
+#define P_FILLERDATA "FillerData"
92
+#define P_FRAMESKIPPING "FrameSkipping"
93
+#define P_FRAMESKIPPING_PERIOD "FrameSkipping.Period"
94
+#define P_FRAMESKIPPING_BEHAVIOUR "FrameSkipping.Behaviour"
95
+#define P_FRAMESKIPPING_SKIPNTH "FrameSkipping.SkipNth"
96
+#define P_FRAMESKIPPING_KEEPNTH "FrameSkipping.KeepNth"
97
+#define P_VBAQ "VBAQ"
98
+#define P_ENFORCEHRD "EnforceHRD"
99
+
100
+// VBV Buffer
101
+#define P_VBVBUFFER "VBVBuffer"
102
+#define P_VBVBUFFER_SIZE "VBVBuffer.Size"
103
+#define P_VBVBUFFER_STRICTNESS "VBVBuffer.Strictness"
104
+#define P_VBVBUFFER_INITIALFULLNESS "VBVBuffer.InitialFullness"
105
+
106
+// Picture Control
107
+#define P_INTERVAL_KEYFRAME "Interval.Keyframe"
108
+#define P_PERIOD_IDR_H264 "Period.IDR.H264" // H264
109
+#define P_PERIOD_IDR_H265 "Period.IDR.H265" // H265
110
+#define P_INTERVAL_IFRAME "Interval.IFrame"
111
+#define P_PERIOD_IFRAME "Period.IFrame"
112
+#define P_INTERVAL_PFRAME "Interval.PFrame"
113
+#define P_PERIOD_PFRAME "Period.PFrame"
114
+#define P_INTERVAL_BFRAME "Interval.BFrame"
115
+#define P_PERIOD_BFRAME "Period.BFrame"
116
+#define P_GOP_TYPE "GOP.Type" // H265
117
+#define P_GOP_TYPE_FIXED "GOP.Type.Fixed" // H265
118
+#define P_GOP_TYPE_VARIABLE "GOP.Type.Variable" // H265
119
+#define P_GOP_SIZE "GOP.Size" // H265
120
+#define P_GOP_SIZE_MINIMUM "GOP.Size.Minimum" // H265
121
+#define P_GOP_SIZE_MAXIMUM "GOP.Size.Maximum" // H265
122
+#define P_GOP_ALIGNMENT "GOP.Alignment" // Both?
123
+#define P_BFRAME_PATTERN "BFrame.Pattern" // H264
124
+#define P_BFRAME_DELTAQP "BFrame.DeltaQP" // H264
125
+#define P_BFRAME_REFERENCE "BFrame.Reference" // H264
126
+#define P_BFRAME_REFERENCEDELTAQP "BFrame.ReferenceDeltaQP" // H264
127
+#define P_DEBLOCKINGFILTER "DeblockingFilter"
128
+#define P_MOTIONESTIMATION "MotionEstimation"
129
+#define P_MOTIONESTIMATION_QUARTER "MotionEstimation.Quarter"
130
+#define P_MOTIONESTIMATION_HALF "MotionEstimation.Half"
131
+#define P_MOTIONESTIMATION_FULL "MotionEstimation.Full"
132
+
133
+// System
134
+#define P_VIDEO_API "Video.API"
135
+#define P_VIDEO_ADAPTER "Video.Adapter"
136
+#define P_OPENCL_TRANSFER "OpenCL.Transfer"
137
+#define P_OPENCL_CONVERSION "OpenCL.Conversion"
138
+#define P_ASYNCHRONOUSQUEUE "AsynchronousQueue"
139
+#define P_ASYNCHRONOUSQUEUE_SIZE "AsynchronousQueue.Size"
140
+#define P_DEBUG "Debug"
141
+
142
+#define P_VIEW "View"
143
+#define P_VIEW_BASIC "View.Basic"
144
+#define P_VIEW_ADVANCED "View.Advanced"
145
+#define P_VIEW_EXPERT "View.Expert"
146
+#define P_VIEW_MASTER "View.Master"
147
+enum class ViewMode :uint8_t {
148
+ Basic,
149
+ Advanced,
150
+ Expert,
151
+ Master
152
+};
153
+
154
+/// Other - Missing Functionality
155
+//#define AMF_H264_MAXIMUMLTRFRAMES TEXT_AMF_H264("MaximumLTRFrames")
156
+//#define AMF_H264_MAXIMUMLTRFRAMES_DESCRIPTION TEXT_AMF_H264("MaximumLTRFrames.Description")
157
+//#define AMF_H264_MAXIMUMACCESSUNITSIZE TEXT_AMF_H264("MaximumAccessUnitSize")
158
+//#define AMF_H264_MAXIMUMACCESSUNITSIZE_DESCRIPTION TEXT_AMF_H264("MaximumAccessUnitSize.Description")
159
+//#define AMF_H264_HEADER_INSERTION_SPACING TEXT_AMF_H264("HeaderInsertionSpacing")
160
+//#define AMF_H264_HEADER_INSERTION_SPACING_DESCRIPTION TEXT_AMF_H264("HeaderInsertionSpacing.Description")
161
+//#define AMF_H264_SLICESPERFRAME TEXT_AMF_H264("SlicesPerFrame")
162
+//#define AMF_H264_SLICESPERFRAME_DESCRIPTION TEXT_AMF_H264("SlicesPerFrame.Description")
163
+//#define AMF_H264_SLICEMODE TEXT_AMF_H264("SliceMode")
164
+//#define AMF_H264_SLICEMODE_DESCRIPTION TEXT_AMF_H264("SliceMode.Description")
165
+//#define AMF_H264_MAXIMUMSLICESIZE TEXT_AMF_H264("MaximumSliceSize")
166
+//#define AMF_H264_MAXIMUMSLICESIZE_DESCRIPTION TEXT_AMF_H264("MaximumSliceSize.Description")
167
+//#define AMF_H264_SLICECONTROLMODE TEXT_AMF_H264("SliceControlMode")
168
+//#define AMF_H264_SLICECONTROLMODE_DESCRIPTION TEXT_AMF_H264("SliceControlMode.Description")
169
+//#define AMF_H264_SLICECONTROLSIZE TEXT_AMF_H264("SliceControlSize")
170
+//#define AMF_H264_SLICECONTROLSIZE_DESCRIPTION TEXT_AMF_H264("SliceControlSize.Description")
171
+//#define AMF_H264_INTRAREFRESH_NUMBEROFSTRIPES TEXT_AMF_H264("IntraRefresh.NumberOfStripes")
172
+//#define AMF_H264_INTRAREFRESH_NUMBEROFSTRIPES_DESCRIPTION TEXT_AMF_H264("IntraRefresh.NumberOfStripes.Description")
173
+//#define AMF_H264_INTRAREFRESH_MACROBLOCKSPERSLOT TEXT_AMF_H264("IntraRefresh.MacroblocksPerSlot")
174
+//#define AMF_H264_INTRAREFRESH_MACROBLOCKSPERSLOT_DESCRIPTION TEXT_AMF_H264("IntraRefresh.MacroblocksPerSlot.Description")
175
obs-studio-18.0.2.tar.xz/plugins/enc-amf/Include/utility.h
Added
158
1
2
+/*
3
+MIT License
4
+
5
+Copyright (c) 2016-2017
6
+
7
+Permission is hereby granted, free of charge, to any person obtaining a copy
8
+of this software and associated documentation files (the "Software"), to deal
9
+in the Software without restriction, including without limitation the rights
10
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+copies of the Software, and to permit persons to whom the Software is
12
+furnished to do so, subject to the following conditions:
13
+
14
+The above copyright notice and this permission notice shall be included in all
15
+copies or substantial portions of the Software.
16
+
17
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+SOFTWARE.
24
+*/
25
+
26
+#pragma once
27
+#include "amf.h"
28
+#include "amf-encoder.h"
29
+#include "components/VideoConverter.h"
30
+#ifdef WITH_AVC
31
+#include "amf-encoder-h264.h"
32
+#include "components/VideoEncoderVCE.h"
33
+#endif
34
+#ifdef WITH_HEVC
35
+#include "amf-encoder-h265.h"
36
+#include "components/VideoEncoderHEVC.h"
37
+#endif
38
+
39
+namespace Utility {
40
+ uint64_t GetUniqueIdentifier();
41
+ const char *obs_module_text_multi(const char *val, uint8_t depth = (uint8_t)1);
42
+
43
+ // Codec
44
+ const char* CodecToString(Plugin::AMD::Codec v);
45
+ const wchar_t* CodecToAMF(Plugin::AMD::Codec v);
46
+
47
+ // Color Format
48
+ const char* ColorFormatToString(Plugin::AMD::ColorFormat v);
49
+ amf::AMF_SURFACE_FORMAT ColorFormatToAMF(Plugin::AMD::ColorFormat v);
50
+
51
+ // Color Space
52
+ const char* ColorSpaceToString(Plugin::AMD::ColorSpace v);
53
+ AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM ColorSpaceToAMFConverter(Plugin::AMD::ColorSpace v);
54
+
55
+ // Usage
56
+ const char* UsageToString(Plugin::AMD::Usage v);
57
+ #ifdef WITH_AVC
58
+ AMF_VIDEO_ENCODER_USAGE_ENUM UsageToAMFH264(Plugin::AMD::Usage v);
59
+ Plugin::AMD::Usage UsageFromAMFH264(AMF_VIDEO_ENCODER_USAGE_ENUM v);
60
+ #endif
61
+ #ifdef WITH_HEVC
62
+ AMF_VIDEO_ENCODER_HEVC_USAGE_ENUM UsageToAMFH265(Plugin::AMD::Usage v);
63
+ Plugin::AMD::Usage UsageFromAMFH265(AMF_VIDEO_ENCODER_HEVC_USAGE_ENUM v);
64
+ #endif
65
+
66
+ // Quality Preset
67
+ const char* QualityPresetToString(Plugin::AMD::QualityPreset v);
68
+ #ifdef WITH_AVC
69
+ AMF_VIDEO_ENCODER_QUALITY_PRESET_ENUM QualityPresetToAMFH264(Plugin::AMD::QualityPreset v);
70
+ Plugin::AMD::QualityPreset QualityPresetFromAMFH264(AMF_VIDEO_ENCODER_QUALITY_PRESET_ENUM v);
71
+ #endif
72
+ #ifdef WITH_HEVC
73
+ AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_ENUM QualityPresetToAMFH265(Plugin::AMD::QualityPreset v);
74
+ Plugin::AMD::QualityPreset QualityPresetFromAMFH265(AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_ENUM v);
75
+ #endif
76
+
77
+ // Profile
78
+ const char* ProfileToString(Plugin::AMD::Profile v);
79
+ #ifdef WITH_AVC
80
+ AMF_VIDEO_ENCODER_PROFILE_ENUM ProfileToAMFH264(Plugin::AMD::Profile v);
81
+ Plugin::AMD::Profile ProfileFromAMFH264(AMF_VIDEO_ENCODER_PROFILE_ENUM v);
82
+ #endif
83
+ #ifdef WITH_HEVC
84
+ AMF_VIDEO_ENCODER_HEVC_PROFILE_ENUM ProfileToAMFH265(Plugin::AMD::Profile v);
85
+ Plugin::AMD::Profile ProfileFromAMFH265(AMF_VIDEO_ENCODER_HEVC_PROFILE_ENUM v);
86
+ #endif
87
+
88
+ // Tier
89
+ #ifdef WITH_HEVC
90
+ const char* TierToString(Plugin::AMD::H265::Tier v);
91
+ AMF_VIDEO_ENCODER_HEVC_TIER_ENUM TierToAMFH265(Plugin::AMD::H265::Tier v);
92
+ Plugin::AMD::H265::Tier TierFromAMFH265(AMF_VIDEO_ENCODER_HEVC_TIER_ENUM v);
93
+ #endif
94
+
95
+ // Coding Type
96
+ const char* CodingTypeToString(Plugin::AMD::CodingType v);
97
+ #ifdef WITH_AVC
98
+ AMF_VIDEO_ENCODER_CODING_ENUM CodingTypeToAMFH264(Plugin::AMD::CodingType v);
99
+ Plugin::AMD::CodingType CodingTypeFromAMFH264(AMF_VIDEO_ENCODER_CODING_ENUM v);
100
+ #endif
101
+ #ifdef WITH_HEVC
102
+ int64_t CodingTypeToAMFH265(Plugin::AMD::CodingType v);
103
+ Plugin::AMD::CodingType CodingTypeFromAMFH265(int64_t v);
104
+ #endif
105
+
106
+ // Rate Control Method
107
+ const char* RateControlMethodToString(Plugin::AMD::RateControlMethod v);
108
+ #ifdef WITH_AVC
109
+ AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_ENUM RateControlMethodToAMFH264(Plugin::AMD::RateControlMethod v);
110
+ Plugin::AMD::RateControlMethod RateControlMethodFromAMFH264(AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_ENUM v);
111
+ #endif
112
+ #ifdef WITH_HEVC
113
+ AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_ENUM RateControlMethodToAMFH265(Plugin::AMD::RateControlMethod v);
114
+ Plugin::AMD::RateControlMethod RateControlMethodFromAMFH265(AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_ENUM v);
115
+ #endif
116
+
117
+ // Pre-Pass Method
118
+ const char* PrePassModeToString(Plugin::AMD::PrePassMode v);
119
+ #ifdef WITH_AVC
120
+ AMF_VIDEO_ENCODER_PREENCODE_MODE_ENUM PrePassModeToAMFH264(Plugin::AMD::PrePassMode v);
121
+ Plugin::AMD::PrePassMode PrePassModeFromAMFH264(AMF_VIDEO_ENCODER_PREENCODE_MODE_ENUM v);
122
+ #endif
123
+
124
+ // GOP Type
125
+ #ifdef WITH_HEVC
126
+ const char* GOPTypeToString(Plugin::AMD::H265::GOPType v);
127
+ Plugin::AMD::H265::GOPType GOPTypeFromAMFH265(int64_t v);
128
+ int64_t GOPTypeToAMFH265(Plugin::AMD::H265::GOPType v);
129
+ #endif
130
+
131
+ // Slicing
132
+ #ifdef WITH_AVC
133
+ const char* SliceModeToString(Plugin::AMD::H264::SliceMode v);
134
+ #endif
135
+ const char* SliceControlModeToString(Plugin::AMD::SliceControlMode v);
136
+
137
+ #ifdef WITH_AVC
138
+ Plugin::AMD::ProfileLevel H264ProfileLevel(std::pair<uint32_t, uint32_t> resolution, std::pair<uint32_t, uint32_t> frameRate);
139
+ #endif
140
+ #ifdef WITH_HEVC
141
+ Plugin::AMD::ProfileLevel H265ProfileLevel(std::pair<uint32_t, uint32_t> resolution, std::pair<uint32_t, uint32_t> frameRate);
142
+ #endif
143
+
144
+ //////////////////////////////////////////////////////////////////////////
145
+ // Threading Specific
146
+ //////////////////////////////////////////////////////////////////////////
147
+
148
+ #if (defined _WIN32) || (defined _WIN64)
149
+ void SetThreadName(uint32_t dwThreadID, const char* threadName);
150
+ void SetThreadName(const char* threadName);
151
+ void SetThreadName(std::thread* pthread, const char* threadName);
152
+ #else
153
+ void SetThreadName(std::thread* pthread, const char* threadName);
154
+ void SetThreadName(const char* threadName);
155
+ #endif
156
+}
157
\ No newline at end of file
158
obs-studio-18.0.1.tar.xz/plugins/enc-amf/LICENSE -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/LICENSE
Changed
9
1
2
The MIT License (MIT)
3
4
-Copyright (c) 2016
5
+Copyright (c) 2016-2017 Michael Fabian Dirks
6
7
Permission is hereby granted, free of charge, to any person obtaining a copy
8
of this software and associated documentation files (the "Software"), to deal
9
obs-studio-18.0.1.tar.xz/plugins/enc-amf/README.md -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/README.md
Changed
127
1
2
-This is a plugin for OBS Studio that enables almost fully native hardware encoding instead of passing things off to Media Foundation Transform which is known to have issues with some certain settings. The plugin is based on the new AMF SDK and thus will work with any future driver releases.
3
+# What is this?
4
+This is a plugin for the [Open Broadcaster Software](https://obsproject.com/) project that adds support for AMD Hardware Encoding through the use of [AMDs Advanced Media Framework](https://github.com/GPUOpen-LibrariesAndSDKs/AMF).
5
6
-[Read More on the Wiki](https://github.com/Xaymar/obs-studio_amf-encoder-plugin/wiki)
7
+Starting with Open Broadcaster Studio Version 0.16.2, this Plugin replaced the old Media Foundation Transform based approach (which causes issues and slowness). Due to this, Open Broadcaster Software Studio is now a better choice than the old Open Broadcaster Software Classic VCE branch.
8
9
-## Contributing
10
+## Requirements
11
+The plugin requires that you have a supported AMD GPU and have the following installed and updated to the latest version:
12
13
-Read [CONTRIBUTING.md](https://github.com/Xaymar/obs-studio_amf-encoder-plugin/blob/master/CONTRIBUTING.md) for a guide on how to start.
14
+* [Visual Studio 2015 Redistributables](https://www.microsoft.com/en-us/download/details.aspx?id=48145)
15
+* [AMD Graphics Driver](https://support.amd.com/en-us/download)
16
+* [Open Broadcaster Software Studio](https://obsproject.com/download#mp)
17
+* [AMD Advanced Media Framework Plugin](https://github.com/Xaymar/obs-studio_amf-encoder-plugin/tags)
18
19
-# Contributors
20
-These people have helped (in one way or another) making this project possible. Without them, this project would have most likely not been where it is.
21
+# Read More
22
23
-| Who | What |
24
-| --- | ---- |
25
-| [Jim](https://github.com/jp9000) | Origin of the Open Broadcaster Software, provided support for development questions. |
26
-| [jackun](http://github.com/jackun) | The awesome person that started it all with his own Classic and Studio fork.<br>Thanks to him this project even exists today. |
27
-| [Xaymar](http://github.com/Xaymar) | Just the guy who spent a week staring at his monitors, trying to figure out how to make it work. |
28
-| GolDAce | CrowdIn integration. |
29
-| [leporel](https://github.com/leporel) | Provided ru-RU language files (Russian) |
30
-| [max20091](https://github.com/max20091) | Provided vi-VN language files (Vietnamese) |
31
-| [M4RK22](https://github.com/M4RK22) | Provided es-ES language files (Spanish) |
32
-| [niteforce](https://github.com/niteforce) | Provided hu-HU language files (Hungarian) |
33
-| [nwgat](https://github.com/nwgat) | Provided nb-NO language files (Norwegian) |
34
-| [wazerstar](https://github.com/wazerstar) | Provided da-DK language files (Danish) |
35
-| AMD | Providing Media SDK and later providing the AMF SDK. Also for incredibly fast fixing of bugs. |
36
-
37
-## The Amazing Supporters
38
-Special thanks go out to those that have either donated to the project directly or have decided to put some of their spare money into [my Patreon](https://patreon.com/xaymar). You guys rock!
39
-
40
-**[Jim](https://github.com/jp9000)**
41
-Basically created the entire OBS project, without him it wouldn't even be here.
42
-
43
-**Kytos/M4RK22** <!-- https://www.patreon.com/user?u=3762404 -->
44
-Im happy to support a nice recording plugin for AMD users.
45
-Patron: 2016 August-November
46
-[Website](https://markitos.ovh), [Steam](http://steamcommunity.com/id/markitos22/)
47
-
48
-**nwgat.ninja** <!-- https://www.patreon.com/user?u=2885495 -->
49
-nwgat.ninja is proud to support Xaymars Technology Projects.
50
-Patron: 2016 August-November
51
-[Website](https://nwgat.ninja)
52
-
53
-**Mattheus Wiegand**
54
-Patron: 2016 August, September
55
-[Twitter](https://twitter.com/Morphy2k/), [GitHub](https://github.com/Morphy2k)
56
-
57
-**Jeremy "razorlikes" Nieth** <!-- https://www.patreon.com/user?u=2463662 -->
58
-I like to support this project because it gives me a way to stream without having to sacrifice immense amounts of cpu resources for encoding.
59
-Patron: 2016 August-November
60
-[Twitch](https://twitch.tv/razorlikes), [GitHub](https://github.com/razorlikes)
61
-
62
-**Kristian Kirkesæther** <!-- https://www.patreon.com/user?u=3963961 -->
63
-Patron: 2016 September-November
64
-
65
-**vektorDex** <!-- https://www.patreon.com/vDex -->
66
-Patron: 2016 September-November
67
-[Website](http://blog-of-dex.de/), [Twitter](https://twitter.com/vektordex), [Studio](http://digitaldawnstudios.com)
68
-
69
-**AJ** <!-- https://www.patreon.com/user?u=3931856 -->
70
-Patron: 2016 September-November
71
-
72
-**SneakyJoe** <!-- https://www.patreon.com/sneaky4oe -->
73
-Russian streamer and stream teacher, AMD fanboy. Wants to make AMD great again.
74
-Patron: 2016 September-November
75
-[Website](http://sneakyjoe.ru/), [YouTube](https://www.youtube.com/channel/UCUmRv5GwQcsnxXRzuPCGr-Q)
76
-
77
-**Nicholas Kreimeyer** <!-- https://www.patreon.com/user?u=280867 -->
78
-Patron: 2016 October, November
79
-
80
-**noext** <!-- https://www.patreon.com/user?u=3209509 -->
81
-Patron: 2016 October
82
-
83
-**John Difool** <!-- https://www.patreon.com/user?u=3972864 -->
84
-John Difool der alte Sack
85
-Patron: 2016 October, November
86
-[YouTube](https://www.youtube.com/channel/UC5FPsFLQh4ah0-vz-eoZlOA)
87
-
88
-**DaOrgest** <!-- https://www.patreon.com/daorgest -->
89
-Currently studying computer and I do YouTube for a hobby
90
-Patron: 2016 September-November
91
-[Website](http://daorgest.me), [YouTube](http://youtube.com/daorgest)
92
-
93
-**Nucu** <!-- https://www.patreon.com/user?u=187366 -->
94
-Thanks AMD and Xaymar to make hardware encoding possible.
95
-Patron: 2016 August-November
96
-
97
-**Daniel Bagge** <!-- https://www.patreon.com/user?u=2457937 -->
98
-Patron: 2016 September-November
99
-
100
-**Cihangir Ceviren** <!-- https://www.patreon.com/user?u=4509018 -->
101
-Patron: 2016 November
102
-
103
-# MIT License
104
-
105
-Copyright (c) 2016 Michael Fabian Dirks
106
-
107
-Permission is hereby granted, free of charge, to any person obtaining a copy
108
-of this software and associated documentation files (the "Software"), to deal
109
-in the Software without restriction, including without limitation the rights
110
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
111
-copies of the Software, and to permit persons to whom the Software is
112
-furnished to do so, subject to the following conditions:
113
-
114
-The above copyright notice and this permission notice shall be included in all
115
-copies or substantial portions of the Software.
116
-
117
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
118
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
119
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
120
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
121
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
122
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
123
-SOFTWARE.
124
\ No newline at end of file
125
+You can [read more about it on the Wiki](https://github.com/Xaymar/obs-studio_amf-encoder-plugin/wikis/home)!
126
\ No newline at end of file
127
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/ca-ES.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/ca-ES.ini
Changed
201
1
2
-AMF.Util.Default="Per defecte"
3
-AMF.Util.Automatic="Automàtic"
4
-AMF.Util.Manual="Manual"
5
-AMF.Util.Toggle.Disabled="Desactivat"
6
-AMF.Util.Toggle.Enabled="Activat"
7
-AMF.H264.Preset="Configuració preestablerta"
8
-AMF.H264.Preset.ResetToDefaults="Restableix als valors per defecte"
9
-AMF.H264.Preset.Recording="S'està enregistrant"
10
-AMF.H264.Preset.HighQuality="Alta qualitat"
11
-AMF.H264.Preset.Indistinguishable="Indistinguible"
12
-AMF.H264.Preset.Lossless="Sense pèrdues"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Ús"
16
-AMF.H264.Usage.Description="Quin ús s'ha d'ajustar AMF:\n- 'Codificació' és per a ús generalitzat (recomanat),\n- 'Latència Ultra Baixa' és per a una codificació de molt baixa latència,\n- 'Latència Baixa' és similar a l'anterior amb alguna cosa mes de latència.\nLes retransmissions en directe només suporten 'Codificació', tots els valors poden ser utilitzats per a enregistrar."
17
-AMF.H264.Usage.Transcoding="Transcodificació"
18
-AMF.H264.Usage.UltraLowLatency="Latència ultra baixa"
19
-AMF.H264.Usage.LowLatency="Latència baixa"
20
-AMF.H264.QualityPreset="Qualitat del perfil"
21
-AMF.H264.QualityPreset.Description="Quina qualitat del perfil d'AMD s'ha d'intentar aconseguir:\n- 'Velocitat' és la més ràpida però la que pitjor qualitat obté,\n- 'Equilibrat' està entre 'Velocitat' i 'Qualitat' oferint un balanç entre els dos,\n- 'Qualitat' ofereix la millor qualitat possible per una determinada tassa de marcs."
22
-AMF.H264.QualityPreset.Speed="Velocitat"
23
-AMF.H264.QualityPreset.Balanced="Equilibrat"
24
-AMF.H264.QualityPreset.Quality="Qualitat"
25
-AMF.H264.Profile="Perfil"
26
-AMF.H264.Profile.Description="Quin perfil H.264 s'ha d'utilitzar per la codificació, ordenats de major qualitat al més suportat."
27
-AMF.H264.ProfileLevel="Nivell de perfil"
28
-AMF.H264.ProfileLevel.Description="Nivell de perfil H.264 a utilitzar per la codificació:\n- 'Automàtic' calcula el millor nivell de perfil per certa velocitat i mida de marcs,\n- '4.1' suporta 1920x1080 30FPS, 1280x720 60FPS, 960x540 90FPS\n- '4.2' suporta 1920x1080 60FPS, 1280x720 120FPS, 960x540 172FPS\n- '5.0' suporta 1920x1080 60FPS, 1280x720 144FPS, 960x540 172FPS\n- '5.1' suporta 3840x2160 30FPS, 1920x1080 120FPS, 1280x720 172FPS, 960x540 172FPS\n- '5.2' suporta 3840x2160 60FPS, 1920x1080 172FPS, 1280x720 172FPS, 960x540 172FPS"
29
-AMF.H264.RateControlMethod="Mètode de control del flux"
30
-AMF.H264.RateControlMethod.Description="Quin mètode de control de flux s'ha d'utilitzar:\n- '\@AMF.H264.RateControlMethod.CQP\@' assigna valors fixos de QP a I-/P-/B-Frames (Paràmetre de quantització),\n- '\@AMF.H264.RateControlMethod.CBR\@' es manté en la tassa de marcs objectiu (utilitzant dades de farciment) (recomanat per transmissions en directe),\n- '\@AMF.H264.RateControlMethod.VBR\@' es manté per sota d'un pic de tassa de marcs,\n- '\@AMF.H264.RateControlMethod.VBR_LAT\@' es manté prop de la tassa de marcs desitjada si la latència i carrega de la GPU ho permet, si no s'augmentarà la taxa de marcs (recomanat per a enregistraments)."
31
-AMF.H264.RateControlMethod.CQP="QP constant (CQP)"
32
-AMF.H264.RateControlMethod.CBR="Flux constant (CBR)"
33
-AMF.H264.RateControlMethod.VBR.Peak="Flux variable (pic restringit)(VBR)"
34
-AMF.H264.RateControlMethod.VBR.Latency="Flux variable (latència restringida) (VBR_LAT)"
35
-AMF.H264.Bitrate.Target="Tassa de bits desitjada"
36
-AMF.H264.Bitrate.Target.Description="Tassa de marcs a intentar arribar a la seqüència general."
37
-AMF.H264.Bitrate.Peak="Pic de tassa de bits"
38
-AMF.H264.Bitrate.Peak.Description="Tassa de marcs a intentar aconseguir com pic màxim en la seqüència general."
39
-AMF.H264.QP.Minimum="QP mínim"
40
-AMF.H264.QP.Minimum.Description="Valor mínim de QP (paràmetre de quantització) a utilitzar en un fotograma."
41
-AMF.H264.QP.Maximum="QP màxim"
42
-AMF.H264.QP.Maximum.Description="Valor màxim de QP (paràmetre de quantització) a utilitzar en un fotograma."
43
-AMF.H264.QP.IFrame="I-Frame QP"
44
-AMF.H264.QP.IFrame.Description="Valor fix de QP per I-Frames."
45
-AMF.H264.QP.PFrame="P-Frame QP"
46
-AMF.H264.QP.PFrame.Description="Valor fix de QP per P-Frames."
47
-AMF.H264.QP.BFrame="B-Frame QP"
48
-AMF.H264.QP.BFrame.Description="Valor de QP fix (paràmetre de quantització) a utilitzar per B-Frames."
49
-AMF.H264.VBVBuffer="Memòria intermèdia VBV"
50
-AMF.H264.VBVBuffer.Description="Quin mètode s'ha d'utilitzar per determinar la mida de la memòria intermèdia VBV:\n- 'Automàtic' calcula la mida utilitzant una restricció estricta,\n- 'Manual' permet a l'usuari controlar la mida.\nLa memòria intermèdia VBV (Verificador de la memòria intermèdia del vídeo) és usat per certs mètodes de control del flux per mantenir la taxa de bits dins dels paràmetres establerts."
51
-AMF.H264.VBVBuffer.Strictness="Rigorositat de la memòria intermèdia VBV"
52
-AMF.H264.VBVBuffer.Strictness.Description="Determina la rigidesa de la memòria intermèdia VBV, con 100% essent tant estricte com sigui possible i 0% sense restricció."
53
-AMF.H264.VBVBuffer.Size="Mida de la memòria intermèdia VBV"
54
-AMF.H264.VBVBuffer.Size.Description="La mida de la memòria intermèdia VBV que s'utilitza per al control de la tassa de marcs en una seqüencia."
55
-AMF.H264.VBVBuffer.Fullness="Amplitud de la memòria intermèdia VBV"
56
-AMF.H264.VBVBuffer.Fullness.Description="Com de ple és la memòria intermèdia VMV inicialment, només afectarà la seqüència inicial de la codificació."
57
-AMF.H264.FillerData="Dades a omplir"
58
-AMF.H264.FillerData.Description="En activar les dades de farciment es permet al codificador mantenir almenys la tassa de marcs desitjada omplint l'espai que falta amb informació sense valor."
59
-AMF.H264.FrameSkipping="Omissió de fotogrames"
60
-AMF.H264.FrameSkipping.Description="L'omissió de fotogrames permet al codificador saltar fotogrames per complir amb el requeriment de la tassa de marcs objectiu.\nQuan el codificador salta un fotograma inserirà una NAL que repetirà el darrer fotograma codificat a la transmissió.\nPot ajudar amb tassa de bits objectiu molt baixes."
61
-AMF.H264.EnforceHRDCompatibility="Força la compatibilitat amb HRD"
62
-AMF.H264.EnforceHRDCompatibility.Description="Força les restriccions del descodificador hipotètic de referència que limiten el canvi de valor màxim de QP dins d'un fotograma."
63
-AMF.H264.KeyframeInterval="Interval de fotogrames clau"
64
-AMF.H264.KeyframeInterval.Description="Quants segons han d'haver entre fotogrames que no es poden descartar.\nTambé controla la mida de la seqüència (GOP)."
65
-AMF.H264.IDRPeriod="Període IDR"
66
-AMF.H264.IDRPeriod.Description="Defineix la distància entre Instantaneous Decoding Refreshes (IDR) en fotogrames. També controla la mida de la seqüència del GOP."
67
-AMF.H264.BFrame.Pattern="B-Frames"
68
-AMF.H264.BFrame.Pattern.Description="La quantitat de B-Frames a utilitzar mestre es codifica.\nCompatible amb targetes de 2ª i 3ª generació VCE. Impacte negatiu en el rendiment de codificació."
69
-AMF.H264.BFrame.DeltaQP="Delta QP per B-Frames"
70
-AMF.H264.BFrame.DeltaQP.Description="Valor Delta QP per al darrer I- o P-Frame per B-Frames no referenciables."
71
-AMF.H264.BFrame.Reference="B-Frames referenciables"
72
-AMF.H264.BFrame.Reference.Description="Permet a un B-Frames utilitzar també B-Frames com referència, enlloc de P- i I-Frames."
73
-AMF.H264.BFrame.ReferenceDeltaQP="Delta QP per als fotogrames referenciables"
74
-AMF.H264.BFrame.ReferenceDeltaQP.Description="Valor Delta QP per al darrer I- o P-Frame per B-Frames referenciables."
75
-AMF.H264.DeblockingFilter="Filtre d'eliminació de blocs"
76
-AMF.H264.DeblockingFilter.Description="Estableix l'indicador que el descodificador està permès a utilitzar el Filtre d'eliminació de blocs per a la transmissió codificada."
77
-AMF.H264.ScanType="Tipus d'exploració"
78
-AMF.H264.ScanType.Description="Quin mètode de escaneig utilitzar, deixeu-lo sempre a '\@AMF.H264.ScanType.Progressive\@'."
79
-AMF.H264.ScanType.Progressive="Progressiu"
80
-AMF.H264.ScanType.Interlaced="Entrellaçat"
81
-AMF.H264.MotionEstimation="Estimació del moviment"
82
-AMF.H264.MotionEstimation.Description="L'estimació del moviment permet al codificador reduir el flux de dades necessari calculant d'on vénen els píxels."
83
-AMF.H264.MotionEstimation.None="Cap"
84
-AMF.H264.MotionEstimation.Half="Meitat de píxel"
85
-AMF.H264.MotionEstimation.Quarter="Quart de Píxel"
86
-AMF.H264.MotionEstimation.Both="Meitat i quart de píxel"
87
-AMF.H264.CodingType="Tipus de codificació"
88
-AMF.H264.CodingType.Description="Quin tipus de codificació utilitzar:\n* \@AMF.Util.Default\@ deixeu que AMF ho decideixi (recomanat).\n* CALVC (Context-Adaptive Variable-Length Coding) és més ràpid, però mes gran.\n* CABAC (Context-Adaptive Binary Arithmetic Coding) es més lent, però més petit."
89
+Utility.Default="Per defecte"
90
+Utility.Automatic="Automàtic"
91
+Utility.Manual="Manual"
92
+Utility.Switch.Disabled="Desactivat"
93
+Utility.Switch.Enabled="Activat"
94
+Preset="Configuració preestablerta"
95
+Preset.ResetToDefaults="Restableix als valors per defecte"
96
+Preset.Recording="S'està enregistrant"
97
+Preset.HighQuality="Alta qualitat"
98
+Preset.Indistinguishable="Indistinguible"
99
+Preset.Lossless="Sense pèrdues"
100
+Preset.Twitch="Twitch"
101
+Preset.YouTube="YouTube"
102
+Usage="Ús"
103
+Usage.Description="Quin ús s'ha d'ajustar AMF:\n- '\@Usage.Transcoding\@' és per a un ús generalitzat (recomanat),\n- '\@Usage.UltraLowLatency\@' és per a una codificació de molt baixa latència,\n- '\@Usage.LowLatency\@' és similar a l'anterior però amb una mica més de latència.\nLes emissions en directe només suporten '\@Usage.Transcoding\@', tots els valors poden ser usats per gravar."
104
+Usage.Transcoding="Transcodificació"
105
+Usage.UltraLowLatency="Latència ultra baixa"
106
+Usage.LowLatency="Latència baixa"
107
+Usage.Webcam="Càmera web"
108
+QualityPreset="Qualitat del perfil"
109
+QualityPreset.Description="Quina qualitat del perfil AMF s'ha d'intentar aconseguir:\n- '\@QualityPreset.Speed\@' és el més ràpid però té la pitjor qualitat, \n-'\@QualityPreset.Balanced\@' és una barreja equilibrada de tots dos,\n- '\@QualityPreset.Quality\@' dóna la millor qualitat per a un determinada taxa de bits."
110
+QualityPreset.Speed="Velocitat"
111
+QualityPreset.Balanced="Equilibrat"
112
+QualityPreset.Quality="Qualitat"
113
+Profile="Perfil"
114
+Profile.Description="Quin perfil s'ha d'utilitzar per a la codificació, ordenats des de el suport més estès a la més alta qualitat."
115
+ProfileLevel="Nivell de perfil"
116
+ProfileLevel.Description="Quin nivell de perfil s'ha d'utilitzar per a la codificació, el millor és deixar-ho això en \@Utility.Automatic\@"
117
+Tier="Nivell"
118
+Tier.Description="En quin nivell codificar, Main es la codificació normal, mentre que High s'enfoca en aplicacions d'alta velocitat de bits."
119
+AspectRatio="Relació d'aspecte"
120
+AspectRatio.Description="Quina relació d'aspecte s'ha d'escriure a l'arxiu de sortida."
121
+CodingType="Tipus de codificació"
122
+CodingType.Description="Quin tipus de codificació utilitzar:\n* '\@Utility.Automatic\@' deixeu que AMF ho decideixi (recomanat).\n* 'CALVC' (Context-Adaptive Variable-Length Coding) és més ràpid, però més gran.\n* 'CABAC' (Context-Adaptive Binary Arithmetic Coding) és més lent, però més petit."
123
+MaximumReferenceFrames="Fotogrames de referència màxims"
124
+MaximumReferenceFrames.Description="Quants quadres el codificador pot fer referència al màxim quan codifica, té un impacte directe en la qualitat de codificació."
125
+RateControlMethod="Mètode de control del flux"
126
+RateControlMethod.Description="Quin mètode de control de flux s'ha d'utilitzar:\n- '\@RateControlMethod.CQP\@' assigna valors fixos de QP a I-/P-/B-Frames,\n- '\@RateControlMethod.CBR\@' es manté en la taxa de bits objectiu (utilitzant dades de farciment) (recomanat per a emissions en directe),\n- '\@RateControlMethod.VBR\@' es manté per sota d'un pic de taxa de bits,\n- '\@RateControlMethod.VBRLAT\@' es manté prop de la taxa de bits desitjada si la latència i càrrega de la GPU ho permet, si no s'augmentarà la taxa de bits (recomanat per a enregistraments)."
127
+RateControlMethod.CQP="QP constant (CQP)"
128
+RateControlMethod.CBR="Flux constant (CBR)"
129
+RateControlMethod.VBR="Flux variable (pic restringit) (VBR)"
130
+RateControlMethod.VBRLAT="Flux variable (latència restringida) (VBR_LAT)"
131
+PrePassMode="Mode passada prèvia"
132
+PrePassMode.Description="La passada prèvia és una passada de distribució de taxa de bits secundària que permet una millor distribució de la taxa de bits dins d'una seqüència, però els efectes d'aquesta pot variar de targeta a targeta."
133
+PrePassMode.Quarter="\@Utility.Switch.Enabled\@ (1/4 de la mida)"
134
+PrePassMode.Half="\@Utility.Switch.Enabled\@ (1/2 de la mida)"
135
+PrePassMode.Full="\@Utility.Switch.Enabled\@ (mida completa)"
136
+Bitrate.Target="Tassa de bits desitjada"
137
+Bitrate.Target.Description="Tassa de bits a intentar arribar a la seqüència general."
138
+Bitrate.Peak="Pic de tassa de bits"
139
+Bitrate.Peak.Description="Tassa de bits a intentar aconseguir com a pic màxim en la seqüència general."
140
+QP.IFrame="I-Frame QP"
141
+QP.IFrame.Description="Valor fix de QP per I-Frames."
142
+QP.PFrame="P-Frame QP"
143
+QP.PFrame.Description="Valor fix de QP per P-Frames."
144
+QP.BFrame="B-Frame QP"
145
+QP.BFrame.Description="Valor fix de QP per B-Frames."
146
+QP.Minimum="QP mínim"
147
+QP.Minimum.Description="Valor QP mínim a utilitzar en un marc."
148
+QP.IFrame.Minimum="I-Frame QP mínim"
149
+QP.IFrame.Minimum.Description="Valor QP mínim a utilitzar en un I-Frame."
150
+QP.PFrame.Minimum="P-Frame QP mínim"
151
+QP.PFrame.Minimum.Description="Valor QP mínim a utilitzar en un P-Frame."
152
+QP.Maximum="QP màxim"
153
+QP.Maximum.Description="Valor QP màxim a utilitzar en un marc."
154
+QP.IFrame.Maximum="I-Frame QP màxim"
155
+QP.IFrame.Maximum.Description="Valor QP màxim a utilitzar en un I-Frame."
156
+QP.PFrame.Maximum="P-Frame QP màxim"
157
+QP.PFrame.Maximum.Description="Valor QP màxim a utilitzar en un P-Frame."
158
+FillerData="Dades de farciment"
159
+FillerData.Description="En activar les dades de farciment es permet al codificador mantenir almenys \@Bitrate.Target\@ omplint l'espai que falta amb informació sense valor."
160
+FrameSkipping="Omissió de fotogrames"
161
+FrameSkipping.Description="L'omissió de fotogrames permet al codificador saltar fotogrames per complir amb el requeriment de la\@Bitrate.Target\@.\nQuan el codificador salta un fotograma inserirà una NAL que repetirà l'últim fotograma codificat a la transmissió.\nPot ajudar amb \@Bitrate.Target\@ molt baixes."
162
+VBAQ="VBAQ"
163
+VBAQ.Description="En activar l'ús de 'Quantització adaptativa basada en la variació' (VBAQ) que es basa en la variació del pixel per a una millor distribució de la taxa de bits. \nFunciona amb la idea que el sistema visual humà és menys sensible als artefactes en àrees altament texturades i així mourà la tassa de bits cap a superfícies més suaus. \nEn activar-lo pot portar a millores en la qualitat subjectiva en cert contingut."
164
+EnforceHRD="Força l'HRD"
165
+EnforceHRD.Description="Força l'ús d'un descodificador de referència hipotètic que s'utilitza per verificar que el flux de marcs de sortida es correcte."
166
+VBVBuffer="Memòria intermèdia VBV"
167
+VBVBuffer.Description="Quin mètode s'ha d'utilitzar per determinar la mida de la memòria intermèdia VBV:\n- '\@Utlity.Automatic\@' calcula la mida utilitzant una restricció estricta,\n- '\@Utlity.Manual\@' permet a l'usuari controlar la mida.\nLa memòria intermèdia VBV (Verificador de la memòria intermèdia del vídeo) és usat per certs mètodes de control del flux per mantenir la taxa de bits dins dels paràmetres establerts."
168
+VBVBuffer.Strictness="Rigorositat de la memòria intermèdia VBV"
169
+VBVBuffer.Strictness.Description="Determina la rigidesa de la memòria intermèdia VBV, con 100% essent tant estricte com sigui possible i 0% sense restricció."
170
+VBVBuffer.Size="Mida de la memòria intermèdia VBV"
171
+VBVBuffer.Size.Description="La mida de la memòria intermèdia VBV que s'utilitza per al control de la tassa de marcs en una seqüencia."
172
+VBVBuffer.InitialFullness="Amplitud inicial de la memòria intermèdia VBV"
173
+VBVBuffer.InitialFullness.Description="Com de ple és la memòria intermèdia VMV inicialment (en %), només afectarà la seqüència inicial de la codificació."
174
+KeyframeInterval="Interval de fotogrames clau"
175
+KeyframeInterval.Description="Interval (en segons) entre fotogrames clau."
176
+H264.IDRPeriod="Període IDR (en marcs)"
177
+H264.IDRPeriod.Description="Defineix la distància entre Instantaneous Decoding Refreshes (IDR) en fotogrames. També controla la mida de la seqüència del GOP."
178
+H265.IDRPeriod="Període IDR (en GOPs)"
179
+H265.IDRPeriod.Description="Defineix la distància entre actualitzacions de descodificació instantània (IDR) en GOPs."
180
+GOP.Type="Tipus de GOP"
181
+GOP.Type.Description="Quin tipus de GOP s'ha d'utilitzar: \n - ' \@GOP. Type.Fixed\@' utilitzarà sempre distàncies fixes entre cada GOP. \n - ' \@GOP. Type.Variable\@' permet GOPs de diferents mides, depenent del que es necessiti.\n'\@GOP. Type.Fixed\@' és com els treballs d'implementació H264 i el millor per a les transmissions de xarxa local, mentre que ' \@GOP. Type.Variable\@' és el millor per a enregistraments d'alta qualitat i de baix grandària."
182
+GOP.Type.Fixed="Fix"
183
+GOP.Type.Variable="Variable"
184
+GOP.Size="Mida del GOP"
185
+GOP.Size.Description="Mida del GOP (grup d'imatges) en marcs."
186
+GOP.Size.Minimum="Mida mínima del GOP"
187
+GOP.Size.Minimum.Description="Mida mínima del GOP (grup d'imatges) en marcs."
188
+GOP.Size.Maximum="Mida màxima del GOP"
189
+GOP.Size.Maximum.Description="Mida màxima del GOP (grup d'imatges) en marcs."
190
+GOP.Alignment="Alineació del GOP"
191
+GOP.Alignment.Description="Experimental, els efectes són desconeguts. Utilitzeu-lo sota la vostra responsabilitat."
192
+BFrame.Pattern="Patró B-Frame"
193
+BFrame.Pattern.Description="La quantitat de B-Frames a utilitzar mestre es codifica.\nCompatible amb targetes de 2ª i 3ª generació VCE. Impacte negatiu en el rendiment de codificació."
194
+BFrame.DeltaQP="B-Frame Delta QP"
195
+BFrame.DeltaQP.Description="Valor Delta QP per al darrer I- o P-Frame per B-Frames no referenciables."
196
+BFrame.Reference="Referència B-Frame"
197
+BFrame.Reference.Description="Permet a un B-Frames utilitzar també B-Frames com referència, enlloc de P- i I-Frames."
198
+BFrame.ReferenceDeltaQP="Referència B-Frame Delta QP"
199
+BFrame.ReferenceDeltaQP.Description="Valor Delta QP per al darrer I- o P-Frame per B-Frames referenciables."
200
+DeblockingFilter="Filtre d'eliminació de blocs"
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/cs-CZ.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/cs-CZ.ini
Changed
92
1
2
-AMF.Util.Default="Výchozí"
3
-AMF.Util.Automatic="Automatické"
4
-AMF.Util.Manual="Manuální"
5
-AMF.Util.Toggle.Disabled="Zakázáno"
6
-AMF.Util.Toggle.Enabled="Povoleno"
7
-AMF.H264.Preset="Profil"
8
-AMF.H264.Preset.ResetToDefaults="Obnovit výchozí"
9
-AMF.H264.Preset.Recording="Nahrávání"
10
-AMF.H264.Preset.HighQuality="Vysoká kvalita"
11
-AMF.H264.Preset.Indistinguishable="Nerozeznatelné"
12
-AMF.H264.Preset.Lossless="Lossless"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Využití"
16
-AMF.H264.Usage.Transcoding="Kódování"
17
-AMF.H264.Usage.UltraLowLatency="Ultra nízká odezva"
18
-AMF.H264.Usage.LowLatency="Nízká odezva"
19
-AMF.H264.QualityPreset="Profil kvality"
20
-AMF.H264.QualityPreset.Speed="Rychlost"
21
-AMF.H264.QualityPreset.Balanced="Vyváženo"
22
-AMF.H264.QualityPreset.Quality="Kvalita"
23
-AMF.H264.Profile="Profil"
24
-AMF.H264.ProfileLevel="Úroveň profilu"
25
-AMF.H264.RateControlMethod="Metoda řízení"
26
-AMF.H264.RateControlMethod.CQP="Konstantní QP (CQP)"
27
-AMF.H264.RateControlMethod.CBR="Konstantní bitrate (CBR)"
28
-AMF.H264.RateControlMethod.VBR.Peak="Proměnný bitrate (vázán špičkou) (VBR)"
29
-AMF.H264.RateControlMethod.VBR.Latency="Proměnný bitrate (vázán odezvou) (VBR_LAT)"
30
-AMF.H264.Bitrate.Target="Cílový bitrate"
31
-AMF.H264.Bitrate.Target.Description="Bitrate, kterého se máme snažit dosáhnout v celé sekvenci."
32
-AMF.H264.Bitrate.Peak="Špičkový bitrate"
33
-AMF.H264.Bitrate.Peak.Description="Bitrate, kterého se máme snažit nepřekročit v celé sekvenci."
34
-AMF.H264.QP.Minimum="Minimální QP"
35
-AMF.H264.QP.Maximum="Maximální QP"
36
-AMF.H264.QP.IFrame="I-Frame QP"
37
-AMF.H264.QP.IFrame.Description="Pevná hodnota QP používaná pro I-Frames."
38
-AMF.H264.QP.PFrame="P-Frame QP"
39
-AMF.H264.QP.PFrame.Description="Pevná hodnota QP používaná pro P-Frames."
40
-AMF.H264.QP.BFrame="B-Frame QP"
41
-AMF.H264.QP.BFrame.Description="Pevná hodnota QP používaná pro B-Frames."
42
-AMF.H264.VBVBuffer="VBV Buffer"
43
-AMF.H264.FillerData="Filtrovat data"
44
-AMF.H264.FrameSkipping="Přeskakování snímků"
45
-AMF.H264.EnforceHRDCompatibility="Vynutit kompatibilitu s HRD"
46
-AMF.H264.KeyframeInterval="Interval klíčový snímků"
47
-AMF.H264.KeyframeInterval.Description="Kolik vteřin by mělo být mezi ne-zahazovatelnými snímky.\nTaké ovládá velikost sekvence(GOP)."
48
-AMF.H264.ScanType="Typ skenování"
49
-AMF.H264.ScanType.Description="Určuje použitou metodu skenování, vždy ponechejte na 'Progresivní'."
50
-AMF.H264.ScanType.Progressive="Progresivní"
51
-AMF.H264.ScanType.Interlaced="Prokládané"
52
-AMF.H264.MotionEstimation="Odhad pohybu"
53
-AMF.H264.MotionEstimation.Description="Odhad pohybu umožňuje enkodéru snížit požadovaný bitrate předpovídáním, kam se určitý pixel posunul."
54
-AMF.H264.MotionEstimation.None="Žádný"
55
-AMF.H264.MotionEstimation.Half="Polovina pixelu"
56
-AMF.H264.MotionEstimation.Quarter="Čtvrtina pixelu"
57
-AMF.H264.MotionEstimation.Both="Polovina & čtvrtina pixelu"
58
+Utility.Default="Výchozí"
59
+Utility.Automatic="Automatické"
60
+Utility.Manual="Manuální"
61
+Utility.Switch.Disabled="Zakázáno"
62
+Utility.Switch.Enabled="Povoleno"
63
+Preset="Profil"
64
+Preset.ResetToDefaults="Obnovit výchozí"
65
+Preset.Recording="Nahrávání"
66
+Preset.HighQuality="Vysoká kvalita"
67
+Preset.Twitch="Twitch"
68
+Preset.YouTube="YouTube"
69
+Usage="Využití"
70
+Usage.UltraLowLatency="Ultra nízká odezva"
71
+Usage.Webcam="Webkamera"
72
+QualityPreset.Balanced="Vyvážený"
73
+QualityPreset.Quality="Kvalita"
74
+Profile="Profil"
75
+ProfileLevel="Úroveň profilu"
76
AMF.H264.MaximumLTRFrames="Maximální počet LTR snímků"
77
-AMF.H264.VideoAPI="Grafické rozhraní (API)"
78
-AMF.H264.VideoAPI.Description="Které rozhraní má být použito pro kódování."
79
-AMF.H264.VideoAdapter="Grafický adaptér"
80
-AMF.H264.VideoAdapter.Description="Adaptér, který má být použit pro kódování."
81
-AMF.H264.OpenCL="OpenCL"
82
-AMF.H264.OpenCL.Description="Má být použit OpenCL pro vkládání jednotlivých snímků?"
83
-AMF.H264.View="Režim zobrazení"
84
-AMF.H264.View.Description="Které možnosti mají být zobrazeny. Nezískáte žádnou pomoc při použití módu 'Expert' či 'Master'."
85
-AMF.H264.View.Basic="Základní"
86
-AMF.H264.View.Advanced="Pokročilý"
87
-AMF.H264.View.Expert="Expert"
88
-AMF.H264.View.Master="Master"
89
-AMF.H264.Debug="Ladění"
90
-AMF.H264.Debug.Description="Zapne rozšířené protokolování, mělo by být zapnuto, pokud pořebujete pomoci s tmto enkodérem."
91
92
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/da-DK.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/da-DK.ini
Changed
71
1
2
-AMF.Util.Default="Standard"
3
-AMF.Util.Automatic="Automatisk"
4
-AMF.Util.Manual="Manuelt"
5
-AMF.Util.Toggle.Disabled="Deaktiveret"
6
-AMF.Util.Toggle.Enabled="Aktiveret"
7
-AMF.H264.Preset="Forudindstillinger"
8
-AMF.H264.Preset.ResetToDefaults="Nulstil til standarder"
9
-AMF.H264.Preset.Recording="Optagelse"
10
-AMF.H264.Preset.HighQuality="Højkvalitet"
11
-AMF.H264.Preset.Indistinguishable="Indistingverbar"
12
-AMF.H264.Preset.Lossless="Tabsfri"
13
-AMF.H264.Preset.YouTube="YouTube"
14
-AMF.H264.Usage="Anvendelse"
15
-AMF.H264.Usage.Description="Hvilken anvendelse AMF bør indstilles til:\n- '\@AMF.H264.Usage.Transcoding\@' er omkodning til generelle formål (anbefalet),\n - '\@AMF.H264.Usage.UltraLowLatency\@' er til virkelig lav-forsinkelseskodning,\n- '\@AMF.H264.Usage.LowLatency\@' er tilsvarende ovennævnte med en lidt større forsinkelse.\nStreaming understøtter kun '\@AMF.H264.Usage.Transcoding\@', alle andre værdier kan benyttes til optagelse."
16
-AMF.H264.Usage.Transcoding="Transcoding"
17
-AMF.H264.Usage.UltraLowLatency="Ekstrem Lav Ventetid"
18
-AMF.H264.Usage.LowLatency="Lav Ventetid"
19
-AMF.H264.QualityPreset="Kvalitets profiler"
20
-AMF.H264.QualityPreset.Description="Hvilken Kvalitetsforudindstilling AMF bør forsøges målrettet imod:\n- '\@AMF. H264. QualityPreset.Speed\@' er den hurtigste, men har den ringeste kvalitet,\n- '\@AMF. H264. QualityPreset.Balanced\@' er en balanceret blanding af begge,\n- '\@AMF. H264. QualityPreset.Quality\@' giver den bedste kvalitet for en given bithastighed."
21
-AMF.H264.QualityPreset.Speed="Hastighed (Dårligste kvalitet)"
22
-AMF.H264.QualityPreset.Balanced="Balanceret (Mellem Kvalitet)"
23
-AMF.H264.QualityPreset.Quality="Kvalitet (Bedste Kvalitet)"
24
-AMF.H264.Profile="Profil"
25
-AMF.H264.Profile.Description="Hvilken H.264-profil at benytte til kodning, sorteret fra højeste kvalitet til mest udbredte understøttelse."
26
-AMF.H264.ProfileLevel="Profil Niveau"
27
-AMF.H264.ProfileLevel.Description="Hvilket H.264-profilniveau at benytte til kodning:\n- ' \@AMF. Util.Automatic\@' beregner det best profilniveau for en given billedhastighed og -størrelse,\n- '4.1' understøtter 1920x1080 30FPS, 1280x720 60FPS, 960x540 90FPS\n- '4.2' understøtter 1920x1080 60FPS, 1280x720 120FPS, 960x540 172FPS\n- '5.0' understøtter 1920x1080 60FPS, 1280x720 144FPS, 960x540 172FPS\n- '5.1' understøtter 3840x2160 30FPS, 1920x1080 120FPS, 1280x720 172FPS, 960x540 172FPS\n- '5.2' understøtter 3840x2160 60FPS, 1920x1080 172FPS, 1280x720 172FPS, 960 x 540 172 FPS"
28
-AMF.H264.RateControlMethod="Rate Control Method"
29
-AMF.H264.RateControlMethod.CQP="Constant QP (CQP)"
30
-AMF.H264.RateControlMethod.CBR="Constant Bitrate (CBR)"
31
-AMF.H264.RateControlMethod.VBR.Peak="Variable Bitrate (Peak Constrained) (VBR)"
32
-AMF.H264.RateControlMethod.VBR.Latency="Variable Bitrate (Latency Constrained) (VBR_LAT)"
33
-AMF.H264.Bitrate.Target="Mål Bitrate"
34
-AMF.H264.Bitrate.Peak="Top Bitrate"
35
-AMF.H264.QP.Minimum="Minimum QP"
36
-AMF.H264.QP.Maximum="Maksimum QP"
37
-AMF.H264.QP.IFrame="I-Frame QP"
38
-AMF.H264.QP.PFrame="P-Frame QP"
39
-AMF.H264.QP.BFrame="B-Frame QP"
40
-AMF.H264.FillerData="Filler Data"
41
-AMF.H264.FrameSkipping="Billede skip"
42
-AMF.H264.EnforceHRDCompatibility="Tving HRD Kompatibilitet"
43
-AMF.H264.DeblockingFilter="Deblocking Filter"
44
-AMF.H264.ScanType="Scan Type"
45
-AMF.H264.ScanType.Progressive="Progressive"
46
-AMF.H264.ScanType.Interlaced="Interlaced"
47
+Utility.Default="Standard"
48
+Utility.Automatic="Automatisk"
49
+Utility.Manual="Manuel"
50
+Utility.Switch.Disabled="Deaktiveret"
51
+Utility.Switch.Enabled="Aktiveret"
52
+Preset="Forudindstillinger"
53
+Preset.ResetToDefaults="Nulstil til standarder"
54
+Preset.Recording="Optagelse"
55
+Preset.HighQuality="Høj kvalitet"
56
+Preset.Indistinguishable="Ingen forskel"
57
+Preset.Lossless="Tabsfri"
58
+Preset.Twitch="Twitch"
59
+Preset.YouTube="YouTube"
60
+Usage="Brug"
61
+Usage.Transcoding="Transcoding"
62
+Usage.UltraLowLatency="Ultra lav latenstid"
63
+Usage.LowLatency="Lav latenstid"
64
+Usage.Webcam="Webcam"
65
+QualityPreset="Kvalitets profiler"
66
+QualityPreset.Speed="Hastighed"
67
+QualityPreset.Balanced="Balanceret"
68
+QualityPreset.Quality="Kvalitet"
69
+Profile="Profil"
70
71
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/de-DE.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/de-DE.ini
Changed
201
1
2
-AMF.Util.Default="Standard"
3
-AMF.Util.Automatic="Automatisch"
4
-AMF.Util.Manual="Manuell"
5
-AMF.Util.Toggle.Disabled="Deaktiviert"
6
-AMF.Util.Toggle.Enabled="Aktiviert"
7
-AMF.H264.Preset="Voreinstellungen"
8
-AMF.H264.Preset.ResetToDefaults="Standardeinstellungen wiederherstellen"
9
-AMF.H264.Preset.Recording="Aufnahme"
10
-AMF.H264.Preset.HighQuality="Hohe Qualität"
11
-AMF.H264.Preset.Indistinguishable="Ununterscheidbar"
12
-AMF.H264.Preset.Lossless="Verlustfrei"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Nutzungsart"
16
-AMF.H264.Usage.Description="Auf welche Nutzungsart AMF eingestellt werden soll:\n- '\@AMF.H264.Usage.Transcoding\@' für generelle Codierung (empfohlen),\n- '\@AMF.H264.Usage.UltraLowLatency\@' für Codierung mit sehr niedriger Latenz,\n- '\@AMF.H264.Usage.LowLatency\@' ist ähnlich dem oberen mit leicht erhöhter Latenz.\nNur '\@AMF.H264.Usage.Transcoding\@' wird für das Streamen unterstützt, alle anderen können für Aufnahmen verwendet werden."
17
-AMF.H264.Usage.Transcoding="Umwandeln"
18
-AMF.H264.Usage.UltraLowLatency="Sehr Niedrige Latenz"
19
-AMF.H264.Usage.LowLatency="Niedrige Latenz"
20
-AMF.H264.QualityPreset="Qualitätsvoreinstellung"
21
-AMF.H264.QualityPreset.Description="Welche Qualitätsvoreinstellungen AMF versuchen soll zu verwenden:\n- '\@AMF.H264.QualityPreset.Speed\@' ist die schnellste aber hat die schlechteste Qualität,\n- '\@AMF.H264.QualityPreset.Balanced\@' ist ein balancierter Mix aus beiden,\n- '\@AMF.H264.QualityPreset.Quality\@' gibt die beste Qualität für eine gegebene Bitrate."
22
-AMF.H264.QualityPreset.Speed="Geschwindigkeit"
23
-AMF.H264.QualityPreset.Balanced="Ausgeglichen"
24
-AMF.H264.QualityPreset.Quality="Qualität"
25
-AMF.H264.Profile="Profil"
26
-AMF.H264.Profile.Description="Welches H.264 Profil soll für die Kodierung verwendet werden, sortiert von höchster Qualität bis am weitesten verbeiteten Unterstützung."
27
-AMF.H264.ProfileLevel="Profillevel"
28
-AMF.H264.ProfileLevel.Description="Welches H.264 Profil Level für das verarbeiten verwendet werden soll:\n- '\@AMF.Util.Automatic\@' errechnet das beste Profil Level für die gegebene Frame Rate und Frame Größe,\n- '4.1' unterstützt 1920x1080 30FPS, 1280x720 60FPS, 960x540 90FPS\n- '4.2' unterstützt 1920x1080 60FPS, 1280x720 120FPS, 960x540 172FPS\n- '5.0' unterstützt 1920x1080 60FPS, 1280x720 144FPS, 960x540 172FPS\n- '5.1' unterstützt 3840x2160 30FPS, 1920x1080 120FPS, 1280x720 172FPS, 960x540 172FPS\n- '5.2' unterstützt 3840x2160 60FPS, 1920x1080 172FPS, 1280x720 172FPS, 960x540 172FPS"
29
-AMF.H264.RateControlMethod="Ratenkontrollmethode"
30
-AMF.H264.RateControlMethod.Description="Welche Ratenkontrollmethode verwendet werden soll:\n- '\@AMF.H264.RateControlMethod.CQP\@' setzt feste QP (Quantifizierungsparameter) Werte für I-/P-/B- Bilder,\n- '\@AMF.H264.RateControlMethod.CBR\@' bleibt auf der Zielbitrate (mithilfe von Füllungsdaten) (empfohlen für das Streamen),\n- '\@AMF.H264.RateControlMethod.VBR\@' bleibt unter der Spitzenbitrate,\n- '\@AMF.H264.RateControlMethod.VBR_LAT\@' bleibt nahe der Zielbitrate sofern GPU-Latenz und GPU-Benutzung dies erlauben, ansonsten wird eine höhere Bitrate verwendet (empfohlen für Aufnahmen)."
31
-AMF.H264.RateControlMethod.CQP="Konstante QP (CQP)"
32
-AMF.H264.RateControlMethod.CBR="Konstante Bitrate (CBR)"
33
-AMF.H264.RateControlMethod.VBR.Peak="Variable Bitrate (Eingeschränkt via Spitzenbitrate) (VBR)"
34
-AMF.H264.RateControlMethod.VBR.Latency="Variable Bitrate (Eingeschränkt via Latenz) (VBR_LAT)"
35
-AMF.H264.Bitrate.Target="Zielbitrate"
36
-AMF.H264.Bitrate.Target.Description="Zielbitrate die in der ganzen Sequenz erreicht werden soll."
37
-AMF.H264.Bitrate.Peak="Spitzenbitrate"
38
-AMF.H264.Bitrate.Peak.Description="Spitzenbitrate die in der ganzen Sequenz erreicht werden darf."
39
-AMF.H264.QP.Minimum="Minimale QP"
40
-AMF.H264.QP.Minimum.Description="Niedrigster QP (Quantifizierungsparameter) wert der in einem Bild verwendet wird."
41
-AMF.H264.QP.Maximum="Maximale QP"
42
-AMF.H264.QP.Maximum.Description="Höchster QP (Quantifizierungsparameter) wert der in einem Bild verwendet wird."
43
-AMF.H264.QP.IFrame="I-Einzelbild QP"
44
-AMF.H264.QP.IFrame.Description="Fester QP wert der für I-Bilder verwendet wird."
45
-AMF.H264.QP.PFrame="P-Einzelbild QP"
46
-AMF.H264.QP.PFrame.Description="Fester QP wert der für P-Bilder verwendet wird."
47
-AMF.H264.QP.BFrame="B-Einzelbild QP"
48
-AMF.H264.QP.BFrame.Description="Fester QP wert der für B-Bilder verwendet wird."
49
-AMF.H264.VBVBuffer="VBV Buffer"
50
-AMF.H264.VBVBuffer.Description="Welche Methode genutzt werden soll um die VBV-Puffergröße zu bestimmen:\n- '\@AMF.Util.Automatic\@' errechnet diese mithilfe einer Strengeneinschränkung,\n- '\@AMF.Util.Manual\@' erlaubt es dem Nutzer die Größe zu kontrollieren.\n
51
-VBV (Videopufferungsverifizierer) Puffer wird von verschiedenen Ratenkontrollmethoden genutzt um die gesamte Bitrate innerhalb der Begrenzungen zu halten."
52
-AMF.H264.VBVBuffer.Strictness="VBV Buffer Genauigkeit"
53
-AMF.H264.VBVBuffer.Strictness.Description="Legt die Einschränkungsstärke des VBV Buffers fest, wobei 100% so eingeschränkt wie möglich ist und 0% komplett uneingeschränkt."
54
-AMF.H264.VBVBuffer.Size="VBV Buffer Größe"
55
-AMF.H264.VBVBuffer.Size.Description="Die Größe des VBV Buffers, welcher für die Bitratenkontrolle in einer Sequenz verwendet wird."
56
-AMF.H264.VBVBuffer.Fullness="VBV Buffer Füllung"
57
-AMF.H264.VBVBuffer.Fullness.Description="Wie voll der VBV Buffer anfangs ist, hat nur einen Effekt auf die erste Sequenz beim codieren."
58
-AMF.H264.FillerData="Füllungsdaten"
59
-AMF.H264.FillerData.Description="Das aktivieren von Füllungsdaten erlaubt es dem Codierer mindestens die Zielbitrate zu erreichen in dem dieser den verbleibenden Platz mit leeren Informationen füllt."
60
-AMF.H264.FrameSkipping="Bildüberspringung"
61
-AMF.H264.FrameSkipping.Description="Bildüberspringung erlaubt es dem Codierer, Bilder zu überspringen um die Zielbitrate einzuhalten.\nWenn der Codierer ein Bild überspringt, fügt dieser stattdessen ein repeat-last-frame NAL in den Stream ein.\nKann bei sehr niedrigen Zielbitraten helfen."
62
-AMF.H264.EnforceHRDCompatibility="Erzwinge HRD Kompatiblität"
63
-AMF.H264.EnforceHRDCompatibility.Description="Erzwinge Hypothetischer-Referenz-Decodierer Limitierungen welches die maximale Änderung des QP werts innerhalb eines Bildes begrenzt."
64
-AMF.H264.KeyframeInterval="Keyframeintervall"
65
-AMF.H264.KeyframeInterval.Description="Definiert die Distanz zwischen Keyframes in Sekunden. Setzt auch die Größe einer GOP-Sequenz fest."
66
-AMF.H264.IDRPeriod="IDR Zeitraum"
67
-AMF.H264.IDRPeriod.Description="Definiert die Distanz zwischen Sofortigen-Decodierer-Aktualisierungen (IDR) in Frames. Setzt auch die Größe einer GOP-Sequenz fest."
68
-AMF.H264.BFrame.Pattern="B-Bilder"
69
-AMF.H264.BFrame.Pattern.Description="Wie viele B-Bilder beim codieren verwendet werden sollen.\nWird von der 2ten und 3ten generation an VCE-Karten unterstützt. Negativer Einfluss auf Codierungsperformanz."
70
-AMF.H264.BFrame.DeltaQP="Delta QP für B-Bilder"
71
-AMF.H264.BFrame.DeltaQP.Description="Delta QP wert zum letzten I- or P-Bild für nicht referenzierbare B-Bilder."
72
-AMF.H264.BFrame.Reference="Referenzierbare B-Bilder"
73
-AMF.H264.BFrame.Reference.Description="Erlaube einem B-Bild andere B-Bilder als referenz zu verwenden, anstatt nur P- und I-Bilder."
74
-AMF.H264.BFrame.ReferenceDeltaQP="Delta QP für referenzierbare B-Bilder"
75
-AMF.H264.BFrame.ReferenceDeltaQP.Description="Delta QP wert zum letzten I- or P-Bild für referenzierbare B-Bilder."
76
-AMF.H264.DeblockingFilter="Entblockungsfilter"
77
-AMF.H264.DeblockingFilter.Description="Setze die Markierung dass der Decodierer einen Entblockungsfilter verwenden darf."
78
-AMF.H264.ScanType="Abtastverfahren"
79
-AMF.H264.ScanType.Description="Welches Abtastverfahren verwendet werden soll. Sollte immer '\@AMF.H264.ScanType.Progressive\@' sein."
80
-AMF.H264.ScanType.Progressive="Progressiv"
81
-AMF.H264.ScanType.Interlaced="Zeilensprung"
82
-AMF.H264.MotionEstimation="Bewegungsschätzung"
83
-AMF.H264.MotionEstimation.Description="Bewegungsschätzung erlaubt des dem Codierer die benötigte Bitrate zu reduzieren durch das herausfinden, wo ein Pixel hinbewegt wurde."
84
-AMF.H264.MotionEstimation.None="Keine"
85
-AMF.H264.MotionEstimation.Half="Halb-Pixel"
86
-AMF.H264.MotionEstimation.Quarter="Viertel-Pixel"
87
-AMF.H264.MotionEstimation.Both="Halb- & Viertel-Pixel"
88
-AMF.H264.CodingType="Codierungstyp"
89
-AMF.H264.CodingType.Description="Welcher Codierungstyp verwendet werden soll:\n* \@AMF.Util.Default\@ lässt AMF entscheiden (empfohlen).\n* CALVC (Context-Adaptive Variable-Length Coding) ist schneller aber größer.\n* CABAC (Context-Adaptive Binary Arithmetic Coding) ist langsamer aber kleiner."
90
+Utility.Default="Standard"
91
+Utility.Automatic="Automatisch"
92
+Utility.Manual="Manuell"
93
+Utility.Switch.Disabled="Deaktiviert"
94
+Utility.Switch.Enabled="Aktiviert"
95
+Preset="Voreinstellung"
96
+Preset.ResetToDefaults="Standardeinstellungen wiederherstellen"
97
+Preset.Recording="Aufnahme"
98
+Preset.HighQuality="Hohe Qualität"
99
+Preset.Indistinguishable="Ununterscheidbar"
100
+Preset.Lossless="Verlustfrei"
101
+Preset.Twitch="Twitch"
102
+Preset.YouTube="YouTube"
103
+Usage="Nutzungsart"
104
+Usage.Description="Auf welche Nutzungsart AMF eingestellt werden soll:\n- '\@Usage.Transcoding\@' für generelle Kodierung (empfohlen),\n- '\@Usage.UltraLowLatency\@' für Kodierung mit sehr niedriger Latenz,\n- '\@Usage.LowLatency\@' ist ähnlich dem oberen mit leicht erhöhter Latenz.\nNur '\@Usage.Transcoding\@' wird für das Streamen unterstützt, alle anderen können für Aufnahmen verwendet werden."
105
+Usage.Transcoding="Umwandeln"
106
+Usage.UltraLowLatency="Sehr Niedrige Latenz"
107
+Usage.LowLatency="Niedrige Latenz"
108
+Usage.Webcam="Webcam"
109
+QualityPreset="Qualitätsvoreinstellung"
110
+QualityPreset.Description="Welche Qualitätsvoreinstellungen AMF versuchen soll zu verwenden:\n- '\@QualityPreset.Speed\@' ist die schnellste aber hat die schlechteste Qualität,\n- '\@QualityPreset.Balanced\@' ist ein balancierter mix aus beiden,\n- '\@QualityPreset.Quality\@' gibt die beste Qualität für eine gegebene Bitrate."
111
+QualityPreset.Speed="Geschwindigkeit"
112
+QualityPreset.Balanced="Ausgeglichen"
113
+QualityPreset.Quality="Qualität"
114
+Profile="Profil"
115
+Profile.Description="Welches Profil für das Kodieren verwendet wird. Sortiert von am besten unterstützt (oben) bis zu bester Qualität (unten)."
116
+ProfileLevel="Profillevel"
117
+ProfileLevel.Description="Welches Profillevel für das Kodieren verwendet wird. Es ist am besten dies auf \@Utility.Automatic\@ zu lassen."
118
+Tier="Stufe"
119
+Tier.Description="Welche Stufe beim kodieren verwendet wird. 'High' ist für hohe Bitraten/Bandbreite gedacht während 'Main' eher für Mainstream Medien gedacht ist."
120
+AspectRatio="Seitenverhältnis"
121
+AspectRatio.Description="Welches Seitenverhältnis in die kodierte Ausgabe geschrieben werden soll."
122
+CodingType="Kodierungstyp"
123
+CodingType.Description="Welcher Kodierungstyp verwendet werden soll:\n* \@Utility.Automatic\@ lässt AMF entscheiden (empfohlen).\n* 'CALVC' (Context-Adaptive Variable-Length Coding) ist schneller aber größer.\n* 'CABAC' (Context-Adaptive Binary Arithmetic Coding) ist langsamer aber kleiner."
124
+MaximumReferenceFrames="Maximale Referenzbilder"
125
+MaximumReferenceFrames.Description="Wie viele Bilder der Kodierer beim kodieren maximal referenzieren darf. Hat einen direkten Einfluss auf Kodierungsqualität."
126
+RateControlMethod="Ratenkontrollmethode"
127
+RateControlMethod.Description="Welche Ratenkontrollmethode verwendet werden soll:\n- '\@RateControlMethod.CQP\@' setzt feste QP Werte für I-/P-/B- Bilder,\n- '\@RateControlMethod.CBR\@' bleibt auf der Zielbitrate (mithilfe von Füllungsdaten) (empfohlen für das Streamen),\n- '\@RateControlMethod.VBR\@' bleibt unter der Spitzenbitrate,\n- '\@RateControlMethod.VBRLAT\@' bleibt nahe der Zielbitrate sofern GPU-Latenz und GPU-Benutzung dies erlauben, ansonsten wird eine höhere Bitrate verwendet (empfohlen für Aufnahmen)."
128
+RateControlMethod.CQP="Konstanter QP (CQP)"
129
+RateControlMethod.CBR="Konstante Bitrate (CBR)"
130
+RateControlMethod.VBR="Variable Bitrate (Eingeschränkt via Spitzenbitrate) (VBR)"
131
+RateControlMethod.VBRLAT="Variable Bitrate (Eingeschränkt via Latenz) (VBRLAT)"
132
+PrePassMode="Vordurchlaufsmodus"
133
+PrePassMode.Description="Vordurchlauf ist ein zweiter Bitratendistributionsdurchlauf welcher eine besser Verteilung der Bitrate innerhalb eine Sequenz erlaubt, aber die Effekte hiervon können von Karte zu Karte anders sein."
134
+PrePassMode.Quarter="\@Utility.Switch.Enabled\@ (Viertel der Größe)"
135
+PrePassMode.Half="\@Utility.Switch.Enabled\@ (Hälfte der Größe)"
136
+PrePassMode.Full="\@Utility.Switch.Enabled\@ (Volle Größe)"
137
+Bitrate.Target="Zielbitrate"
138
+Bitrate.Target.Description="Zielbitrate die in der ganzen Sequenz erreicht werden soll."
139
+Bitrate.Peak="Spitzenbitrate"
140
+Bitrate.Peak.Description="Spitzenbitrate die in der ganzen Sequenz erreicht werden darf."
141
+QP.IFrame="I-Bild QP"
142
+QP.IFrame.Description="Fester QP wert der für I-Bilder verwendet wird."
143
+QP.PFrame="P-Bild QP"
144
+QP.PFrame.Description="Fester QP wert der für P-Bilder verwendet wird."
145
+QP.BFrame="B-Bild QP"
146
+QP.BFrame.Description="Fester QP wert der für B-Bilder verwendet wird."
147
+QP.Minimum="Minimaler QP"
148
+QP.Minimum.Description="Niedrigster QP wert der in einem Bild verwendet wird."
149
+QP.IFrame.Minimum="Minimaler I-Bild QP"
150
+QP.IFrame.Minimum.Description="Niedrigster QP wert der in einem I-Bild verwendet wird."
151
+QP.PFrame.Minimum="Minimaler P-Bild QP"
152
+QP.PFrame.Minimum.Description="Niedrigster QP wert der in einem P-Bild verwendet wird."
153
+QP.Maximum="Maximaler QP"
154
+QP.Maximum.Description="Höchster QP wert der in einem Bild verwendet wird."
155
+QP.IFrame.Maximum="Maximaler I-Bild QP"
156
+QP.IFrame.Maximum.Description="Höchster QP wert der in einem I-Bild verwendet wird."
157
+QP.PFrame.Maximum="Maximaler P-Bild QP"
158
+QP.PFrame.Maximum.Description="Höchster QP wert der in einem P-Bild verwendet wird."
159
+FillerData="Füllungsdaten"
160
+FillerData.Description="Das aktivieren von Füllungsdaten erlaubt es dem Kodierer mindestens die \@Bitrate.Target\@ zu erreichen in dem dieser den verbleibenden Platz mit leeren Informationen füllt."
161
+FrameSkipping="Bildüberspringung"
162
+FrameSkipping.Description="Bildüberspringung erlaubt es dem Kodierer, Bilder zu überspringen um die \@Bitrate.Target\@ einzuhalten.\nWenn der Kodierer ein Bild überspringt, fügt dieser stattdessen ein repeat-last-frame NAL in den Stream ein.\nKann bei sehr niedriger \@Bitrate.Target\@ helfen."
163
+VBAQ="VBAQ"
164
+VBAQ.Description="Aktivieren der Verwendung der \"Auf Varianz basierte Adaptive Quantisierung\" (VBAQ) welche auf Pixel Veränderung basiert ist, um die Bitrate besser zu verteilen. \nEs basiert auf der Idee, dass das menschliche Auge weniger anfällig für Artefakte in stark strukturierte Flächen ist und erhöt so die Bitrate bei glatten Oberflächen. \nAktivierung kann zu Verbesserungen der subjektiven Qualität mit bestimmten Inhalten führen."
165
+EnforceHRD="Erzwinge HRD"
166
+EnforceHRD.Description="Erzwinge die Nutzung eines Hypothetischen Referenz Dekodierers welcher genutzt wird um den ausgehenden Datenstrom zu verifizieren."
167
+VBVBuffer="VBV Buffer"
168
+VBVBuffer.Description="Welche Methode genutzt werden soll um die VBV-Puffergröße zu bestimmen:\n- '\@Utility.Automatic\@' errechnet diese mithilfe einer strengen Einschränkung,\n- '\@Utilility.Manual\@' erlaubt es dem Nutzer die Größe zu kontrollieren.\nVBV (Videopufferungsverifizierer) Puffer wird von verschiedenen Ratenkontrollmethoden genutzt um die gesamte Bitrate innerhalb der Begrenzungen zu halten."
169
+VBVBuffer.Strictness="VBV Buffer Strenge"
170
+VBVBuffer.Strictness.Description="Legt die Einschränkungsstärke des VBV Buffers fest, wobei 100% so eingeschränkt wie möglich ist und 0% komplett uneingeschränkt."
171
+VBVBuffer.Size="VBV Buffer Größe"
172
+VBVBuffer.Size.Description="Die Größe des VBV Buffers, welcher für die Bitratenkontrolle in einer Sequenz verwendet wird."
173
+VBVBuffer.InitialFullness="VBV Buffer Anfängliche Füllung"
174
+VBVBuffer.InitialFullness.Description="Wie voll der VBV Buffer am Anfang ist (in %), hat nur einen Effekt auf die erste Sequenz beim kodieren."
175
+KeyframeInterval="Schlüsselbildintervall"
176
+KeyframeInterval.Description="Intervall (in Sekunden) zwischen Schlüsselbildern."
177
+H264.IDRPeriod="IDR Intervall (in Bildern)"
178
+H264.IDRPeriod.Description="Definiert die Distanz zwischen Sofortigen-Dekodierer-Aktualisierungen (IDR) in Frames. Setzt auch die Größe einer GOP-Sequenz fest."
179
+H265.IDRPeriod="IDR Intervall (in GOPs)"
180
+H265.IDRPeriod.Description="Definiert die Distanz zwischen Sofortigen-Dekodierer-Aktualisierungen (IDR) in GOPs."
181
+GOP.Type="GOP Typ"
182
+GOP.Type.Description="Welcher Typ an GOP verwendet werden soll:\n- '\@GOP.Type.Fixed\@' wird immer eine feste Distanz zwischen GOPs haben.\n- '\@GOP.Type.Variable\@' erlaubt GOPs mit variabler Größe, je nachdem was gebraucht wird.\n'\@GOP.Type.Fixed\@' ist was die H264 Implementierung verwendet und funktioniert am besten für lokales streamen, während '\@GOP.Type.Variable\@ am besten ist für Aufnahmen mit hoher Qualität und kleiner Größe."
183
+GOP.Type.Fixed="Fest"
184
+GOP.Type.Variable="Variabel"
185
+GOP.Size="GOP Größe"
186
+GOP.Size.Description="Größe eines GOP (Group Of Pictures / Gruppe Von Bildern) in Bildern."
187
+GOP.Size.Minimum="Minimale GOP Größe"
188
+GOP.Size.Minimum.Description="Minimale Größe eines GOP (Group Of Pictures / Gruppe Von Bildern) in Bildern."
189
+GOP.Size.Maximum="Maximale GOP Größe"
190
+GOP.Size.Maximum.Description="Maximale Größe eines GOP (Group Of Pictures / Gruppe Von Bildern) in Bildern."
191
+GOP.Alignment="GOP Ausrichtung"
192
+GOP.Alignment.Description="Experimentell, Effekte sind unbekannt. Benutzung auf eigene Gefahr."
193
+BFrame.Pattern="B-Bilder Struktur"
194
+BFrame.Pattern.Description="Wie viele B-Bilder beim kodieren verwendet werden sollen.\nWird von der 2ten und 3ten generation an VCE-Karten unterstützt. Negativer Einfluss auf Kodierungsperformanz."
195
+BFrame.DeltaQP="B-Bild Delta QP"
196
+BFrame.DeltaQP.Description="Delta QP wert zum letzten I- or P-Bild für nicht referenzierbare B-Bilder."
197
+BFrame.Reference="B-Bild Referenz"
198
+BFrame.Reference.Description="Erlaube einem B-Bild andere B-Bilder als referenz zu verwenden, anstatt nur P- und I-Bilder."
199
+BFrame.ReferenceDeltaQP="B-Bild Referenz Delta QP"
200
+BFrame.ReferenceDeltaQP.Description="Delta QP wert zum letzten I- or P-Bild für referenzierbare B-Bilder."
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/en-US.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/en-US.ini
Changed
201
1
2
# Shared
3
-AMF.Util.Default="Default"
4
-AMF.Util.Automatic="Automatic"
5
-AMF.Util.Manual="Manual"
6
-AMF.Util.Toggle.Disabled="Disabled"
7
-AMF.Util.Toggle.Enabled="Enabled"
8
-# H264
9
-# - Preset
10
-AMF.H264.Preset="Preset"
11
-AMF.H264.Preset.ResetToDefaults="Reset to Defaults"
12
-AMF.H264.Preset.Recording="Recording"
13
-AMF.H264.Preset.HighQuality="High Quality"
14
-AMF.H264.Preset.Indistinguishable="Indistinguishable"
15
-AMF.H264.Preset.Lossless="Lossless"
16
-AMF.H264.Preset.Twitch="Twitch"
17
-AMF.H264.Preset.YouTube="YouTube"
18
-# - Startup Properties
19
-AMF.H264.Usage="Usage"
20
-AMF.H264.Usage.Description="What usage AMF should be tuned for:\n- '\@AMF.H264.Usage.Transcoding\@' is general purpose transcoding (recommended),\n- '\@AMF.H264.Usage.UltraLowLatency\@' is for really low latency encoding,\n- '\@AMF.H264.Usage.LowLatency\@' is similar to above with a slightly higher latency.\nStreaming only supports '\@AMF.H264.Usage.Transcoding\@', all other values can be used for recording."
21
-AMF.H264.Usage.Transcoding="Transcoding"
22
-AMF.H264.Usage.UltraLowLatency="Ultra Low Latency"
23
-AMF.H264.Usage.LowLatency="Low Latency"
24
-AMF.H264.QualityPreset="Quality Preset"
25
-AMF.H264.QualityPreset.Description="What Quality Preset AMF should attempt to target:\n- '\@AMF.H264.QualityPreset.Speed\@' is the fastest but has the worst quality,\n- '\@AMF.H264.QualityPreset.Balanced\@' is a balanced mix of both,\n- '\@AMF.H264.QualityPreset.Quality\@' gives the best quality for a given bitrate."
26
-AMF.H264.QualityPreset.Speed="Speed"
27
-AMF.H264.QualityPreset.Balanced="Balanced"
28
-AMF.H264.QualityPreset.Quality="Quality"
29
-AMF.H264.Profile="Profile"
30
-AMF.H264.Profile.Description="Which H.264 Profile to use for encoding, sorted from highest quality to most widespread support."
31
-AMF.H264.ProfileLevel="Profile Level"
32
-AMF.H264.ProfileLevel.Description="Which H.264 Profile Level to use for encoding:\n- '\@AMF.Util.Automatic\@' calculates the best profile level for the given Frame Rate and Frame Size,\n- '4.1' supports 1920x1080 30FPS, 1280x720 60FPS, 960x540 90FPS\n- '4.2' supports 1920x1080 60FPS, 1280x720 120FPS, 960x540 172FPS\n- '5.0' supports 1920x1080 60FPS, 1280x720 144FPS, 960x540 172FPS\n- '5.1' supports 3840x2160 30FPS, 1920x1080 120FPS, 1280x720 172FPS, 960x540 172FPS\n- '5.2' supports 3840x2160 60FPS, 1920x1080 172FPS, 1280x720 172FPS, 960x540 172FPS"
33
-# - Rate Control Properties
34
-AMF.H264.RateControlMethod="Rate Control Method"
35
-AMF.H264.RateControlMethod.Description="What rate control method should be used:\n- '\@AMF.H264.RateControlMethod.CQP\@' assigns fixed I-/P-/B-Frame QP values,\n- '\@AMF.H264.RateControlMethod.CBR\@' stays at the given Target Bitrate (using Filler Data) (recommended for streaming),\n- '\@AMF.H264.RateControlMethod.VBR\@' stays below the given Peak Bitrate,\n- '\@AMF.H264.RateControlMethod.VBR_LAT\@' stays close to the Target Bitrate if GPU latency and load allow for it, otherwise will use higher bitrate (recommended for recording)."
36
-AMF.H264.RateControlMethod.CQP="Constant QP (CQP)"
37
-AMF.H264.RateControlMethod.CBR="Constant Bitrate (CBR)"
38
-AMF.H264.RateControlMethod.VBR.Peak="Variable Bitrate (Peak Constrained) (VBR)"
39
-AMF.H264.RateControlMethod.VBR.Latency="Variable Bitrate (Latency Constrained) (VBR_LAT)"
40
-AMF.H264.Bitrate.Target="Target Bitrate"
41
-AMF.H264.Bitrate.Target.Description="Bitrate to attempt to achieve in the overall sequence."
42
-AMF.H264.Bitrate.Peak="Peak Bitrate"
43
-AMF.H264.Bitrate.Peak.Description="Bitrate to attempt to maximally peak to in the overall sequence."
44
-AMF.H264.QP.Minimum="Minimum QP"
45
-AMF.H264.QP.Minimum.Description="Lowest QP value to use in a Frame."
46
-AMF.H264.QP.Maximum="Maximum QP"
47
-AMF.H264.QP.Maximum.Description="Highest QP value to use in a Frame."
48
-AMF.H264.QP.IFrame="I-Frame QP"
49
-AMF.H264.QP.IFrame.Description="Fixed QP value to use for I-Frames."
50
-AMF.H264.QP.PFrame="P-Frame QP"
51
-AMF.H264.QP.PFrame.Description="Fixed QP value to use for P-Frames."
52
-AMF.H264.QP.BFrame="B-Frame QP"
53
-AMF.H264.QP.BFrame.Description="Fixed QP value to use for B-Frames."
54
-AMF.H264.VBVBuffer="VBV Buffer"
55
-AMF.H264.VBVBuffer.Description="What method should be used to determine the VBV Buffer Size:\n- '\@AMF.Util.Automatic\@' calculates the size using a strictness constraint,\n- '\@AMF.Util.Manual\@' allows the user to control the size.\nVBV (Video Buffering Verifier) Buffer is used by certain Rate Control Methods to keep the overall bitrate within the given constraints."
56
-AMF.H264.VBVBuffer.Strictness="VBV Buffer Strictness"
57
-AMF.H264.VBVBuffer.Strictness.Description="Determines the strictness of the VBV Buffer, with 100% being as strict as possible and 0% being unrestricted."
58
-AMF.H264.VBVBuffer.Size="VBV Buffer Size"
59
-AMF.H264.VBVBuffer.Size.Description="The size of the VBV Buffer which is used for Bitrate control in a sequence."
60
-AMF.H264.VBVBuffer.Fullness="VBV Buffer Fullness"
61
-AMF.H264.VBVBuffer.Fullness.Description="How full the VBV Buffer initially is, will only affect the initial sequence of encoding."
62
-AMF.H264.FillerData="Filler Data"
63
-AMF.H264.FillerData.Description="Enabling Filler Data allows the encoder to keep at least the Target Bitrate by filling up the remaining space in a sequence with empty information."
64
-AMF.H264.FrameSkipping="Frame Skipping"
65
-AMF.H264.FrameSkipping.Description="Frame Skipping allows the encoder to drop frames in order to meet Target Bitrate requirements.\nWhen the encoder drops a frame it instead insert a repeat-last-frame NAL into the stream.\nCan help with very low Target Bitrates."
66
-AMF.H264.EnforceHRDCompatibility="Enforce HRD Compatibility"
67
-AMF.H264.EnforceHRDCompatibility.Description="Enforce Hypothetical Reference Decoder restrictions which limit the maximum QP value change within a frame."
68
-# - Picture Control Properties
69
-AMF.H264.KeyframeInterval="Keyframe Interval"
70
-AMF.H264.KeyframeInterval.Description="Defines the distance between Keyframes in seconds. Also controls GOP-sequence size."
71
-AMF.H264.IDRPeriod="IDR Period"
72
-AMF.H264.IDRPeriod.Description="Defines the distance between Instantaneous Decoding Refreshes (IDR) in frames. Also controls GOP-sequence size."
73
-AMF.H264.BFrame.Pattern="B-Frames"
74
-AMF.H264.BFrame.Pattern.Description="The amount of B-Frames to use while encoding.\nSupported by 2nd and 3rd Generation VCE cards. Negative impact on encoding performance."
75
-AMF.H264.BFrame.DeltaQP="Delta QP for B-Frames"
76
-AMF.H264.BFrame.DeltaQP.Description="Delta QP value to the last I- or P-Frame for non-referenceable B-Frames."
77
-AMF.H264.BFrame.Reference="Referenceable B-Frames"
78
-AMF.H264.BFrame.Reference.Description="Allow a B-Frame to also use B-Frames as reference, instead of just P- and I-Frames."
79
-AMF.H264.BFrame.ReferenceDeltaQP="Delta QP for referenceable B-Frames"
80
-AMF.H264.BFrame.ReferenceDeltaQP.Description="Delta QP value to the last I- or P-Frame for referenceable B-Frames."
81
-AMF.H264.DeblockingFilter="Deblocking Filter"
82
-AMF.H264.DeblockingFilter.Description="Sets the flag that the decoder is allowed to use a Deblocking Filter for the encoded stream."
83
-# - Miscellaneous Properties
84
-AMF.H264.ScanType="Scan Type"
85
-AMF.H264.ScanType.Description="Which scanning method to use, always leave this on '\@AMF.H264.ScanType.Progressive\@'."
86
-AMF.H264.ScanType.Progressive="Progressive"
87
-AMF.H264.ScanType.Interlaced="Interlaced"
88
-AMF.H264.MotionEstimation="Motion Estimation"
89
-AMF.H264.MotionEstimation.Description="Motion Estimation allows the encoder to reduce needed bitrate by estimating where a pixel went."
90
-AMF.H264.MotionEstimation.None="None"
91
-AMF.H264.MotionEstimation.Half="Half-Pixel"
92
-AMF.H264.MotionEstimation.Quarter="Quarter-Pixel"
93
-AMF.H264.MotionEstimation.Both="Half- & Quarter-Pixel"
94
+Utility.Default="Default"
95
+Utility.Automatic="Automatic"
96
+Utility.Manual="Manual"
97
+Utility.Switch.Disabled="Disabled"
98
+Utility.Switch.Enabled="Enabled"
99
+Preset="Preset"
100
+Preset.ResetToDefaults="Reset to Defaults"
101
+Preset.Recording="Recording"
102
+Preset.HighQuality="High Quality"
103
+Preset.Indistinguishable="Indistinguishable"
104
+Preset.Lossless="Lossless"
105
+Preset.Twitch="Twitch"
106
+Preset.YouTube="YouTube"
107
+# Static
108
+Usage="Usage"
109
+Usage.Description="What usage AMF should be tuned for:\n- '\@Usage.Transcoding\@' is general purpose transcoding (recommended),\n- '\@Usage.UltraLowLatency\@' is for really low latency encoding,\n- '\@Usage.LowLatency\@' is similar to above with a slightly higher latency.\nStreaming only supports '\@Usage.Transcoding\@', all other values can be used for recording."
110
+Usage.Transcoding="Transcoding"
111
+Usage.UltraLowLatency="Ultra Low Latency"
112
+Usage.LowLatency="Low Latency"
113
+Usage.Webcam="Webcam"
114
+QualityPreset="Quality Preset"
115
+QualityPreset.Description="What Quality Preset AMF should attempt to target:\n- '\@QualityPreset.Speed\@' is the fastest but has the worst quality,\n- '\@QualityPreset.Balanced\@' is a balanced mix of both,\n- '\@QualityPreset.Quality\@' gives the best quality for a given bitrate."
116
+QualityPreset.Speed="Speed"
117
+QualityPreset.Balanced="Balanced"
118
+QualityPreset.Quality="Quality"
119
+Profile="Profile"
120
+Profile.Description="What Profile to encode with. Sorted from best supported (top) to best quality (bottom)."
121
+ProfileLevel="Profile Level"
122
+ProfileLevel.Description="What Profile Level to use. It is best to leave this at \@Utility.Automatic\@."
123
+Tier="Tier"
124
+Tier.Description="What Tier to encode at. 'High' targets high bitrate/bandwidth uses while 'Main' is aimed at mainstream media."
125
+AspectRatio="Aspect Ratio"
126
+AspectRatio.Description="Which Aspect Ratio should be written into the output file."
127
+CodingType="Coding Type"
128
+CodingType.Description="Which type of coding to use:\n* '\@Utility.Automatic\@' lets AMF decide (recommended).\n* 'CALVC' (Context-Adaptive Variable-Length Coding) is faster, but larger.\n* 'CABAC' (Context-Adaptive Binary Arithmetic Coding) is slower, but smaller."
129
+MaximumReferenceFrames="Maximum Reference Frames"
130
+MaximumReferenceFrames.Description="How many Frames the encoder may reference at most when encoding. Has a direct impact on encoding quality."
131
+# Rate Control
132
+RateControlMethod="Rate Control Method"
133
+RateControlMethod.Description="What rate control method should be used:\n- '\@RateControlMethod.CQP\@' assigns fixed I-/P-/B-Frame QP values,\n- '\@RateControlMethod.CBR\@' stays at the given Target Bitrate (using Filler Data) (recommended for streaming),\n- '\@RateControlMethod.VBR\@' stays below the given Peak Bitrate,\n- '\@RateControlMethod.VBRLAT\@' stays close to the Target Bitrate if GPU latency and load allow for it, otherwise will use higher bitrate (recommended for recording)."
134
+RateControlMethod.CQP="Constant QP (CQP)"
135
+RateControlMethod.CBR="Constant Bitrate (CBR)"
136
+RateControlMethod.VBR="Variable Bitrate (Peak Constrained) (VBR)"
137
+RateControlMethod.VBRLAT="Variable Bitrate (Latency Constrained) (VBRLAT)"
138
+PrePassMode="Pre-Pass Mode"
139
+PrePassMode.Description="Pre-Pass is a secondary bitrate distribution pass that allows for better distribution of the bitrate within a sequence, however the effects of this may vary from card to card."
140
+PrePassMode.Quarter="\@Utility.Switch.Enabled\@ (Quarter Size)"
141
+PrePassMode.Half="\@Utility.Switch.Enabled\@ (Half Size)"
142
+PrePassMode.Full="\@Utility.Switch.Enabled\@ (Full Size)"
143
+Bitrate.Target="Target Bitrate"
144
+Bitrate.Target.Description="Bitrate to attempt to achieve in the overall sequence."
145
+Bitrate.Peak="Peak Bitrate"
146
+Bitrate.Peak.Description="Bitrate to attempt to maximally peak to in the overall sequence."
147
+QP.IFrame="I-Frame QP"
148
+QP.IFrame.Description="Fixed QP value to use for I-Frames."
149
+QP.PFrame="P-Frame QP"
150
+QP.PFrame.Description="Fixed QP value to use for P-Frames."
151
+QP.BFrame="B-Frame QP"
152
+QP.BFrame.Description="Fixed QP value to use for B-Frames."
153
+QP.Minimum="Minimum QP"
154
+QP.Minimum.Description="Lowest QP value to use in a Frame."
155
+QP.IFrame.Minimum="Minimum I-Frame QP"
156
+QP.IFrame.Minimum.Description="Lowest QP value to use in an I-Frame."
157
+QP.PFrame.Minimum="Minimum P-Frame QP"
158
+QP.PFrame.Minimum.Description="Lowest QP value to use in a P-Frame."
159
+QP.Maximum="Maximum QP"
160
+QP.Maximum.Description="Highest QP value to use in a Frame."
161
+QP.IFrame.Maximum="Maximum I-Frame QP"
162
+QP.IFrame.Maximum.Description="Highest QP value to use in an I-Frame."
163
+QP.PFrame.Maximum="Maximum P-Frame QP"
164
+QP.PFrame.Maximum.Description="Highest QP value to use in a P-Frame."
165
+FillerData="Filler Data"
166
+FillerData.Description="Enabling Filler Data allows the encoder to keep at least the \@Bitrate.Target\@ by filling up the remaining space in a sequence with empty information."
167
+FrameSkipping="Frame Skipping"
168
+FrameSkipping.Description="Frame Skipping allows the encoder to skip frames in order to meet the \@Bitrate.Target\@ requirements.\nWhen the encoder skips a frame it instead insert a repeat-last-frame NAL into the stream.\nCan help with very low \@Bitrate.Target\@ requirements."
169
+FrameSkipping.Period="Skip-Frame Period"
170
+FrameSkipping.Period.Description="Interval (in Frames) between skipped frames. This can be used to simulate a lower framerate than OBS is set to while still having a valid stream."
171
+FrameSkipping.Behaviour="Skip-Frame Behaviour"
172
+FrameSkipping.Behaviour.Description="Define how Frame Skipping behaves."
173
+FrameSkipping.SkipNth="Skip only every Nth frame"
174
+FrameSkipping.KeepNth="Keep only every Nth frame"
175
+VBAQ="VBAQ"
176
+VBAQ.Description="Enable the use of 'Variance Based Adaptive Quantization' (VBAQ) which is based on pixel variance to distribute bitrate better.\nIt works on the idea that the human visual system is less sensitive to artifacts in highly textured areas and thus will push the bitrate towards smoother surfaces.\nEnabling this may lead to improvements in subjective quality with certain content."
177
+EnforceHRD="Enforce HRD"
178
+EnforceHRD.Description="Enforce the use of a Hypothetical Reference Decoder which is used to verify that the output bitstream is correct."
179
+# VBV Buffer
180
+VBVBuffer="VBV Buffer"
181
+VBVBuffer.Description="What method should be used to determine the VBV Buffer Size:\n- '\@Utility.Automatic\@' calculates the size using a strictness constraint,\n- '\@Utility.Manual\@' allows the user to control the size.\nVBV (Video Buffering Verifier) Buffer is used by certain Rate Control Methods to keep the overall bitrate within the given constraints."
182
+VBVBuffer.Strictness="VBV Buffer Strictness"
183
+VBVBuffer.Strictness.Description="Determines the strictness of the VBV Buffer, with 100% being as strict as possible and 0% being unrestricted."
184
+VBVBuffer.Size="VBV Buffer Size"
185
+VBVBuffer.Size.Description="The size of the VBV Buffer which is used for Bitrate control in a sequence."
186
+VBVBuffer.InitialFullness="VBV Buffer Initial Fullness"
187
+VBVBuffer.InitialFullness.Description="How full the VBV Buffer initially is (in %), will only affect the initial sequence of encoding."
188
+# Picture Control
189
+Interval.Keyframe="Keyframe Interval"
190
+Interval.Keyframe.Description="Interval (in Seconds) between Keyframes."
191
+Period.IDR.H264="IDR Period (in Frames)"
192
+Period.IDR.H264.Description="Defines the distance between Instantaneous Decoding Refreshes (IDR) in frames."
193
+Period.IDR.H265="IDR Period (in GOPs)"
194
+Period.IDR.H265.Description="Defines the distance between Instantaneous Decoding Refreshes (IDR) in GOPs."
195
+Interval.IFrame="I-Frame Interval"
196
+Interval.IFrame.Description="Interval (in Seconds) between I-Frames. I-Frames override P-Frames and B-Frames."
197
+Period.IFrame="I-Frame Period (in Frames)"
198
+Period.IFrame.Description="Distance (in Frames) between I-Frames. I-Frames override P-Frames and B-Frames."
199
+Interval.PFrame="P-Frame Interval"
200
+Interval.PFrame.Description="Interval (in Seconds) between P-Frames. P-Frames override B-Frames."
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/es-ES.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/es-ES.ini
Changed
201
1
2
-AMF.Util.Default="Por defecto"
3
-AMF.Util.Automatic="Automático"
4
-AMF.Util.Manual="Manual"
5
-AMF.Util.Toggle.Disabled="Deshabilitado"
6
-AMF.Util.Toggle.Enabled="Habilitado"
7
-AMF.H264.Preset="Preajuste"
8
-AMF.H264.Preset.ResetToDefaults="Restablecer por defecto"
9
-AMF.H264.Preset.Recording="Grabación"
10
-AMF.H264.Preset.HighQuality="Alta Calidad"
11
-AMF.H264.Preset.Indistinguishable="Indistinguible"
12
-AMF.H264.Preset.Lossless="Sin pérdidas"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Uso"
16
-AMF.H264.Usage.Description="A que uso debe ajustarse AMF:\n- 'Codificación' es para uso generalizado (recomendado),\n- 'Ultra Baja Latencia' es para codificación de muy baja latencia,\n- 'Baja Latencia' es similar a la anterior con algo mas de latencia.\nLas emisiones en directo solo soportan 'Codificación', todos los valores pueden ser usados para grabar."
17
-AMF.H264.Usage.Transcoding="Codificación"
18
-AMF.H264.Usage.UltraLowLatency="Latencia ultra baja"
19
-AMF.H264.Usage.LowLatency="Latencia baja"
20
-AMF.H264.QualityPreset="Calidad del perfil"
21
-AMF.H264.QualityPreset.Description="Que calidad del perfil de AMD se debe intentar conseguir:\n- 'Velocidad' es la mas rápida pero la que peor calidad obtiene,\n- 'Equilibrado' está entre 'Velocidad' y 'Calidad' ofreciendo un balance entre los dos,\n- 'Calidad' ofrece la mejor calidad posible para una determinada tasa de bits."
22
-AMF.H264.QualityPreset.Speed="Velocidad"
23
-AMF.H264.QualityPreset.Balanced="Equilibrado"
24
-AMF.H264.QualityPreset.Quality="Calidad"
25
-AMF.H264.Profile="Perfil del Códec"
26
-AMF.H264.Profile.Description="Que perfil H.264 a utilizar para la codificación:\n- 'Baseline' tiene el mayor soporte en las plataformas,\n- 'Main' es compatible con dispositivos algo mas anticuados (recomendado si la emisión va dirigida a dispositivos móviles),\n- 'High' es compatible con los dispositivos actuales (recomendado)."
27
-AMF.H264.ProfileLevel="Nivel del Perfil"
28
-AMF.H264.ProfileLevel.Description="Nivel de perfil H.264 a utilizar para la codificación:\n- 'Automático' calcula el mejor nivel de perfil para cierta velocidad y tamaño de fotogramas,\n- '4.1' soporta 1920x1080 30FPS, 1280x720 60FPS, 960x540 90FPS\n- '4.2' soporta 1920x1080 60FPS, 1280x720 120FPS, 960x540 172FPS\n- '5.0' soporta 1920x1080 60FPS, 1280x720 144FPS, 960x540 172FPS\n- '5.1' soporta 3840x2160 30FPS, 1920x1080 120FPS, 1280x720 172FPS, 960x540 172FPS\n- '5.2' soporta 3840x2160 60FPS, 1920x1080 172FPS, 1280x720 172FPS, 960x540 172FPS"
29
-AMF.H264.RateControlMethod="Método de control del flujo"
30
-AMF.H264.RateControlMethod.Description="Qué método de control de flujo debe ser usado:\n- '\@AMF.H264.RateControlMethod.CQP\@' asigna valores fijos de QP en I-/P-/B-Frames (Parámetro de cuantización),\n- '\@AMF.H264.RateControlMethod.CBR\@' se mantiene en la tasa de bits objetivo (usando Datos de relleno) (recomendado para emisiones en directo),\n- '\@AMF.H264.RateControlMethod.VBR\@' se mantiene por debajo de un pico de tasa de bits,\n- '\@AMF.H264.RateControlMethod.VBR_LAT\@' se mantiene cerca de la tasa de bits deseada si la latencia y carga de la GPU lo permite, si no se aumentará la tasa de bits (recomendado para grabaciones)."
31
-AMF.H264.RateControlMethod.CQP="QP constante (CQP)"
32
-AMF.H264.RateControlMethod.CBR="Flujo constante (CBR)"
33
-AMF.H264.RateControlMethod.VBR.Peak="Flujo variable (pico restringido) (VBR)"
34
-AMF.H264.RateControlMethod.VBR.Latency="Flujo variable (latencia restringida) (VBR_LAT)"
35
-AMF.H264.Bitrate.Target="Tasa de bits deseada"
36
-AMF.H264.Bitrate.Target.Description="Tasa de bits a intentar alcanzar en la secuencia general."
37
-AMF.H264.Bitrate.Peak="Pico de tasa de bits"
38
-AMF.H264.Bitrate.Peak.Description="Tasa de bits a intentar alcanzar como pico máximo en la secuencia general."
39
-AMF.H264.QP.Minimum="QP Mínimo"
40
-AMF.H264.QP.Minimum.Description="Valor mínimo de QP (parámetro de cuantización) a utilizar en un fotograma."
41
-AMF.H264.QP.Maximum="QP Máximo"
42
-AMF.H264.QP.Maximum.Description="Valor máximo de QP (parámetro de cuantización) a utilizar en un fotograma."
43
-AMF.H264.QP.IFrame="I-Frame QP"
44
-AMF.H264.QP.IFrame.Description="Valor fijo de QP para I-Frames."
45
-AMF.H264.QP.PFrame="P-Frame QP"
46
-AMF.H264.QP.PFrame.Description="Valor fijo de QP para P-Frames."
47
-AMF.H264.QP.BFrame="B-Frame QP"
48
-AMF.H264.QP.BFrame.Description="Valor de QP Fijo (parámetro de cuantización) a usar por B-Frames."
49
-AMF.H264.VBVBuffer="Buffer VBV"
50
-AMF.H264.VBVBuffer.Description="Que método se debe usar para determinar el tamaño del buffer VBV:\n- 'Automático' calcula el tamaño usando una restricción estricta,\n- 'Manual' permite al usuario controlar el tamaño.\nEl buffer VBV (Verificador de Buffering de Video) es usado por ciertos métodos de control del flujo para mantener la tasa de bits dentro de los parámetros establecidos."
51
-AMF.H264.VBVBuffer.Strictness="Estricticidad del Buffer VBV"
52
-AMF.H264.VBVBuffer.Strictness.Description="Determina la rigidez del Buffer VBV, con 100% siendo tan estricto como sea posible y 0% sin restricción."
53
-AMF.H264.VBVBuffer.Size="Tamaño de buffer VBV"
54
-AMF.H264.VBVBuffer.Size.Description="Tamaño del Buffer VBV que se utiliza para el control de Bitrate en una secuencia."
55
-AMF.H264.VBVBuffer.Fullness="Amplitud del Buffer VBV"
56
-AMF.H264.VBVBuffer.Fullness.Description="Como de lleno es el buffer VMV inicialmente, solo afectará a la secuencia inicial de la codificación."
57
-AMF.H264.FillerData="Datos de relleno"
58
-AMF.H264.FillerData.Description="Habilitando Datos de relleno se permite al codificador mantener por lo menos la tasa de bits deseada rellenando el espacio que falta con información sin valor."
59
-AMF.H264.FrameSkipping="Omisión de fotogramas"
60
-AMF.H264.FrameSkipping.Description="Omisión de fotogramas permite al codificador saltar fotogramas para cumplir con el requerimiento de la tasa de bits objetivo.\nCuando el codificador salta un fotograma insertará un NAL que repetirá el ultimo fotograma codificado en el stream.\nPuede ayudar con tasa de bits objetivo muy bajas."
61
-AMF.H264.EnforceHRDCompatibility="Forzar compatibilidad con HRD"
62
-AMF.H264.EnforceHRDCompatibility.Description="Forzar las restricciones del decodificador hipotético de referencia que limitan el cambio de valor máximo de QP dentro de un fotograma.\nNo recomendado para grabación o emisión en directo y solo se debe usar cuando el objetivo son dispositivos antiguos que solo tienen decodificadores de referencia por software."
63
-AMF.H264.KeyframeInterval="Intervalo de fotogramas clave"
64
-AMF.H264.KeyframeInterval.Description="Cuantos segundos deben haber entre fotogramas que no se pueden descartar.\nTambién controla el tamaño de la secuencia (GOP)."
65
-AMF.H264.IDRPeriod="Periodo IDR"
66
-AMF.H264.IDRPeriod.Description="Define la distancia entre Instantaneous Decoding Refreshes (IDR) en Fotogramas. También controla el tamaño de la secuencia del GOP."
67
-AMF.H264.BFrame.Pattern="B-Frames"
68
-AMF.H264.BFrame.Pattern.Description="La cantidad de B-Frames a usar mientras se codifica.\nSoportado con tarjetas de 2 º y 3 º generación VCE. Impacto negativo en el rendimiento de codificación."
69
-AMF.H264.BFrame.DeltaQP="Delta QP para B-Frames"
70
-AMF.H264.BFrame.DeltaQP.Description="Valor Delta QP para el ultimo I- o P-Frame para B-Frames no referenciables."
71
-AMF.H264.BFrame.Reference="B-Frames referenciables"
72
-AMF.H264.BFrame.Reference.Description="Permitir a un B-Frame utilizar también B-Frames como referencia, en lugar de P - y I-Frames."
73
-AMF.H264.BFrame.ReferenceDeltaQP="Delta QP para los fotogramas referenciables"
74
-AMF.H264.BFrame.ReferenceDeltaQP.Description="Valor Delta QP para el ultimo I- o P-Frame para B-Frames referenciables."
75
-AMF.H264.DeblockingFilter="Filtro de eliminación de bloques"
76
-AMF.H264.DeblockingFilter.Description="Establece el indicador de que el decodificador está permitido a usar el Filtro de eliminación de bloques para el stream codificado."
77
-AMF.H264.ScanType="Tipo de escaneo"
78
-AMF.H264.ScanType.Description="Que método de escaneo usar, dejar siempre en 'Progresivo'."
79
-AMF.H264.ScanType.Progressive="Progresivo"
80
-AMF.H264.ScanType.Interlaced="Entrelazado"
81
-AMF.H264.MotionEstimation="Estimación de movimiento"
82
-AMF.H264.MotionEstimation.Description="Estimación de movimiento permite al codificador reducir el flujo de datos necesario estimando de donde vienen los pixeles."
83
-AMF.H264.MotionEstimation.None="Ninguno"
84
-AMF.H264.MotionEstimation.Half="Mitad de Pixel"
85
-AMF.H264.MotionEstimation.Quarter="Cuarto de Pixel"
86
-AMF.H264.MotionEstimation.Both="Mitad y cuarto de Pixel"
87
-AMF.H264.CodingType="Tipo de codificación"
88
-AMF.H264.CodingType.Description="Qué tipo de codificación utilizar:\n* \@AMF.Util.Default\@ deja que AMF lo decida (recomendado).\n* CALVC (Context-Adaptive Variable-Length Coding) es más rápido, pero más grande.\n* CABAC (Context-Adaptive Binary Arithmetic Coding) es más lento, pero más pequeño."
89
+Utility.Default="Por defecto"
90
+Utility.Automatic="Automático"
91
+Utility.Manual="Manual"
92
+Utility.Switch.Disabled="Deshabilitado"
93
+Utility.Switch.Enabled="Habilitado"
94
+Preset="Preselección"
95
+Preset.ResetToDefaults="Restablecer por defecto"
96
+Preset.Recording="Grabación"
97
+Preset.HighQuality="Alta Calidad"
98
+Preset.Indistinguishable="Indistinguible"
99
+Preset.Lossless="Sin pérdidas"
100
+Preset.Twitch="Twitch"
101
+Preset.YouTube="YouTube"
102
+Usage="Uso"
103
+Usage.Description="A que uso debe ajustarse AMF:\n- '\@Usage.Transcoding\@' es para uso generalizado (recomendado),\n- '\@Usage.UltraLowLatency\@' es para codificación de muy baja latencia,\n- '\@Usage.LowLatency\@' es similar a la anterior con algo mas de latencia.\nLas emisiones en directo solo soportan '\@Usage.Transcoding\@', todos los valores pueden ser usados para grabar."
104
+Usage.Transcoding="Transcodificación"
105
+Usage.UltraLowLatency="Latencia ultra baja"
106
+Usage.LowLatency="Latencia baja"
107
+Usage.Webcam="Webcam"
108
+QualityPreset="Calidad del perfil"
109
+QualityPreset.Description="Qué preajuste de calidad debe AMF intentar usar:\n- '\@QualityPreset.Speed\@' es el más rápido pero tiene la peor calidad, \n-'\@QualityPreset.Balanced\@' es una mezcla equilibrada de ambos,\n- '\@QualityPreset.Quality\@' da la mejor calidad para un determinado bitrate."
110
+QualityPreset.Speed="Velocidad"
111
+QualityPreset.Balanced="Equilibrado"
112
+QualityPreset.Quality="Calidad"
113
+Profile="Perfíl"
114
+Profile.Description="Perfil con el que codificar. Ordenados de mejor soportado (arriba) a mejor calidad (abajo)."
115
+ProfileLevel="Nivel del Perfil"
116
+ProfileLevel.Description="Qué nivel de perfil a utilizar. Es mejor dejar esto en \@Utility.Automatic\@."
117
+Tier="Nivel"
118
+Tier.Description="Nivel en el que codificar. 'Alta' apunta a usos de alto bitrate/ancho de banda mientras 'Principal' está dirigido a medios de comunicación."
119
+AspectRatio="Relación de aspecto"
120
+AspectRatio.Description="Proporción de aspecto que debe escribirse en el archivo de salida."
121
+CodingType="Tipo de codificación"
122
+CodingType.Description="Qué tipo de codificación utilizar:\n* '\@Utility.Automatic\@' deja que AMF lo decida (recomendado).\n* 'CALVC' (Context-Adaptive Variable-Length Coding) es más rápido, pero más grande.\n* 'CABAC' (Context-Adaptive Binary Arithmetic Coding) es más lento, pero más pequeño."
123
+MaximumReferenceFrames="Fotogramas de referencia máximos"
124
+MaximumReferenceFrames.Description="Cuántos fotogramas el codificador puede hacer referencia como mucho al codificar, tiene un impacto directo en la calidad de codificación."
125
+RateControlMethod="Método de control del flujo"
126
+RateControlMethod.Description="Qué método de control de flujo debe ser usado:\n- '\@RateControlMethod.CQP\@' asigna valores fijos de QP en I-/P-/B-Frames,\n- '\@RateControlMethod.CBR\@' se mantiene en la tasa de bits objetivo (usando Datos de relleno) (recomendado para emisiones en directo),\n- '\@RateControlMethod.VBR\@' se mantiene por debajo de un pico de tasa de bits,\n- '\@RateControlMethod.VBRLAT\@' se mantiene cerca de la tasa de bits deseada si la latencia y carga de la GPU lo permite, si no se aumentará la tasa de bits (recomendado para grabaciones)."
127
+RateControlMethod.CQP="QP constante (CQP)"
128
+RateControlMethod.CBR="Flujo constante (CBR)"
129
+RateControlMethod.VBR="Flujo variable (pico restringido) (VBR)"
130
+RateControlMethod.VBRLAT="Flujo variable (latencia restringida) (VBRLAT)"
131
+PrePassMode="Modo de Pre-Paso"
132
+PrePassMode.Description="Pre-Paso es un pase de distribución de bitrate secundario que permite la mejor distribución de la velocidad de bits dentro de una secuencia, sin embargo sus efectos pueden variar según la tarjeta."
133
+PrePassMode.Quarter="\@Utility.switch.Enabled\@ (cuarto de tamaño)"
134
+PrePassMode.Half="\@Utility.switch.Enabled\@ (mitad de tamaño)"
135
+PrePassMode.Full="\@Utility.switch.Enabled\@ (tamaño completo)"
136
+Bitrate.Target="Tasa de bits deseada"
137
+Bitrate.Target.Description="Tasa de bits a intentar alcanzar en la secuencia general."
138
+Bitrate.Peak="Pico de tasa de bits"
139
+Bitrate.Peak.Description="Tasa de bits a intentar alcanzar como pico máximo en la secuencia general."
140
+QP.IFrame="I-Frame QP"
141
+QP.IFrame.Description="Valor fijo de QP para I-Frames."
142
+QP.PFrame="P-Frame QP"
143
+QP.PFrame.Description="Valor fijo de QP para P-Frames."
144
+QP.BFrame="B-Frame QP"
145
+QP.BFrame.Description="Valor fijo de QP para B-Frames."
146
+QP.Minimum="QP Mínimo"
147
+QP.Minimum.Description="Valor mas bajo de QP para utilizar en un fotograma."
148
+QP.IFrame.Minimum="I-Frame QP mínimo"
149
+QP.IFrame.Minimum.Description="Valor mas bajo de QP para utilizar en un I-Frame."
150
+QP.PFrame.Minimum="P-Frame QP mínimo"
151
+QP.PFrame.Minimum.Description="Valor mas bajo de QP para utilizar en un P-Frame."
152
+QP.Maximum="QP Máximo"
153
+QP.Maximum.Description="Valor mas alto de QP para utilizar en un fotograma."
154
+QP.IFrame.Maximum="I-Frame QP máximo"
155
+QP.IFrame.Maximum.Description="Valor mas alto de QP para utilizar en un I-Frame."
156
+QP.PFrame.Maximum="P-Frame QP máximo"
157
+QP.PFrame.Maximum.Description="Valor mas alto de QP para utilizar en un P-Frame."
158
+FillerData="Datos de relleno"
159
+FillerData.Description="Habilitando Datos de relleno se permite al codificador mantener por lo menos la \@Bitrate.Target\@ rellenando el espacio que falta con información sin valor."
160
+FrameSkipping="Omisión de fotogramas"
161
+FrameSkipping.Description="Omisión de fotogramas permite al codificador saltar fotogramas para cumplir con el requerimiento de la \@Bitrate.Target\@.\nCuando el codificador salta un fotograma insertará un NAL que repetirá el ultimo fotograma codificado en el stream.\nPuede ayudar con \@Bitrate.Target\@ muy bajas."
162
+VBAQ="VBAQ"
163
+VBAQ.Description="Habilitar el uso de 'Cuantizacion adaptativa basada en Varianza' (VBAQ) que se basa en la varianza del pixel para una mejor distribución del bitrate. \nFunciona con la idea de que el sistema visual humano es menos sensible a los artefactos en áreas altamente texturadas y así moverá el bitrate hacia superficies más suaves. \nHabilitando esto puede llevar a mejoras en la calidad subjetiva en cierto contenido."
164
+EnforceHRD="Forzar HRD"
165
+EnforceHRD.Description="Forzar el uso de un decodificador de referencia hipotético que se utiliza para verificar que el flujo de bits de salida es correcto."
166
+VBVBuffer="Buffer VBV"
167
+VBVBuffer.Description="Que método se debe usar para determinar el tamaño del buffer VBV:\n- '\@Utlity.Automatic\@' calcula el tamaño usando una restricción estricta,\n- '\@Utlity.Manual\@' permite al usuario controlar el tamaño.\nEl buffer VBV (Verificador de Buffering de Video) es usado por ciertos métodos de control del flujo para mantener la tasa de bits dentro de los parámetros establecidos."
168
+VBVBuffer.Strictness="Estricticidad del Buffer VBV"
169
+VBVBuffer.Strictness.Description="Determina la rigidez del Buffer VBV, con 100% siendo tan estricto como sea posible y 0% sin restricción."
170
+VBVBuffer.Size="Tamaño de buffer VBV"
171
+VBVBuffer.Size.Description="Tamaño del Buffer VBV que se utiliza para el control de Bitrate en una secuencia."
172
+VBVBuffer.InitialFullness="Amplitud Inicial del Buffer VBV"
173
+VBVBuffer.InitialFullness.Description="Como de lleno es el buffer VMV inicialmente (en %), solo afectará a la secuencia inicial de la codificación."
174
+KeyframeInterval="Intervalo de fotogramas clave"
175
+KeyframeInterval.Description="Intervalo (en segundos) entre fotogramas clave."
176
+H264.IDRPeriod="Período de IDR (en fotogramas)"
177
+H264.IDRPeriod.Description="Define la distancia entre Instantaneous Decoding Refreshes (IDR) en Fotogramas. También controla el tamaño de la secuencia del GOP."
178
+H265.IDRPeriod="Período de IDR (en GOP's)"
179
+H265.IDRPeriod.Description="Define la distancia entre Instantaneous Decoding Refreshes (IDR) en GOPs."
180
+GOP.Type="Tipo de GOP"
181
+GOP.Type.Description="Qué tipo de GOP se debe utilizar: \n - ' \@GOP. Type.Fixed\@' utilizará siempre distancias fijas entre cada GOP. \n - ' \@GOP. Type.Variable\@' permite GOPs de diferentes tamaños, dependiendo de lo que se necesite.\n'\@GOP. Type.Fixed\@' es cómo los trabajos de implementación H264 y lo mejor para los streaming en red local, mientras que ' \@GOP. Type.Variable\@' es el mejor para grabaciones de alta calidad de bajo tamaño."
182
+GOP.Type.Fixed="Fijo"
183
+GOP.Type.Variable="Variable"
184
+GOP.Size="Tamaño del GOP"
185
+GOP.Size.Description="Tamaño máximo de un GOP (grupo de imagenes) en fotogramas."
186
+GOP.Size.Minimum="Tamaño mínimo tamaño de GOP"
187
+GOP.Size.Minimum.Description="Tamaño mínimo de un GOP (grupo de imágenes) en fotogramas."
188
+GOP.Size.Maximum="Tamaño mínimo de GOP"
189
+GOP.Size.Maximum.Description="Tamaño máximo de un GOP (grupo de imagenes) en fotogramas."
190
+GOP.Alignment="Alineación del GOP"
191
+GOP.Alignment.Description="Experimental, los efectos son desconocidos. Usar bajo su propio riesgo."
192
+BFrame.Pattern="Patrón de B-Frame"
193
+BFrame.Pattern.Description="La cantidad de B-Frames a usar mientras se codifica.\nSoportado por tarjetas de 2ª y 3ª generación de VCE. Impacto negativo en el rendimiento de codificación."
194
+BFrame.DeltaQP="Delta QP en B-Frames"
195
+BFrame.DeltaQP.Description="Valor Delta QP para el ultimo I- o P-Frame para B-Frames no referenciables."
196
+BFrame.Reference="Referencia de B-Frames"
197
+BFrame.Reference.Description="Permitir a un B-Frame utilizar también B-Frames como referencia, en lugar de P - y I-Frames."
198
+BFrame.ReferenceDeltaQP="Delta QP en B-Frames de referencia"
199
+BFrame.ReferenceDeltaQP.Description="Valor Delta QP para el ultimo I- o P-Frame para B-Frames referenciables."
200
+DeblockingFilter="Filtro de eliminación de bloques"
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/eu-ES.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/eu-ES.ini
Changed
114
1
2
-AMF.Util.Default="Lehenetsia"
3
-AMF.Util.Automatic="Automatikoa"
4
-AMF.Util.Manual="Eskuz"
5
-AMF.Util.Toggle.Disabled="Ezgaituta"
6
-AMF.Util.Toggle.Enabled="Gaituta"
7
-AMF.H264.Preset="Aurrezarrita"
8
-AMF.H264.Preset.ResetToDefaults="Berrezarri balio lehenetsiak"
9
-AMF.H264.Preset.Recording="Grabatzen"
10
-AMF.H264.Preset.HighQuality="Kalitate handia"
11
-AMF.H264.Preset.Indistinguishable="Sumaezina"
12
-AMF.H264.Preset.Lossless="Galerarik gabe"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Erabilpena"
16
-AMF.H264.Usage.Description="AMFrentzat zer erabilerak aukeratu behar dira:\n- 'Transcoding' oro har proposatzen da transmisiorako (gomendatua),\n- 'Ultra Low Latency' latentzia oso baxuko kodetzerako,\n- 'Low Latency' aurrekoaren antzekoa da latentzia apur bat handiagoarekin.\nStreaming bakarrik onartzen du 'Transcoding', gainerako balio guztiak erabili daitezke grabaziorako."
17
-AMF.H264.Usage.Transcoding="Kodeketa"
18
-AMF.H264.Usage.UltraLowLatency="Latentzia oso txikia"
19
-AMF.H264.Usage.LowLatency="Latentzia txikia"
20
-AMF.H264.QualityPreset="Aurrezarritako kalitatea"
21
-AMF.H264.QualityPreset.Speed="Abiadura"
22
-AMF.H264.QualityPreset.Balanced="Orekatua"
23
-AMF.H264.QualityPreset.Quality="Kalitatea"
24
-AMF.H264.Profile="Profila"
25
-AMF.H264.ProfileLevel="Profilaren maila"
26
-AMF.H264.ProfileLevel.Description="H.264 profilaren zein maila erabili behar da kodetzeko:\n- 'Automatic' automatikoki kalkulatzen du emandako abiadura eta fotogramen tamainarako egokiena,\n- '4.1'-ek onartzen du 1920x1080 30FPS, 1280x720 60FPS, 960x540 90FPS\n- '4.2'-k onartzen du 1920x1080 60FPS, 1280x720 120FPS\n- '5.0'-k onartzen du 1920x1080 60FPS, 1280x720 144FPS, 960x540 172FPS\n- '5.1'-k onartzen du 3840x2160 30FPS, 1920x1080 120FPS, 1280x720 172FPS, 960x540 172FPS\n- '5.2'-k onartzen du 3840x2160 60FPS, 1920x1080 172FPS, 1280x720 172FPS, 960x540 172FPS"
27
-AMF.H264.RateControlMethod="Emaria kontrolatzeko metodoa"
28
-AMF.H264.RateControlMethod.CQP="Konstantea QP (CQP)"
29
-AMF.H264.RateControlMethod.CBR="Bit emari konstantea (CBR)"
30
-AMF.H264.RateControlMethod.VBR.Peak="Bit emari aldakorra (gailur mugatuak) (VBR)"
31
-AMF.H264.RateControlMethod.VBR.Latency="Bit emari aldakorra (Latentzia mugatua) (VBR_LAT)"
32
-AMF.H264.Bitrate.Target="Bit emari helburua"
33
-AMF.H264.Bitrate.Peak="Gehienezko gailurra"
34
-AMF.H264.QP.Minimum="Gutxieneko QP"
35
-AMF.H264.QP.Maximum="Gehienezko QP"
36
-AMF.H264.QP.IFrame="I-Frame QP"
37
-AMF.H264.QP.PFrame="P-Frame QP"
38
-AMF.H264.QP.BFrame="B-Frame QP"
39
-AMF.H264.VBVBuffer="VBV bufferra"
40
-AMF.H264.VBVBuffer.Strictness="VBV bufferraren zorroztasuna"
41
-AMF.H264.VBVBuffer.Size="VBV bufferraren tamaina"
42
-AMF.H264.VBVBuffer.Fullness="VBV bufferraren betetasuna"
43
-AMF.H264.FillerData="Datu betegarria"
44
-AMF.H264.FrameSkipping="Fotogramen saltoa"
45
-AMF.H264.EnforceHRDCompatibility="Behartu HRD bateragarritasuna"
46
-AMF.H264.KeyframeInterval="Gako fotogramen tartea"
47
-AMF.H264.IDRPeriod="IDR periodoa"
48
-AMF.H264.DeblockingFilter="Desblokeoko iragazkia"
49
-AMF.H264.ScanType="Eskaneatze mota"
50
-AMF.H264.ScanType.Description="Erabili behar den eskaneatze metodoa, utzi beti '\@AMF.H264.ScanType.Progressive\@'."
51
-AMF.H264.ScanType.Progressive="Progresiboa"
52
-AMF.H264.ScanType.Interlaced="Gurutzelarkatua"
53
-AMF.H264.MotionEstimation="Mugimenduaren estimazioa"
54
-AMF.H264.MotionEstimation.None="Ezer ez"
55
-AMF.H264.MotionEstimation.Half="Pixel erdia"
56
-AMF.H264.MotionEstimation.Quarter="Pixel laurdena"
57
-AMF.H264.MotionEstimation.Both="Pixel erdia eta laurdena"
58
-AMF.H264.CodingType="Kodetze mota"
59
+Utility.Default="Lehenetsia"
60
+Utility.Automatic="Automatikoa"
61
+Utility.Manual="Eskuz"
62
+Utility.Switch.Disabled="Ezgaituta"
63
+Utility.Switch.Enabled="Gaituta"
64
+Preset="Aurrezarrita"
65
+Preset.ResetToDefaults="Berrezarri balio lehenetsiak"
66
+Preset.Recording="Grabatzen"
67
+Preset.HighQuality="Kalitate handia"
68
+Preset.Indistinguishable="Sumaezina"
69
+Preset.Lossless="Galerarik gabe"
70
+Preset.Twitch="Twitch"
71
+Preset.YouTube="YouTube"
72
+Usage="Erabilpena"
73
+Usage.Transcoding="Transkodetzen"
74
+Usage.UltraLowLatency="Latentzia ultra-txikia"
75
+Usage.LowLatency="Latentzia txikia"
76
+Usage.Webcam="Web-kamera"
77
+QualityPreset="Aurrezarritako kalitatea"
78
+QualityPreset.Speed="Abiadura"
79
+QualityPreset.Balanced="Orekatua"
80
+QualityPreset.Quality="Kalitatea"
81
+Profile="Profila"
82
+Profile.Description="Zein profila erabili nahi duzu kodetzeko, laguntza zabalduenetik kalitate handienera ordenatuta."
83
+ProfileLevel="Profil maila"
84
+ProfileLevel.Description="Zein profil maila erabili nahi duzu kodetzeko, gomendatzen da uztea \@Utility.Automatic\@"
85
AMF.H264.MaximumLTRFrames="Gehienezko LTR fotogramak"
86
AMF.H264.MaximumAccessUnitSize="Sarbide unitatearen gehienezko tamaina"
87
AMF.H264.HeaderInsertionSpacing="Goiburuak txertatzeko tartea"
88
AMF.H264.WaitForTask.Description="Ezezaguna, esperimentala"
89
-AMF.H264.PreAnalysisPass.Description="Ezezaguna, esperimentala"
90
-AMF.H264.VBAQ.Description="Ezezaguna, esperimentala"
91
-AMF.H264.GOPSize.Description="Ezezaguna, esperimentala"
92
-AMF.H264.GOPAlignment.Description="Ezezaguna, esperimentala"
93
-AMF.H264.MaximumReferenceFrames.Description="Ezezaguna, esperimentala"
94
AMF.H264.SlicesPerFrame="Zatiak fotogramako"
95
AMF.H264.SliceMode.Description="Ezezaguna, esperimentala"
96
AMF.H264.MaximumSliceSize.Description="Ezezaguna, esperimentala"
97
AMF.H264.SliceControlMode.Description="Ezezaguna, esperimentala"
98
AMF.H264.SliceControlSize.Description="Ezezaguna, esperimentala"
99
AMF.H264.IntraRefresh.NumberOfStripes.Description="Ezezaguna, esperimentala"
100
-AMF.H264.VideoAPI="Bideo APIa"
101
-AMF.H264.VideoAPI.Description="Zein API erabili kodeketarako."
102
-AMF.H264.VideoAdapter="Bideo egokigailua"
103
-AMF.H264.VideoAdapter.Description="Zein egokigailu erabili kodeketarako."
104
-AMF.H264.OpenCL="OpenCL"
105
-AMF.H264.OpenCL.Description="Kodetzaileak OpenCL erabili behar du banakako fotogramak bidaltzeko?"
106
-AMF.H264.View="Ikuspegia"
107
-AMF.H264.View.Description="Zein propietate ikusi behar dira. Ez duzu laguntzarik jasoko 'Aditu' edo 'Maisu' ikuspegian."
108
-AMF.H264.View.Basic="Oinarrizkoa"
109
-AMF.H264.View.Advanced="Aurreratua"
110
-AMF.H264.View.Expert="Aditu"
111
-AMF.H264.View.Master="Maixu"
112
-AMF.H264.Debug="Garbiketa"
113
114
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/fi-FI.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/fi-FI.ini
Changed
201
1
2
-AMF.Util.Default="Oletusarvo"
3
-AMF.Util.Automatic="Automaattinen"
4
-AMF.Util.Manual="Manuaalinen"
5
-AMF.Util.Toggle.Disabled="Pois käytöstä"
6
-AMF.Util.Toggle.Enabled="Käytössä"
7
-AMF.H264.Preset="Esiasetus"
8
-AMF.H264.Preset.ResetToDefaults="Palauta oletukset"
9
-AMF.H264.Preset.Recording="Tallennus"
10
-AMF.H264.Preset.HighQuality="Korkea laatu"
11
-AMF.H264.Preset.Indistinguishable="Erottamaton"
12
-AMF.H264.Preset.Lossless="Häviötön"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Käyttö"
16
-AMF.H264.Usage.Transcoding="Transkoodaus"
17
-AMF.H264.Usage.UltraLowLatency="Erittäin alhainen latenssi"
18
-AMF.H264.Usage.LowLatency="Alhainen latenssi"
19
-AMF.H264.QualityPreset="Laatuasetus"
20
-AMF.H264.QualityPreset.Speed="Nopeus"
21
-AMF.H264.QualityPreset.Balanced="Tasapainotettu"
22
-AMF.H264.QualityPreset.Quality="Laatu"
23
-AMF.H264.Profile="Profiili"
24
-AMF.H264.ProfileLevel="Profiilin taso"
25
-AMF.H264.RateControlMethod="Rate Control -tapa"
26
-AMF.H264.RateControlMethod.CQP="Pysyvä QP (CQP)"
27
-AMF.H264.RateControlMethod.CBR="Jatkuva bitrate (CBR)"
28
-AMF.H264.RateControlMethod.VBR.Peak="Vaihteleva bitrate (Piikkiin sidottu) (VBR)"
29
-AMF.H264.RateControlMethod.VBR.Latency="Vaihteleva bitrate (Latenssiin sidottu) (VBR_LAT)"
30
-AMF.H264.Bitrate.Target="Bitrate-tavoite"
31
-AMF.H264.Bitrate.Peak="Bitrate-piikki"
32
-AMF.H264.QP.Minimum="Minimi QP"
33
-AMF.H264.QP.Maximum="Maksimi QP"
34
-AMF.H264.QP.IFrame="I-Frame QP"
35
-AMF.H264.QP.PFrame="P-Frame QP"
36
-AMF.H264.QP.BFrame="B-Frame QP"
37
-AMF.H264.VBVBuffer="VBV-puskuri"
38
-AMF.H264.VBVBuffer.Size="VBV-puskurin koko"
39
-AMF.H264.FillerData="Täyttödata"
40
-AMF.H264.FrameSkipping="Ruudun ohitus"
41
-AMF.H264.EnforceHRDCompatibility="Pakota HRD-yhteensopivuus"
42
-AMF.H264.DeblockingFilter="Deblocking filtteri"
43
-AMF.H264.ScanType="Skannaustyyppi"
44
-AMF.H264.ScanType.Progressive="Progressiivinen"
45
-AMF.H264.ScanType.Interlaced="Lomitettu"
46
-AMF.H264.MotionEstimation="Liikkeen ennakointi"
47
-AMF.H264.MotionEstimation.None="Ei mitään"
48
-AMF.H264.View="Näyttötila"
49
-AMF.H264.View.Basic="Yksinkertainen"
50
-AMF.H264.View.Advanced="Kehittynyt"
51
-AMF.H264.View.Expert="Expertti"
52
-AMF.H264.View.Master="Jumalallinen"
53
-AMF.H264.Debug="Debug"
54
+Utility.Default="Oletusarvo"
55
+Utility.Automatic="Automaattinen"
56
+Utility.Manual="Manuaalinen"
57
+Utility.Switch.Disabled="Pois käytöstä"
58
+Utility.Switch.Enabled="Käytössä"
59
+Preset="Esiasetus"
60
+Preset.ResetToDefaults="Palauta oletukset"
61
+Preset.Recording="Tallennus"
62
+Preset.HighQuality="Korkea laatu"
63
+Preset.Indistinguishable="Erottamaton"
64
+Preset.Lossless="Häviötön"
65
+Preset.Twitch="Twitch"
66
+Preset.YouTube="YouTube"
67
+Usage="Käyttö"
68
+Usage.Description="Mihin käyttöön AMF säädetään:\n- \"\@Usage.Transcoding\@\" on yleiseen käyttöön soveltuva transkooderi (suositeltu),\n- \"\@Usage.UltraLowLatency\@\" on todella matalan viiveen enkoodaukseen,\n- \"\@Usage.LowLatency\@\" on vastaavanlainen ylemmän kanssa, mutta hieman suuremmalla viiveellä.\nSuora lähettäminen tukee pelkästään \"\@Usage.Transcoding\@\", muita arvoja voidaan käyttää tallentamiseen."
69
+Usage.Transcoding="Transkoodaus"
70
+Usage.UltraLowLatency="Erittäin alhainen latenssi"
71
+Usage.LowLatency="Alhainen latenssi"
72
+Usage.Webcam="Web-kamera"
73
+QualityPreset="Laatuasetus"
74
+QualityPreset.Description="Minkä laadun esiasetusta AMF asetetaan tavoittelemaan:\n- \"\@QualityPreset.Speed\@\" on nopein, mutta huonoimmalla laadulla,\n- \"\@QualityPreset.Balanced\@\" on tasapainotettu sekoitus molempia,\n- \"\@QualityPreset.Quality\@\" antaa parhaan laadun annetulle bitratelle."
75
+QualityPreset.Speed="Nopeus"
76
+QualityPreset.Balanced="Tasapainotettu"
77
+QualityPreset.Quality="Laatu"
78
+Profile="Profiili"
79
+Profile.Description="Mitä profiilia käytetään enkoodaukseen. Lajiteltuna parhaiten tuetusta (yläosa) parhaaseen laatuun (alaosa)."
80
+ProfileLevel="Profiilin taso"
81
+ProfileLevel.Description="Mitä profiilin tasoa käytetään. Tämä on parasta jättää \@Utility.Automatic\@."
82
+Tier="Tier -taso"
83
+Tier.Description="Millä tier tasolla enkoodataan. \"High\" pyrkii korkean bitraten/siirtonopeuden käyttöön ja \"Main\" sen sijaan on suunnattu yleiseen mediaan."
84
+AspectRatio="Kuvasuhde"
85
+AspectRatio.Description="Mikä kuvasuhde kirjataan kohdetiedostoon."
86
+CodingType="Koodaustyyppi"
87
+CodingType.Description="Millaista koodausta käytetään:\n* \"\@Utility.Automatic\@\" antaa AMF:n päättää (suositeltu).\n* \"CALVC\" (Context-Adaptive Variable-Length Coding) on nopeampi, mutta vie enemmän tilaa.\n* \"CABAC\" (Context-Adaptive Binary Arithmetic Coding) on hitaampi, mutta vie vähemmän tilaa."
88
+MaximumReferenceFrames="Referenssi framejen enimmäismäärä"
89
+MaximumReferenceFrames.Description="Montako framea enkooderi voi referoida enintään enkoodatessa, asetuksella on suora vaikutus enkoodauksen laatuun."
90
+RateControlMethod="Rate Control -tapa"
91
+RateControlMethod.Description="Mitä rate control tapaa käytetään:\n- \"\@RateControlMethod.CQP\@\" käyttää kiinteitä I-/P-/B-Frame QP arvoja,\n- \"\@RateControlMethod.CBR\@\" pysyttelee annetussa kohde-bitratessa (käyttäen täytedataa) (suositeltu suoraan lähetykseen),\n- \"\@RateControlMethod.VBR\@\" pysyttelee annetun korkeimman bitraten alla,\n- \"\@RateControlMethod.VBRLAT\@\" pysyttelee lähellä kohde bitratea, mikäli GPU viive ja kuormitus antaa myöten, muussa tapauksessa käyttää korkeampaa bitratea (suositeltu tallentamiseen)."
92
+RateControlMethod.CQP="Jatkuva QP (CQP)"
93
+RateControlMethod.CBR="Jatkuva bitrate (CBR)"
94
+RateControlMethod.VBR="Vaihteleva bitrate (Piikkiin sidottu) (VBR)"
95
+RateControlMethod.VBRLAT="Vaihteleva bitrate (Latenssiin sidottu) (VBRLAT)"
96
+PrePassMode="Pre-Pass -tila"
97
+PrePassMode.Description="Pre-Pass on toissijainen bitraten jaottelun läpikäynti, joka mahdollistaa paremman bitraten jaottelun ketjussa, vaikutus voi kuitenkin vaihdella eri korteilla."
98
+PrePassMode.Quarter="\@Utility.Switch.Enabled\@ (neljännesosa)"
99
+PrePassMode.Half="\@Utility.Switch.Enabled\@ (puolikas)"
100
+PrePassMode.Full="\@Utility.Switch.Enabled\@ (kokonainen)"
101
+Bitrate.Target="Bitrate-tavoite"
102
+Bitrate.Target.Description="Bitrate johon tähdätään kokonaisketjussa."
103
+Bitrate.Peak="Bitrate-piikki"
104
+Bitrate.Peak.Description="Korkein bitrate johon tähdätään kokonaisketjussa."
105
+QP.IFrame="I-Frame QP"
106
+QP.IFrame.Description="Kiinteä QP-arvo I-frameille."
107
+QP.PFrame="P-Frame QP"
108
+QP.PFrame.Description="Kiinteä QP-arvo P-frameille."
109
+QP.BFrame="B-Frame QP"
110
+QP.BFrame.Description="Kiinteä QP-arvo B-frameille."
111
+QP.Minimum="Matalin QP"
112
+QP.Minimum.Description="Matalin QP-arvo frameille."
113
+QP.IFrame.Minimum="Matalin I-Frame QP"
114
+QP.IFrame.Minimum.Description="Matalin QP-arvo I-frameille."
115
+QP.PFrame.Minimum="Matalin P-Frame QP"
116
+QP.PFrame.Minimum.Description="Matalin QP-arvo P-frameille."
117
+QP.Maximum="Korkein QP"
118
+QP.Maximum.Description="Korkein QP-arvo frameille."
119
+QP.IFrame.Maximum="Korkein I-Frame QP"
120
+QP.IFrame.Maximum.Description="Korkein QP-arvo I-frameille."
121
+QP.PFrame.Maximum="Korkein P-Frame QP"
122
+QP.PFrame.Maximum.Description="Korkein QP-arvo P-frameille."
123
+FillerData="Täytedata"
124
+FillerData.Description="Täytedatan käyttöönotolla enkooderi pitää vähintään \@Bitrate.Target\@ täyttämällä jäljelle jääneen tilan ketjussa tyhjällä informaatiolla."
125
+FrameSkipping="Frame-ohitus"
126
+FrameSkipping.Description="Ruutujen ohituksella enkooderi voi pudottaa frameja täyttääkseen \@Bitrate.Target\@ vaatimukset.\nPudottaessaan framen enkooderi syöttää sen sijaan toistetun viimeisen NAL -framen striimiin.\nVoi auttaa jos käytössä on erittäin matala \@Bitrate.Target\@ vaatimus."
127
+VBAQ="VBAQ"
128
+VBAQ.Description="Ota käyttöön \"Variance Based Adaptive Quantization\" (VBAQ) joka pohjautuu pikselien vaihteluun bitraten jakamisen helpottamiseksi.\nSe toimii idealla jossa ihmissilmä on herkempi kuvan virheille tasaisissa kohdissa, jolloin bitrate kohdistetaan näille alueille.\nKäyttämällä tätä laatu saattaa parantua tietynlaista sisältöä näytettäessä."
129
+EnforceHRD="Pakota HRD"
130
+EnforceHRD.Description="Pakota hypoteettisen referenssi dekooderin käyttö, jota käytetään varmistamaan, että ulostulon bittistriimi on oikea."
131
+VBVBuffer="VBV-puskuri"
132
+VBVBuffer.Description="Mitä tapaa käytetään määrittämään VBV puskurin koko:\n- \"\@Utility.Automatic\@\" laskee koon käyttäen täsmällistä rajausta,\n- \"\@Utlity.Manual\@\" antaa käyttäjän ohjata kokoa.\nVBV (Video Buffering Verifier) puskuria käytetään joissakin Rate Control tavoissa pitämään kokonaisbitrate annettujen rajojen sisällä."
133
+VBVBuffer.Strictness="VBV-puskurin tiukkuus"
134
+VBVBuffer.Strictness.Description="Määrittelee VBV puskurin tiukkuuden, 100% on niin tarkka kuin mahdollista ja 0% on rajoittamaton."
135
+VBVBuffer.Size="VBV-puskurin koko"
136
+VBVBuffer.Size.Description="VBV-puskurin koko jota käytetään ketjussa bitraten säädössä."
137
+VBVBuffer.InitialFullness="VBV-puskurin alustava täysinäisyys"
138
+VBVBuffer.InitialFullness.Description="VBV-puskurin alustavan täysinäisyyden suuruus (%), vaikuttaa vain alustavaan enkoodausketjuun."
139
+KeyframeInterval="Keyframe -väli"
140
+KeyframeInterval.Description="Aikaväli (sekunteina) keyframejen välissä."
141
+H264.IDRPeriod="IDR-ajanjakso (frameina)"
142
+H264.IDRPeriod.Description="Määrittää etäisyyden Instantaneous Decoding Refreshes (IDR) välillä frameissa. Säätää myös GOP-ketjun kokoa."
143
+H265.IDRPeriod="IDR-ajanjakso (GOP)"
144
+H265.IDRPeriod.Description="Määrittää etäisyyden Instantaneous Decoding Refreshes (IDR) välillä GOP:seissa."
145
+GOP.Type="GOP-tyyppi"
146
+GOP.Type.Description="Millaista GOP-tyyppiä käytetään:\n- \"\@GOP.Type.Fixed\@\" käyttää aina kiinteää väliä jokaisen GOP:n välillä.\n- \"\@GOP.Type.Variable\@\" sallii eri kokoisia GOP-arvoja, tarpeesta riippuen.\n\"\@GOP.Type.Fixed\@\" on kuinka H264 toteutus toimii ja on paras paikallisen verkon suoralähetyksessä, kunnes taas \"\@GOP.Type.Variable\@\" on paras pienikokoiseen korkealaatuiseen tallentamiseen."
147
+GOP.Type.Fixed="Kiinteä"
148
+GOP.Type.Variable="Muuttuva"
149
+GOP.Size="GOP-koko"
150
+GOP.Size.Description="GOP:n (Group Of Pictures) koko frameissa."
151
+GOP.Size.Minimum="Matalin GOP koko"
152
+GOP.Size.Minimum.Description="Pienin GOP (Group of Pictures) koko frameissa."
153
+GOP.Size.Maximum="Suurin GOP koko"
154
+GOP.Size.Maximum.Description="Suurin GOP (Group of Pictures) koko frameissa."
155
+GOP.Alignment="GOP kohdistus"
156
+GOP.Alignment.Description="Kokeellinen, vaikutuksia ei ole tiedossa. Käytä omalla vastuullasi."
157
+BFrame.Pattern="B-Frame kuvio"
158
+BFrame.Pattern.Description="Käytettävien B-Framejen määrä enkoodauksessa.\nTuettu 2. ja 3. sukupolven VCE korteissa. Negatiivinen vaikutus enkoodauksen suorituskykyyn."
159
+BFrame.DeltaQP="B-Frame Delta QP"
160
+BFrame.DeltaQP.Description="Delta QP arvo viimeiseen I- tai P-Frameen ei-referoitavissa oleville B-Frameille."
161
+BFrame.Reference="B-Frame referenssi"
162
+BFrame.Reference.Description="Salli B-Framejen käyttää myös toisia B-Frameja referenssinä pelkkien P- ja I-Framejen sijasta."
163
+BFrame.ReferenceDeltaQP="B-Frame referenssi Delta QP"
164
+BFrame.ReferenceDeltaQP.Description="Delta QP arvo viimeiseen I- tai P-Frameen referoitavissa oleville B-Frameille."
165
+DeblockingFilter="Deblocking suodatin"
166
+DeblockingFilter.Description="Salli dekooderin käyttää Deblocking suodatinta."
167
+MotionEstimation="Liikkeen arviointi"
168
+MotionEstimation.Description="Liikkeen arviointi mahdollistaa enkooderin vähentää tarvittavaa bitratea arvioimalla pikselin kulkusuunnan."
169
+MotionEstimation.Quarter="Neljännes-pikseli"
170
+MotionEstimation.Half="Puoli-pikseli"
171
+MotionEstimation.Full="Neljännes- & Puolikas-pikseli"
172
+Video.API="Video API"
173
+Video.API.Description="Mitä APIa käytetään backendillä?"
174
+Video.Adapter="Näytönohjain"
175
+Video.Adapter.Description="Millä näytönohjaimella yritetään enkoodata?"
176
+OpenCL="OpenCL"
177
+OpenCL.Description="Käytetäänkö OpenCL:ää framejen toimittamiseen? Teknisesti nopeampi, mutta aiheuttaa ongelmia Intelin ajurien kanssa (Epäyhteensopivien OpenCL kirjastojen kanssa)."
178
+View="Katselutila"
179
+View.Description="Mitä ominaisuuksia näytetään?\nKäyttämällä \"\@View.Master\@\" menetät oikeutesi saada tukea."
180
+View.Basic="Yksinkertainen"
181
+View.Advanced="Kehittynyt"
182
+View.Expert="Expertti"
183
+View.Master="Mestarillinen"
184
+Debug="Debug"
185
+Debug.Description="Ota käyttöön lisää debuggaus viestejä. Vaatii Open Broadcaster Software Studion käynnistämisen komentorivillä \"--verbose --log_unfiltered\" (ilman heittomerkkejä)."
186
+AMF.H264.MaximumLTRFrames="Maksimimäärä LTR frameja"
187
+AMF.H264.MaximumLTRFrames.Description="Pitkäaikaiset referenssi framet (LTR) on ominaisuus, jolla enkooderi voi merkitä tiettyjä frameja ketjussa referoitaviksi pitemmän aikaa.\nLTR frameja ei voida käyttää B-Framejen kanssa ja enkooderi ottaa B-Framet pois käytöstä mikäli ne ovat käytössä."
188
+AMF.H264.MaximumAccessUnitSize="Maksimi Access Unit koko"
189
+AMF.H264.MaximumAccessUnitSize.Description="Suurin Access Unit koko NAL:lle."
190
+AMF.H264.HeaderInsertionSpacing="Header Insertion Spacing"
191
+AMF.H264.HeaderInsertionSpacing.Description="How many frames should be between NAL headers."
192
+AMF.H264.WaitForTask="Wait For Task"
193
+AMF.H264.WaitForTask.Description="Unknown, Experimental"
194
+AMF.H264.SlicesPerFrame="Slices Per Frame"
195
+AMF.H264.SlicesPerFrame.Description="How many I-Frame slices should be stored with each frame?\nA value of zero lets the encoder decide on the fly.\nIntra-Refresh encoding is used for faster playback and seeking."
196
+AMF.H264.SliceMode="Slice Mode"
197
+AMF.H264.SliceMode.Description="Unknown, Experimental"
198
+AMF.H264.MaximumSliceSize="Maximum Slice Size"
199
+AMF.H264.MaximumSliceSize.Description="Unknown, Experimental"
200
+AMF.H264.SliceControlMode="Slice Control Mode"
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/fr-FR.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/fr-FR.ini
Changed
121
1
2
-AMF.Util.Default="Défaut"
3
-AMF.Util.Automatic="Automatique"
4
-AMF.Util.Manual="Manuel"
5
-AMF.Util.Toggle.Disabled="Désactivé"
6
-AMF.Util.Toggle.Enabled="Activé"
7
-AMF.H264.Preset="Préréglage"
8
-AMF.H264.Preset.ResetToDefaults="Valeurs par défaut"
9
-AMF.H264.Preset.Recording="Enregistrement"
10
-AMF.H264.Preset.HighQuality="Qualité élevée"
11
-AMF.H264.Preset.Indistinguishable="Indifférenciable"
12
-AMF.H264.Preset.Lossless="Sans pertes"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Mode"
16
-AMF.H264.Usage.Description="Le mode d'optimisation utilisé par AMF :\n- '\@AMF.H264.Usage.Transcoding\@' : utilisation pour du transcodage (réglage recommandé),\n- '\@AMF.H264.Usage.UltraLowLatency\@' : encodage à très faible latence,\n- '\@AMF.H264.Usage.LowLatency\@' : quasiment identique au réglage ci-dessus, avec une latence légèrement plus élevée.\nLe streaming n'est possible qu'en mode '\@AMF.H264.Usage.Transcoding\@', l'enregistrement est possible avec tous les autres modes."
17
-AMF.H264.Usage.Transcoding="Transcodage"
18
-AMF.H264.Usage.UltraLowLatency="Très faible latence"
19
-AMF.H264.Usage.LowLatency="Faible latence"
20
-AMF.H264.QualityPreset="Préréglages de qualité"
21
-AMF.H264.QualityPreset.Description="Le préréglage de qualité qu'AMF doit cibler :\n- \"\@AMF.H264.QualityPreset.Speed\@\" est le plus rapide, au détriment d'une qualité déplorable,\n- \"\@AMF.H264.QualityPreset.Balanced\@\" est un compromis entre \"\@AMF.H264.QualityPreset.Speed\@\" et \"\@AMF.H264.QualityPreset.Quality\@\",\n- \"\@AMF.H264.QualityPreset.Quality\@\" délivre la meilleure qualité pour un débit donné."
22
-AMF.H264.QualityPreset.Speed="Vitesse"
23
-AMF.H264.QualityPreset.Balanced="Equilibré"
24
-AMF.H264.QualityPreset.Quality="Qualité"
25
-AMF.H264.Profile="Profil"
26
-AMF.H264.Profile.Description="Le profil H.264 utilisé pour l'encodage :\n- 'Baseline' est compatible avec la majorité des lecteurs,\n-'Main' est compatible avec les lecteurs d'ancienne génération (recommandé pour les lecteurs mobiles),\n- 'High' est compatible avec la plupart des lecteurs récents (réglage recommandé pour la plupart des cas)."
27
-AMF.H264.ProfileLevel="Niveau de profil"
28
-AMF.H264.ProfileLevel.Description="Quel niveau de profil H.264 utiliser pour l'encodage :\n- \"Automatique\" laisse l'encodeur déterminer le meilleur profil en fonction de la résolution d'image et du nombre d'images par seconde.\n- \"4.1\" supporte les formats suivants : 1920x1080 30FPS, 1280x720 60FPS, 960x540 90FPS\n- \"4.2\" supporte les formats suivants : 1920x1080 60FPS, 1280x720 120FPS, 960x540 172FPS\n- \"5.0\" supporte les formats suivants : 1920x1080 60FPS, 1280x720 144FPS, 960x540 172FPS\n- \"5.1\" supporte les formats suivants : 3840x2160 30FPS, 1920x1080 120FPS, 1280x720 172FPS, 960x540 172FPS\n- \"5.2\" supporte les formats suivants : 3840x2160 60FPS, 1920x1080 172FPS, 1280x720 172FPS, 960x540 172FPS"
29
-AMF.H264.RateControlMethod="Méthode de contrôle du débit"
30
-AMF.H264.RateControlMethod.CQP="QP constant (CQP)"
31
-AMF.H264.RateControlMethod.CBR="Débit constant (CBR)"
32
-AMF.H264.RateControlMethod.VBR.Peak="Débit Variable (maximum) (VBR)"
33
-AMF.H264.RateControlMethod.VBR.Latency="Débit Variable (latence limitée) (VBR_LAT)"
34
-AMF.H264.Bitrate.Target="Débit cible"
35
-AMF.H264.Bitrate.Target.Description="Le débit de données sortantes que l'encodeur va essayer de respecter pendant l'encodage."
36
-AMF.H264.Bitrate.Peak="Débit maximal"
37
-AMF.H264.Bitrate.Peak.Description="Le débit de données sortantes que l'encodeur va essayer de respecter pendant l'encodage."
38
-AMF.H264.QP.Minimum="QP minimal"
39
-AMF.H264.QP.Maximum="QP maximal"
40
-AMF.H264.QP.IFrame="QP I-Frame"
41
-AMF.H264.QP.PFrame="QP P-Frame"
42
-AMF.H264.QP.BFrame="QP B-Frame"
43
-AMF.H264.VBVBuffer="Tampon VBV"
44
-AMF.H264.VBVBuffer.Description="Quelle méthode utiliser pour déterminer la taille du tampon VBV :\n- \"\@AMF.Util.Automatic\@\" calcule la taille en fonction de la valeur de respect du tampon,\n- \"\@AMF.Util.Manual\@\" laisse le choix de la taille à l'utilisateur.\nLe tampon VBV (Video Buffering Verifier) est utilisé par certaines méthodes de contrôle du débit pour assurer au mieux le respect des contraintes données."
45
-AMF.H264.VBVBuffer.Strictness="Respect du tampon VBV"
46
-AMF.H264.VBVBuffer.Size="Taille du tampon VBV"
47
-AMF.H264.VBVBuffer.Fullness="Remplissage du tampon VBV"
48
-AMF.H264.FillerData="Données de remplissage"
49
-AMF.H264.FrameSkipping="Saut d'images"
50
-AMF.H264.EnforceHRDCompatibility="Appliquer la compatibilité avec l'HRD"
51
-AMF.H264.KeyframeInterval="Intervalle d'images-clé"
52
-AMF.H264.IDRPeriod="Périodicité des trames IDR"
53
-AMF.H264.DeblockingFilter="Filtre de dégroupage"
54
-AMF.H264.ScanType="Balayage"
55
-AMF.H264.ScanType.Description="La méthode de balayage à utiliser (laissez cette valeur sur \"\@AMF.H264.ScanType.Progressive\@\")."
56
-AMF.H264.ScanType.Progressive="Progressif"
57
-AMF.H264.ScanType.Interlaced="Entrelacé"
58
-AMF.H264.MotionEstimation="Estimation de mouvement"
59
-AMF.H264.MotionEstimation.Description="L'estimation du mouvement permet à l'encodeur de réduire le débit en calculant le déplacement des pixels."
60
-AMF.H264.MotionEstimation.None="Aucun"
61
-AMF.H264.MotionEstimation.Half="Demi-pixel"
62
-AMF.H264.MotionEstimation.Quarter="Quart de pixel"
63
-AMF.H264.MotionEstimation.Both="Demi-pixel & quart de pixel"
64
-AMF.H264.CodingType="Type de codage"
65
-AMF.H264.CodingType.Description="Le type de codage à utiliser:\n* \"\@AMF.Util.Default\@\" : laisser AMF décider (recommandé).\n* CALVC (Context-Adaptive Variable-Length Coding) est rapide mais lourd.\n* CABAC (Context-Adaptive Binary Arithmetic Coding) est lent mais léger."
66
+Utility.Default="Défaut"
67
+Utility.Automatic="Automatique"
68
+Utility.Manual="Manuel"
69
+Utility.Switch.Disabled="Désactivé"
70
+Utility.Switch.Enabled="Activé"
71
+Preset="Pré-réglage"
72
+Preset.ResetToDefaults="Valeurs par défaut"
73
+Preset.Recording="Enregistrement"
74
+Preset.HighQuality="Qualité élevée"
75
+Preset.Indistinguishable="Indifférenciable"
76
+Preset.Lossless="Sans pertes"
77
+Preset.Twitch="Twitch"
78
+Preset.YouTube="YouTube"
79
+Usage="Usage"
80
+Usage.Transcoding="Transcodage"
81
+Usage.UltraLowLatency="Très faible latence"
82
+Usage.LowLatency="Faible latence"
83
+Usage.Webcam="Webcam"
84
+QualityPreset="Préréglages de qualité"
85
+QualityPreset.Speed="Vitesse"
86
+QualityPreset.Balanced="Equilibré"
87
+QualityPreset.Quality="Qualité"
88
+Profile="Profil"
89
+ProfileLevel="Niveau de profil"
90
+Tier="Palier"
91
+AspectRatio="Ratio de l'image"
92
+MotionEstimation.Half="Demi-pixel"
93
+Video.API="API vidéo"
94
+Video.Adapter="Périphérique vidéo"
95
+View.Basic="Basique"
96
+View.Advanced="Avancé"
97
+View.Expert="Expert"
98
+View.Master="Master"
99
+Debug="Débogage"
100
AMF.H264.MaximumLTRFrames="Maximum de trames LTR"
101
AMF.H264.MaximumAccessUnitSize="Taille max. d'une Access Unit"
102
AMF.H264.MaximumAccessUnitSize.Description="Taille maximale d’une unité d’accès pour un NAL. Une valeur de 0 permet à l’encodeur de choisir le meilleur."
103
AMF.H264.HeaderInsertionSpacing="Intervalle d'insertion de l'en-tête de stream"
104
AMF.H264.SlicesPerFrame="Tranches par image"
105
-AMF.H264.VideoAPI="API vidéo"
106
-AMF.H264.VideoAdapter="Périphérique vidéo"
107
-AMF.H264.OpenCL="OpenCL"
108
-AMF.H264.View="Mode de visualisation"
109
-AMF.H264.View.Description="Quels paramètres afficher ?\nChoisir '\@AMF.H264.View.Master\@' est réservé aux utilisateurs avancés, et vous exclus d'office de toute possibilité d'assistance de la part du développeur."
110
-AMF.H264.View.Basic="Basique"
111
-AMF.H264.View.Advanced="Avancé"
112
-AMF.H264.View.Expert="Expert"
113
-AMF.H264.View.Master="Maître"
114
-AMF.H264.Debug="Débogage"
115
-AMF.H264.Debug.Description="Activer le débogage avancé dans le fichier journal (dans le cas où vous souhaitez solliciter une assistance auprès du développeur de l'encodeur)."
116
+AMF.H264.SliceMode.Description="Inconnu, expérimental"
117
+AMF.H264.MaximumSliceSize.Description="Inconnu, expérimental"
118
+AMF.H264.SliceControlMode.Description="Inconnu, expérimental"
119
+AMF.H264.IntraRefresh.NumberOfStripes.Description="Inconnu, expérimental"
120
121
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/hu-HU.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/hu-HU.ini
Changed
201
1
2
-AMF.Util.Default="Alapértelmezett"
3
-AMF.Util.Automatic="Automatikus"
4
-AMF.Util.Manual="Manuális"
5
-AMF.Util.Toggle.Disabled="Letiltva"
6
-AMF.Util.Toggle.Enabled="Engedélyezve"
7
-AMF.H264.Preset="Készlet"
8
-AMF.H264.Preset.ResetToDefaults="Alapértelmezett beállítások visszaállítása"
9
-AMF.H264.Preset.Recording="Felvétel"
10
-AMF.H264.Preset.HighQuality="Kiváló minőség"
11
-AMF.H264.Preset.Indistinguishable="Megkülönböztethetetlen"
12
-AMF.H264.Preset.Lossless="Veszteségmentes"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Használat"
16
-AMF.H264.Usage.Transcoding="Transzkódolás"
17
-AMF.H264.Usage.UltraLowLatency="Nagyon alacsony késleltesésű"
18
-AMF.H264.Usage.LowLatency="Alacsony késleltetésű"
19
-AMF.H264.QualityPreset="Minőségi profil"
20
-AMF.H264.QualityPreset.Speed="Gyors"
21
-AMF.H264.QualityPreset.Balanced="Kiegyenlített"
22
-AMF.H264.QualityPreset.Quality="Minőségi"
23
-AMF.H264.Profile="Enkóder profil"
24
-AMF.H264.Profile.Description="Mely H.264 Profilt használja kódoláshoz:\n- 'Baseline' a legnagyobb platform támogatottsággal,\n- 'Main' a régebbi eszközök támogatják (ajánlott ha mobil eszköz tulajdonosokat céloz meg),\n- 'High' a jelenlegi eszközök támogatják (ajánlott)."
25
-AMF.H264.ProfileLevel="Profil szint"
26
-AMF.H264.RateControlMethod="Bitráta vezérlés"
27
-AMF.H264.RateControlMethod.CQP="Erőltetett QP (CQP)"
28
-AMF.H264.RateControlMethod.CBR="Konstans bitsebesség (CBR)"
29
-AMF.H264.RateControlMethod.VBR.Peak="Változó bitsebesség (Csúcsértéket betartva) (VBR)"
30
-AMF.H264.RateControlMethod.VBR.Latency="Változó bitsebesség (Késleltetés kényszerítése) (VBR_LAT)"
31
-AMF.H264.Bitrate.Target="Célbitsebesség"
32
-AMF.H264.Bitrate.Target.Description="Bitráta amelyet szeretne elérni a konvertálás során."
33
-AMF.H264.Bitrate.Peak="Csúcs bitsebesség"
34
-AMF.H264.Bitrate.Peak.Description="Bitsebesség amelyet maximálisan elérhet a konvertálás során."
35
-AMF.H264.QP.Minimum="Minimum QP"
36
-AMF.H264.QP.Minimum.Description="Legalacsonyabb QP (Quantization Parameter) képkockában használható érték."
37
-AMF.H264.QP.Maximum="Maximum QP"
38
-AMF.H264.QP.Maximum.Description="Legmagasabb QP (Quantization Parameter) képkockában használható érték."
39
-AMF.H264.QP.IFrame="I-Képkocka QP"
40
-AMF.H264.QP.IFrame.Description="Rögzített QP érték az I képkockák használatához."
41
-AMF.H264.QP.PFrame="P-Képkocka QP"
42
-AMF.H264.QP.PFrame.Description="Rögzített QP érték a P képkockák használatához."
43
-AMF.H264.QP.BFrame="B-Képkocka QP"
44
-AMF.H264.QP.BFrame.Description="Rögzített QP (Quantization Parameter) érték a B-Képkockák használatához."
45
-AMF.H264.VBVBuffer="VBV puffer"
46
-AMF.H264.VBVBuffer.Strictness="VBV Puffer kötöttség"
47
-AMF.H264.VBVBuffer.Strictness.Description="Meghatározza a VBV puffer szigorúságát, 100% esetén teljesen pontos és 0% esetén kötetlen."
48
-AMF.H264.VBVBuffer.Size="VBV pufferméret"
49
-AMF.H264.VBVBuffer.Fullness="VBV puffer telítettség"
50
-AMF.H264.FillerData="Filler adat"
51
-AMF.H264.FrameSkipping="Képkocka kihagyás"
52
-AMF.H264.EnforceHRDCompatibility="HRD Kompatibilitás kényszerítése"
53
-AMF.H264.KeyframeInterval="Kulcsképkocka időköze"
54
-AMF.H264.IDRPeriod="IDR időköz"
55
-AMF.H264.BFrame.Pattern="B képkocka"
56
-AMF.H264.BFrame.Pattern.Description="A B képkockák száma kódolás közben.\nA második és harmadik generációjú VCE kártyák támogatják. Hátráltató hatása van a kódolás teljesítményére."
57
-AMF.H264.BFrame.DeltaQP="B képkocka Delta QP"
58
-AMF.H264.BFrame.DeltaQP.Description="Delta QP érték az utolsó I vagy P képkocka nem referenciálható B képkockáihoz."
59
-AMF.H264.BFrame.Reference="Referenciálható B képkockák"
60
-AMF.H264.BFrame.Reference.Description="Lehetővé teszi a B képkockák számára, hogy B képkockát referenciaként használjon, P és I képkockák helyett."
61
-AMF.H264.BFrame.ReferenceDeltaQP="Delta QP a referenciálható B kockákhoz"
62
-AMF.H264.BFrame.ReferenceDeltaQP.Description="Delta QP érték az utolsó I vagy P képkockának a referenciálható B képkockákhoz."
63
-AMF.H264.DeblockingFilter="Deblocking Filter"
64
-AMF.H264.ScanType="Rögzítés módja"
65
-AMF.H264.ScanType.Progressive="Progresszív"
66
-AMF.H264.ScanType.Interlaced="Váltottsoros (Kísérleti)"
67
-AMF.H264.MotionEstimation="Mozgásbecslés"
68
-AMF.H264.MotionEstimation.Description="Mozdulat becslés lehetővé teszi a kódolónak, hogy csökkentse a bitsebesség követelményt a pixel elmozdulásának a felbecsülésével."
69
-AMF.H264.MotionEstimation.None="Semmi"
70
-AMF.H264.MotionEstimation.Half="Fél-pixel"
71
-AMF.H264.MotionEstimation.Quarter="Negyed-pixel"
72
-AMF.H264.MotionEstimation.Both="Fél-&negyed-pixel"
73
-AMF.H264.CodingType="Kódolás típusa"
74
+Utility.Default="Alapértelmezett"
75
+Utility.Automatic="Automatikus"
76
+Utility.Manual="Manuális"
77
+Utility.Switch.Disabled="Letiltva"
78
+Utility.Switch.Enabled="Engedélyezve"
79
+Preset="Sablon"
80
+Preset.ResetToDefaults="Alapértelmezett beállítások visszaállítása"
81
+Preset.Recording="Felvétel"
82
+Preset.HighQuality="Jó minőség"
83
+Preset.Indistinguishable="Megkülönböztethetetlen"
84
+Preset.Lossless="Veszteségmentes"
85
+Preset.Twitch="Twitch"
86
+Preset.YouTube="YouTube"
87
+Usage="Használat"
88
+Usage.Transcoding="Átkódolás"
89
+Usage.UltraLowLatency="Nagyon alacsony késleltetés"
90
+Usage.LowLatency="Alacsony késleltetés"
91
+Usage.Webcam="Webkamera"
92
+QualityPreset="Minőségi profil"
93
+QualityPreset.Speed="Sebesség"
94
+QualityPreset.Balanced="Kiegyensúlyozott"
95
+QualityPreset.Quality="Minőségi"
96
+Profile="Profil"
97
+ProfileLevel="Profil szint"
98
+Tier="Szint"
99
+AspectRatio="Képarány"
100
+CodingType="Kódolás típusa"
101
+MaximumReferenceFrames="Maximális referencia képkockák"
102
+RateControlMethod="Sebességvezérlési metódus"
103
+RateControlMethod.CQP="Állandó QP (CQP)"
104
+RateControlMethod.CBR="Konstans bitsebesség (CBR)"
105
+RateControlMethod.VBR="Változó bitsebesség (Csúcsértéket betartva) (VBR)"
106
+RateControlMethod.VBRLAT="Változó bitsebesség (Késleltetés kényszerítése) (VBRLAT)"
107
+Bitrate.Target="Célbitsebesség"
108
+Bitrate.Target.Description="Bitsebesség, amelyet megkísérel elérni a szekvencia során."
109
+Bitrate.Peak="Csúcs bitsebesség"
110
+Bitrate.Peak.Description="Bitsebesség amelyet maximálisan elérhet a szekvencia során."
111
+QP.IFrame="I-Képkocka QP"
112
+QP.IFrame.Description="Rögzített QP érték az I képkockák használatához."
113
+QP.PFrame="P-Képkocka QP"
114
+QP.PFrame.Description="Rögzített QP érték a P képkockák használatához."
115
+QP.BFrame="B-Képkocka QP"
116
+QP.BFrame.Description="Rögzített QP érték az B képkockák használatához."
117
+QP.Minimum="Minimum QP"
118
+QP.Minimum.Description="Képkockában legalacsonyabb használható QP érték."
119
+QP.IFrame.Minimum="Minimális I-Képkocka QP"
120
+QP.IFrame.Minimum.Description="I-Képkockában legalacsonyabb használható QP érték."
121
+QP.PFrame.Minimum="Minimális I-Képkocka QP"
122
+QP.PFrame.Minimum.Description="P-Képkockában legalacsonyabb használható QP érték."
123
+QP.Maximum="Maximum QP"
124
+QP.Maximum.Description="Képkockában legnagyobb használható QP érték."
125
+QP.IFrame.Maximum="Maximális I-Képkocka QP"
126
+QP.IFrame.Maximum.Description="I-Képkockában legnagyobb használható QP érték."
127
+QP.PFrame.Maximum="Maximális P-Képkocka QP"
128
+QP.PFrame.Maximum.Description="P-Képkockában legnagyobb használható QP érték."
129
+FillerData="Kitöltőadat"
130
+FrameSkipping="Képkocka kihagyás"
131
+VBAQ="VBAQ"
132
+EnforceHRD="HRD kényszerítése"
133
+VBVBuffer="VBV puffer"
134
+VBVBuffer.Strictness="VBV Puffer kötöttség"
135
+VBVBuffer.Strictness.Description="Meghatározza a VBV puffer szigorúságát, 100% esetén teljesen pontos és 0% esetén kötetlen."
136
+VBVBuffer.Size="VBV pufferméret"
137
+VBVBuffer.Size.Description="A VBV puffer mérete, amely a bitsebesség vezérléshez használatos a szekvenciában."
138
+VBVBuffer.InitialFullness="VBV puffer kezdeti telítettség"
139
+KeyframeInterval="Kulcsképkocka időköze"
140
+KeyframeInterval.Description="A kulcsképkockák közötti időköz (másodpercben)."
141
+H264.IDRPeriod="IDR idő (Képkockákban)"
142
+H264.IDRPeriod.Description="Meghatározza a távolságot két pillanatnyi dekódoló frissítő (IDR) között a képkockákban. A GOP szekvencia méretét is szabályozza."
143
+H265.IDRPeriod="IDR idő (GOP-okban)"
144
+GOP.Type="GOP típusa"
145
+GOP.Type.Fixed="Rögzített"
146
+GOP.Type.Variable="Változó"
147
+GOP.Size="GOP méret"
148
+GOP.Size.Minimum="GOP méretminimum"
149
+GOP.Size.Minimum.Description="Minimális GOP (képek csoportja) méret keretekben."
150
+GOP.Size.Maximum="GOP méretmaximum"
151
+GOP.Size.Maximum.Description="Maximális GOP (képek csoportja) méret keretekben."
152
+GOP.Alignment="GOP igazítás"
153
+GOP.Alignment.Description="Kísérleti, hatása ismeretlen. Csak saját felelősségére használja."
154
+BFrame.Pattern="B-képkockaminta"
155
+BFrame.Pattern.Description="A B képkockák száma kódolás közben.\nA második és harmadik generációjú VCE kártyák támogatják. Hátráltató hatása van a kódolás teljesítményére."
156
+BFrame.DeltaQP="B-képkocka Delta QP"
157
+BFrame.DeltaQP.Description="Delta QP érték az utolsó I vagy P képkocka nem referenciálható B képkockáihoz."
158
+BFrame.Reference="Referencia B-Képkocka"
159
+BFrame.Reference.Description="Lehetővé teszi a B képkockák számára, hogy B képkockát referenciaként használjon, P és I képkockák helyett."
160
+BFrame.ReferenceDeltaQP="B-képkocka referencia Delta QP"
161
+BFrame.ReferenceDeltaQP.Description="Delta QP érték az utolsó I vagy P képkockának a referenciálható B képkockákhoz."
162
+DeblockingFilter="Deblocking szűrő"
163
+DeblockingFilter.Description="Lehetővé teszi a dekódernek, hogy Deblocking szűrőt alkalmazzon."
164
+MotionEstimation="Mozgásbecslés"
165
+MotionEstimation.Description="Mozdulat becslés lehetővé teszi a kódolónak, hogy csökkentse a bitsebesség követelményt a pixel elmozdulásának a felbecsülésével."
166
+MotionEstimation.Quarter="Negyedpixel"
167
+MotionEstimation.Half="Félpixel"
168
+MotionEstimation.Full="Negyed és félpixel"
169
+Video.API="Videó API"
170
+Video.Adapter="Videó adapter"
171
+Video.Adapter.Description="Milyen Adapteren történjen a kódolás?"
172
+OpenCL="OpenCL"
173
+View="Nézet mód"
174
+View.Basic="Alap"
175
+View.Advanced="Haladó"
176
+View.Expert="Szakértő"
177
+View.Master="Mester"
178
+Debug="Hibakeresés"
179
AMF.H264.MaximumLTRFrames="Maximális LTR képkocka"
180
AMF.H264.MaximumAccessUnitSize="Hozzáférési egység maximális mérete"
181
AMF.H264.MaximumAccessUnitSize.Description="NAL számára a legnagyobb elérési egység."
182
+AMF.H264.HeaderInsertionSpacing="Fejléc beszúrási térköz"
183
AMF.H264.HeaderInsertionSpacing.Description="NAL fejlécek közötti képkockák száma."
184
AMF.H264.WaitForTask="Feladatra várakozás"
185
AMF.H264.WaitForTask.Description="Ismeretlen, kísérleti"
186
-AMF.H264.PreAnalysisPass="Elemzés előtti fázis"
187
-AMF.H264.PreAnalysisPass.Description="Ismeretlen, kísérleti"
188
-AMF.H264.VBAQ="VBAQ"
189
-AMF.H264.VBAQ.Description="Ismeretlen, kísérleti"
190
-AMF.H264.GOPSize="GOP méret"
191
-AMF.H264.GOPSize.Description="Ismeretlen, kísérleti"
192
-AMF.H264.GOPAlignment="GOP igazítás"
193
-AMF.H264.GOPAlignment.Description="Ismeretlen, kísérleti"
194
-AMF.H264.MaximumReferenceFrames="Maximális referencia képkockák"
195
-AMF.H264.MaximumReferenceFrames.Description="Ismeretlen, kísérleti"
196
AMF.H264.SlicesPerFrame="Szeletelés képkockánként"
197
+AMF.H264.SlicesPerFrame.Description="Mennyi I-Képkocka szelet tárolható egyes képkockán?\nA zéró érték hagyja a kódolót menet közben dönteni.\nAz Intra-frissítési kódolás a gyorsabb lejátszáshoz és kereséshez használható."
198
AMF.H264.SliceMode="Szelet mód"
199
AMF.H264.SliceMode.Description="Ismeretlen, kísérleti"
200
AMF.H264.MaximumSliceSize="Maximális szeletméret"
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/it-IT.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/it-IT.ini
Changed
90
1
2
-AMF.Util.Default="Predefinito"
3
-AMF.Util.Automatic="Automatico"
4
-AMF.Util.Manual="Manuale"
5
-AMF.Util.Toggle.Disabled="Disabilitato"
6
-AMF.Util.Toggle.Enabled="Attivo"
7
-AMF.H264.Preset="Preset"
8
-AMF.H264.Preset.ResetToDefaults="Ripristina a Predefiniti"
9
-AMF.H264.Preset.Recording="Registrazione"
10
-AMF.H264.Preset.HighQuality="Alta Qualità"
11
-AMF.H264.Preset.Indistinguishable="Indistinguibili"
12
-AMF.H264.Preset.Lossless="Lossless"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Utilizzo"
16
-AMF.H264.Usage.Transcoding="Transcodifica"
17
-AMF.H264.Usage.UltraLowLatency="Latenza ultra bassa"
18
-AMF.H264.Usage.LowLatency="Bassa latenza"
19
-AMF.H264.QualityPreset="Qualità Preset"
20
-AMF.H264.QualityPreset.Speed="Velocità"
21
-AMF.H264.QualityPreset.Balanced="Bilanciato"
22
-AMF.H264.QualityPreset.Quality="Qualità"
23
-AMF.H264.Profile="Profilo"
24
-AMF.H264.ProfileLevel="Livello profilo"
25
-AMF.H264.ProfileLevel.Description="Quale livello di profilo H.264 usare per l'encoding:\n- 'Automatico' calcola il miglior livello per il dato Frame Rate e Frame Size,\n- '4.1' supporta 1920x1080 30FPS, 1280x720 60FPS, 960x540 90FPS\n- '4.2' supporta 1920x1080 60FPS, 1280x720 120FPS, 960x540 172FPS\n- '5.0' supporta 1920x1080 60FPS, 1280x720 144FPS, 960x540 172FPS\n- '5.1' supporta 3840x2160 30FPS, 1920x1080 120FPS, 1280x720 172FPS, 960x540 172FPS\n- '5.2' supporta 3840x2160 60FPS, 1920x1080 172FPS, 1280x720 172FPS, 960x540 172FPS"
26
-AMF.H264.RateControlMethod="Metodo di controllo della frequenza"
27
-AMF.H264.RateControlMethod.CQP="QP Costante (QPC)"
28
-AMF.H264.RateControlMethod.CBR="Bitrate costante (CBR)"
29
-AMF.H264.RateControlMethod.VBR.Peak="Bitrate Variabile (Peak Constrained) (VBR)"
30
-AMF.H264.RateControlMethod.VBR.Latency="Bitrate variabile (latenza vincolata) (VBR_LAT)"
31
-AMF.H264.Bitrate.Target="Bitrate di destinazione"
32
-AMF.H264.Bitrate.Peak="Picco Bitrate"
33
-AMF.H264.QP.Minimum="QP Minimo"
34
-AMF.H264.QP.Minimum.Description="Valore QP più basso da utilizzare in un Frame."
35
-AMF.H264.QP.Maximum="QP Massimo"
36
-AMF.H264.QP.Maximum.Description="Valore QP più alto da utilizzare in un Frame."
37
-AMF.H264.QP.IFrame="I-Frame QP"
38
-AMF.H264.QP.PFrame="P-Frame QP"
39
-AMF.H264.QP.BFrame="B-Frame QP"
40
-AMF.H264.VBVBuffer="Buffer VBV"
41
-AMF.H264.VBVBuffer.Strictness="Strettezza Buffer VBV"
42
-AMF.H264.VBVBuffer.Size="Dimensione Buffer VBV"
43
-AMF.H264.VBVBuffer.Fullness="Larghezza Buffer VBV"
44
-AMF.H264.FillerData="Dati di riempimento"
45
-AMF.H264.FrameSkipping="Frame Skipping"
46
-AMF.H264.EnforceHRDCompatibility="Forza compatibilità HRD"
47
-AMF.H264.KeyframeInterval="Intervallo Keyframe"
48
-AMF.H264.IDRPeriod="Periodo IDR"
49
-AMF.H264.DeblockingFilter="Filtro di deblock"
50
-AMF.H264.ScanType="Tipo di scansione"
51
-AMF.H264.ScanType.Progressive="Progressivo"
52
-AMF.H264.ScanType.Interlaced="Interlacciato"
53
-AMF.H264.MotionEstimation="Stima Movimento"
54
-AMF.H264.MotionEstimation.None="Nessuno"
55
-AMF.H264.MotionEstimation.Half="Metà-Pixel"
56
-AMF.H264.MotionEstimation.Quarter="Quarto-Pixel"
57
-AMF.H264.MotionEstimation.Both="Meta- & Quarto-Pixel"
58
-AMF.H264.CodingType="Tipo di codifica"
59
AMF.H264.MaximumLTRFrames="Fotogrammi LTR Massimi"
60
AMF.H264.MaximumAccessUnitSize="Massima dimensione di unità d'accesso"
61
AMF.H264.HeaderInsertionSpacing="Spaziatura di inserimento di intestazione"
62
AMF.H264.WaitForTask="Attendere per attività"
63
AMF.H264.WaitForTask.Description="Sconosciuto, sperimentale"
64
-AMF.H264.PreAnalysisPass="Analisi pre-pass"
65
-AMF.H264.PreAnalysisPass.Description="Sconosciuto, sperimentale"
66
-AMF.H264.VBAQ="VBAQ"
67
-AMF.H264.VBAQ.Description="Sconosciuto, sperimentale"
68
-AMF.H264.GOPSize="Dimensione del GOP"
69
-AMF.H264.GOPSize.Description="Sconosciuto, sperimentale"
70
-AMF.H264.GOPAlignment="Allineamento del GOP"
71
-AMF.H264.GOPAlignment.Description="Sconosciuto, sperimentale"
72
-AMF.H264.MaximumReferenceFrames="Numero massimo di frames di riferimento"
73
-AMF.H264.MaximumReferenceFrames.Description="Sconosciuto, sperimentale"
74
AMF.H264.SlicesPerFrame="Slices Per Frame"
75
AMF.H264.SliceMode="Modalità Slice"
76
AMF.H264.SliceMode.Description="Sconosciuto, sperimentale"
77
AMF.H264.MaximumSliceSize="Dimensione massima frame"
78
AMF.H264.MaximumSliceSize.Description="Sconosciuto, sperimentale"
79
AMF.H264.SliceControlMode="Modalità di controllo Slice"
80
-AMF.H264.View="Modalità di visualizzazione"
81
-AMF.H264.View.Basic="Basico"
82
-AMF.H264.View.Advanced="Avanzate"
83
-AMF.H264.View.Expert="Esperto"
84
-AMF.H264.View.Master="Master"
85
-AMF.H264.Debug="Debug"
86
+AMF.H264.SliceControlMode.Description="Sconosciuto, sperimentale"
87
+AMF.H264.SliceControlSize.Description="Sconosciuto, sperimentale"
88
+AMF.H264.IntraRefresh.NumberOfStripes.Description="Sconosciuto, sperimentale"
89
90
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/ja-JP.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/ja-JP.ini
Changed
201
1
2
-AMF.Util.Default="既定値"
3
-AMF.Util.Automatic="自動"
4
-AMF.Util.Manual="手動"
5
-AMF.Util.Toggle.Disabled="無効"
6
-AMF.Util.Toggle.Enabled="有効"
7
-AMF.H264.Preset="プリセット"
8
-AMF.H264.Preset.ResetToDefaults="既定値に戻す"
9
-AMF.H264.Preset.Recording="録画中"
10
-AMF.H264.Preset.HighQuality="高品質"
11
-AMF.H264.Preset.Indistinguishable="区別不能品質"
12
-AMF.H264.Preset.Lossless="無損失品質"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="用途"
16
-AMF.H264.Usage.Description="AMFの使用方法:\n- '\@AMF.H264.Usage.Transcoding\@' は汎用のトランスコード (推奨) で、\n- '\@AMF.H264.Usage.UltraLowLatency\@' は超低遅延エンコード用で、\n- '\@AMF.H264.Usage.LowLatency\@' は上記と似ていますが少し遅延があります。\n配信は '\@AMF.H264.Usage.Transcoding\@' のみをサポートし、他のすべての値は録画で使用できます。"
17
-AMF.H264.Usage.Transcoding="変換"
18
-AMF.H264.Usage.UltraLowLatency="超低遅延"
19
-AMF.H264.Usage.LowLatency="低遅延"
20
-AMF.H264.QualityPreset="品質プリセット"
21
-AMF.H264.QualityPreset.Description="どの品質プリセットをAMFが目標とするか:\n- '\@AMF.H264.QualityPreset.Speed\@' は最速ですが品質は最悪で、\n- '\@AMF.H264.QualityPreset.Balanced\@' は両方のバランスの取れた組み合わせで、\n- '\@AMF.H264.QualityPreset.Quality\@' は指定されたビットレートに対して最高の品質を提供します。"
22
-AMF.H264.QualityPreset.Speed="速度"
23
-AMF.H264.QualityPreset.Balanced="バランス"
24
-AMF.H264.QualityPreset.Quality="品質"
25
-AMF.H264.Profile="プロファイル"
26
-AMF.H264.Profile.Description="エンコードに使用するH.264プロファイル:\n- 'Baseline' はプラットフォームごとのサポートが最も大きく、\n- 'Main' は古いデバイスでもサポートされ、(モバイルデバイスがターゲットなら推奨)\n- 'High' は現在主流のデバイスでサポートされています。(推奨)"
27
-AMF.H264.ProfileLevel="プロファイルレベル"
28
-AMF.H264.ProfileLevel.Description="エンコードに使用する H.264 プロファイルレベル:\n- '自動' は与えられたフレームレートと解像度に対して最適なプロファイルレベルを計算し、\n- '4.1' は 1920x1080 30FPS, 1280x720 60FPS, 960x540 90FPS をサポートし、\n- '4.2' は 1920x1080 60FPS, 1280x720 120FPS, 960x540 172FPS をサポートし、\n- '5.0' は 1920x1080 60FPS, 1280x720 144FPS, 960x540 172FPS をサポートし、\n- '5.1' は 3840x2160 30FPS, 1920x1080 120FPS, 1280x720 172FPS, 960x540 172FPS をサポートし、\n- '5.2' は 3840x2160 60FPS、1920 x 1080 172FPS, 1280 x 720 172FPS, 960 x 540 172FPS をサポートします。"
29
-AMF.H264.RateControlMethod="レート制御方式"
30
-AMF.H264.RateControlMethod.Description="どのレート制御方法を使用すべきか:\n- '\@AMF.H264.RateControlMethod.CQP\@' は固定I-/P-/B-フレームQP (量子化パラメータ) の値を割り当て、\n- '\@AMF.H264.RateControlMethod.CBR\@' は指定された目標ビットレート (フィラーデータを使用) に留まり (配信に推奨)、\n- '\@AMF.H264.RateControlMethod.VBR\@' は指定されたピークビットレート以下にとどまり、\n- '\@AMF.H264.RateControlMethod.VBR_LAT\@' はGPU遅延と負荷が許可されている場合は目標ビットレートに近く、それ以外の場合はより高いビットレートを使用します (録画に推奨)。"
31
-AMF.H264.RateControlMethod.CQP="固定QP (CQP)"
32
-AMF.H264.RateControlMethod.CBR="固定ビットレート (CBR)"
33
-AMF.H264.RateControlMethod.VBR.Peak="可変ビットレート (ピーク制約) (VBR)"
34
-AMF.H264.RateControlMethod.VBR.Latency="可変ビットレート (遅延制約) (VBR_LAT)"
35
-AMF.H264.Bitrate.Target="目標ビットレート"
36
-AMF.H264.Bitrate.Target.Description="全体的なシーケンスで達成しようとするビットレート。"
37
-AMF.H264.Bitrate.Peak="最大ビットレート"
38
-AMF.H264.Bitrate.Peak.Description="全体的なシーケンスでピークを最大にしようとするビットレート。"
39
-AMF.H264.QP.Minimum="最小QP"
40
-AMF.H264.QP.Minimum.Description="フレームで使用する最低 QP (量子化パラメーター) の値です。"
41
-AMF.H264.QP.Maximum="最大QP"
42
-AMF.H264.QP.Maximum.Description="フレームで使用する最高 QP (量子化パラメーター) の値です。"
43
-AMF.H264.QP.IFrame="I-フレーム QP"
44
-AMF.H264.QP.IFrame.Description="I-フレームに使用する固定 QP の値。"
45
-AMF.H264.QP.PFrame="P-フレーム QP"
46
-AMF.H264.QP.PFrame.Description="P-フレームに使用する固定 QP の値。"
47
-AMF.H264.QP.BFrame="B-フレーム QP"
48
-AMF.H264.QP.BFrame.Description="B-フレームに対して使用する固定 QP (量子化パラメーター) の値です。"
49
-AMF.H264.VBVBuffer="VBV バッファ"
50
-AMF.H264.VBVBuffer.Description="どの方法を使用してVBVバッファーサイズを決定する必要があるか:\n- '\@AMF.Util.Automatic\@' は厳密性制約を使用してサイズを計算し、\n- '\@AMF.Util.Manual\@' はユーザーがサイズを制御できるようにします。\nVBV (ビデオバッファリングベリファイア) バッファは特定のレート制御方法により指定された制約内で全体のビットレートを保持するために使用されます。"
51
-AMF.H264.VBVBuffer.Strictness="VBV バッファ厳密性"
52
-AMF.H264.VBVBuffer.Strictness.Description="VBV バッファーの厳密さを決定し、100%は可能な限り厳密で0%は制限されません。"
53
-AMF.H264.VBVBuffer.Size="VBV バッファサイズ"
54
-AMF.H264.VBVBuffer.Size.Description="シーケンスにおけるビットレート制御のために使用されている VBV バッファーのサイズ。"
55
-AMF.H264.VBVBuffer.Fullness="VBV バッファ充満"
56
-AMF.H264.VBVBuffer.Fullness.Description="VBVバッファーの初期状態は、エンコーディングの初期シーケンスにのみ影響します。"
57
-AMF.H264.FillerData="フィラーデータ"
58
-AMF.H264.FillerData.Description="フィラーデータを有効にするとエンコーダは空の情報でシーケンスの残りのスペースを埋めることによって少なくともターゲットビットレートを維持することができます。"
59
-AMF.H264.FrameSkipping="フレームスキップ"
60
-AMF.H264.FrameSkipping.Description="フレームスキッピングはエンコーダが目標ビットレート要件を満たすためにフレームをドロップすることを可能にする。\nエンコーダがフレームを落とすときに代わりにリピートラストフレームNALをストリームに挿入する。\n目標ビットレートが非常に低い場合に役立ちます。"
61
-AMF.H264.EnforceHRDCompatibility="HRD 互換性を強制"
62
-AMF.H264.EnforceHRDCompatibility.Description="フレーム内の最大QP値の変化を制限する仮説的参照デコーダの制限を強制します。\n録画や配信には非推奨で参照ソフトウェアデコーダのみを持つ非常に古いデバイスをターゲットにする場合にのみ使用してください。"
63
-AMF.H264.KeyframeInterval="キーフレーム間隔"
64
-AMF.H264.KeyframeInterval.Description="ドロップ不可能なフレーム間の秒数。\nGOPのサイズも制御します。"
65
-AMF.H264.IDRPeriod="IDR 周期"
66
-AMF.H264.IDRPeriod.Description="フレーム内の瞬時デコードリフレッシュ (IDR) 間の距離を定義します。 GOP-シーケンスのサイズも制御します。"
67
-AMF.H264.BFrame.Pattern="B-フレーム"
68
-AMF.H264.BFrame.Pattern.Description="エンコードに使用するBフレームの数。\n第2世代および第3世代のVCEカードでサポートされています。 エンコーディングのパフォーマンスに悪影響を与えます。"
69
-AMF.H264.BFrame.DeltaQP="B-フレーム デルタ QP"
70
-AMF.H264.BFrame.DeltaQP.Description="参照不可能なB-フレームに対する最後のI-フレームまたはP-フレームまでのデルタ QP の値。"
71
-AMF.H264.BFrame.Reference="参照可能 B-フレーム"
72
-AMF.H264.BFrame.Reference.Description="B-フレームはP-フレームとI-フレームだけでなく、B-フレームも参照として使用できます。"
73
-AMF.H264.BFrame.ReferenceDeltaQP="参照可能 B-フレーム デルタ QP"
74
-AMF.H264.BFrame.ReferenceDeltaQP.Description="参照可能なB-フレームに対する最後のI-フレームまたはP-フレームまでのデルタ QP の値。"
75
-AMF.H264.DeblockingFilter="デブロックフィルタ"
76
-AMF.H264.DeblockingFilter.Description="デコーダがエンコードされたストリームに対してデブロックフィルタの使用を許可されているかのフラグを設定します。"
77
-AMF.H264.ScanType="スキャンの種類"
78
-AMF.H264.ScanType.Description="どのスキャン方法が使用されるか、'プログレッシブ'を常にこのままにしておきます。"
79
-AMF.H264.ScanType.Progressive="プログレッシブ"
80
-AMF.H264.ScanType.Interlaced="インターレース"
81
-AMF.H264.MotionEstimation="動き推定"
82
-AMF.H264.MotionEstimation.Description="動き推定はピクセルがどこに移動したかを推定することによってエンコーダが必要とするビットレートを削減します。"
83
-AMF.H264.MotionEstimation.None="未設定"
84
-AMF.H264.MotionEstimation.Half="1/2ピクセル"
85
-AMF.H264.MotionEstimation.Quarter="1/4ピクセル"
86
-AMF.H264.MotionEstimation.Both="ハーフ & クォーターピクセル"
87
-AMF.H264.CodingType="コーディングの種類"
88
-AMF.H264.CodingType.Description="使用するコーディングの種類:\n* \@AMF.Util.Default\@ AMFが決定します。(推奨)\n* CALVC (Context-Adaptive Variable-Length Coding) は高速ですが、容量は大きいです。\n* CABAC (Context-Adaptive Binary Arithmetic Coding) は低速ですが、容量は小さくなります。"
89
+Utility.Default="既定値"
90
+Utility.Automatic="自動"
91
+Utility.Manual="手動"
92
+Utility.Switch.Disabled="無効"
93
+Utility.Switch.Enabled="有効"
94
+Preset="プリセット"
95
+Preset.ResetToDefaults="既定値に戻す"
96
+Preset.Recording="録画中"
97
+Preset.HighQuality="高品質"
98
+Preset.Indistinguishable="区別不能品質"
99
+Preset.Lossless="無損失品質"
100
+Preset.Twitch="Twitch"
101
+Preset.YouTube="YouTube"
102
+Usage="用途"
103
+Usage.Description="AMFの使用方法:\n- '\@Usage.Transcoding\@' は汎用のトランスコード (推奨) で、\n- '\@Usage.UltraLowLatency\@' は超低遅延エンコード用で、\n- '\@Usage.LowLatency\@' は上記と似ていますが少し遅延があります。\n配信は '\@Usage.Transcoding\@' のみをサポートし、他のすべての値は録画で使用できます。"
104
+Usage.Transcoding="変換"
105
+Usage.UltraLowLatency="超低遅延"
106
+Usage.LowLatency="低遅延"
107
+Usage.Webcam="ウェブカメラ"
108
+QualityPreset="品質プリセット"
109
+QualityPreset.Description="どの品質プリセットをAMFが目標とするか:\n- '\@QualityPreset.Speed\@' は最速ですが品質は最悪で、\n- '\@QualityPreset.Balanced\@' は両方のバランスの取れた組み合わせで、\n- '\@QualityPreset.Quality\@' は指定されたビットレートに対して最高の品質を提供します。"
110
+QualityPreset.Speed="速度"
111
+QualityPreset.Balanced="バランス"
112
+QualityPreset.Quality="品質"
113
+Profile="プロファイル"
114
+Profile.Description="エンコードに使用するプロファイル。最もサポートが広いもの (上) から最も品質が高いもの (下) まで。"
115
+ProfileLevel="プロファイルレベル"
116
+ProfileLevel.Description="エンコードに使用するプロファイルレベル。\@Utility.Automatic\@ のままにするのが最善です。"
117
+Tier="階層"
118
+Tier.Description="どの階層でエンコードするか。'High' は高いビットレート/帯域幅の利用を対象とし、'Main' は主流メディアを対象とします。"
119
+AspectRatio="アスペクト比"
120
+AspectRatio.Description="どのアスペクト比が出力ファイルに書き込まれるべきか。"
121
+CodingType="コーディングの種類"
122
+CodingType.Description="使用するコーディングの種類:\n* \@Utility.Automatic\@ AMFが決定します。(推奨)\n* CALVC (Context-Adaptive Variable-Length Coding) は高速ですが、容量は大きいです。\n* CABAC (Context-Adaptive Binary Arithmetic Coding) は低速ですが、容量は小さくなります。"
123
+MaximumReferenceFrames="最大参照フレーム数"
124
+MaximumReferenceFrames.Description="エンコード時にエンコーダが参照できるフレームの最大数は、エンコーディングの質に直接影響します。"
125
+RateControlMethod="レート制御方式"
126
+RateControlMethod.Description="どのレート制御方法を使用すべきか:\n- '\@RateControlMethod.CQP\@' は固定I-/P-/B-フレーム QP の値を割り当て、\n- '\@RateControlMethod.CBR\@' は指定された目標ビットレート (フィラーデータを使用) に留まり (配信に推奨)、\n- '\@RateControlMethod.VBR\@' は指定されたピークビットレート以下にとどまり、\n- '\@RateControlMethod.VBRLAT\@' はGPU遅延と負荷が許可されている場合は目標ビットレートに近く、それ以外の場合はより高いビットレートを使用します (録画に推奨)。"
127
+RateControlMethod.CQP="固定QP (CQP)"
128
+RateControlMethod.CBR="固定ビットレート (CBR)"
129
+RateControlMethod.VBR="可変ビットレート (ピーク制約) (VBR)"
130
+RateControlMethod.VBRLAT="可変ビットレート (遅延制約) (VBRLAT)"
131
+PrePassMode="プレパスモード"
132
+PrePassMode.Description="プレパスはシーケンス内のビットレートのより良い配分を可能にする二次的なビットレート配分パスですが、この効果はカードによって異なる場合があります。"
133
+PrePassMode.Quarter="\@Utility.Switch.Enabled\@ (4分の1サイズ)"
134
+PrePassMode.Half="\@Utility.Switch.Enabled\@ (2分の1サイズ)"
135
+PrePassMode.Full="\@Utility.Switch.Enabled\@ (フルサイズ)"
136
+Bitrate.Target="目標ビットレート"
137
+Bitrate.Target.Description="全体的なシーケンスで達成しようとするビットレート。"
138
+Bitrate.Peak="最大ビットレート"
139
+Bitrate.Peak.Description="全体的なシーケンスでピークを最大にしようとするビットレート。"
140
+QP.IFrame="I-フレーム QP"
141
+QP.IFrame.Description="I-フレームに使用する固定 QP の値。"
142
+QP.PFrame="P-フレーム QP"
143
+QP.PFrame.Description="P-フレームに使用する固定 QP の値。"
144
+QP.BFrame="B-フレーム QP"
145
+QP.BFrame.Description="B-フレームに使用する固定 QP の値。"
146
+QP.Minimum="最小QP"
147
+QP.Minimum.Description="フレームで使用する最低の QP 値。"
148
+QP.IFrame.Minimum="最小 I-フレーム QP"
149
+QP.IFrame.Minimum.Description="I-フレームで使用する QP の最低値。"
150
+QP.PFrame.Minimum="最小 P-フレーム QP"
151
+QP.PFrame.Minimum.Description="P-フレームで使用する QP の最低値。"
152
+QP.Maximum="最大QP"
153
+QP.Maximum.Description="フレームで使用する最高の QP 値。"
154
+QP.IFrame.Maximum="最大 I-フレーム QP"
155
+QP.IFrame.Maximum.Description="I-フレームで使用する QP の最高値。"
156
+QP.PFrame.Maximum="最大 P-フレーム QP"
157
+QP.PFrame.Maximum.Description="P-フレームで使用する QP の最高値。"
158
+FillerData="フィラーデータ"
159
+FillerData.Description="フィラーデータを有効にするとエンコーダは空の情報で残りのスペースを埋めることによって少なくとも \@Bitrate.Target\@ を維持することができます。"
160
+FrameSkipping="フレームスキップ"
161
+FrameSkipping.Description="フレームスキッピングはエンコーダが \@Bitrate.Target\@ 要件を満たすためにフレームをドロップすることを可能にします。\nエンコーダがフレームを落とすときに代わりにリピートラストフレームNALをストリームに挿入します。\n \@Bitrate.Target\@ 要件が非常に低い場合に役立ちます。"
162
+VBAQ="VBAQ"
163
+VBAQ.Description="ピクセルの分散に基づいてビットレートをより良く分配する '分散に基づく適応型量子化' (VBAQ) の使用を有効にします。\n人間の視覚系が高度なテクスチャ領域のアーチファクトに対して敏感でないという考え方に基づきビットレート配分をより滑らかな表面に向けることができます。\nこれを有効にすると特定のコンテンツの主観的品質が向上する可能性があります。"
164
+EnforceHRD="HRD を強制"
165
+EnforceHRD.Description="出力ビットストリームが正確であることを確認するために使用される仮説的参照デコーダの使用を強制します。"
166
+VBVBuffer="VBV バッファ"
167
+VBVBuffer.Description="VBV バッファサイズの決定方法:\n- '\@Utlity.Automatic\@' は厳密性制約を使用してサイズを計算し、\n- '\@Utlity.Manual\@' は利用者がサイズを制御できるようにします。\nVBV バッファ (ビデオバッファリングベリファイア) は特定のレート制御方法により指定された制約内で全体のビットレートを保持するために使用されます。"
168
+VBVBuffer.Strictness="VBV バッファ厳密性"
169
+VBVBuffer.Strictness.Description="VBV バッファーの厳密さを決定し、100%は可能な限り厳密で0%は制限されません。"
170
+VBVBuffer.Size="VBV バッファサイズ"
171
+VBVBuffer.Size.Description="シーケンスにおけるビットレート制御のために使用されている VBV バッファーのサイズ。"
172
+VBVBuffer.InitialFullness="VBV バッファ初期充満"
173
+VBVBuffer.InitialFullness.Description="VBV バッファの初期充足率 (%) がどの程度か、エンコードの初期シーケンスにのみ影響します。"
174
+KeyframeInterval="キーフレーム間隔"
175
+KeyframeInterval.Description="キーフレーム同士の間隔(秒単位)。"
176
+H264.IDRPeriod="IDR 周期 (フレーム数)"
177
+H264.IDRPeriod.Description="フレーム内の瞬時デコードリフレッシュ (IDR) 間の距離を定義します。 GOP-シーケンスのサイズも制御します。"
178
+H265.IDRPeriod="IDR 周期 (GOP数)"
179
+H265.IDRPeriod.Description="GOP内の瞬時デコードリフレッシュ (IDR) 間の距離を定義します。"
180
+GOP.Type="GOP 型"
181
+GOP.Type.Description="使用する GOP 型:\n - '\@GOP.Type.Fixed\@' 常にそれぞれの GOP 間の固定距離を使用。\n '\@GOP.Type.Variable\@' 必要に応じて、さまざまなサイズの Gop が使用されます。\n'\@GOP.Type.Fixed\@' はH264の実装方法次第でローカルネットワーク配信に最適で、一方 ' \@GOP.Type.Variable\@' はサイズ小さいの高品質の録画に最適です。"
182
+GOP.Type.Fixed="固定"
183
+GOP.Type.Variable="可変"
184
+GOP.Size="GOP サイズ"
185
+GOP.Size.Description="フレームの GOP (画像グループ) のサイズ。"
186
+GOP.Size.Minimum="GOP サイズの最小値"
187
+GOP.Size.Minimum.Description="フレームの GOP (画像グループ) の最小サイズ。"
188
+GOP.Size.Maximum="GOP サイズの最大値"
189
+GOP.Size.Maximum.Description="フレームの GOP (画像グループ) の最大サイズ。"
190
+GOP.Alignment="GOP 配置"
191
+GOP.Alignment.Description="実験的で、効果は不明です。自己責任で使用してください。"
192
+BFrame.Pattern="B-フレームパターン"
193
+BFrame.Pattern.Description="エンコード時に使用するBフレームの数。\n第2世代および第3世代のVCEカードでサポートされています。 エンコード時のパフォーマンスに悪影響を与えます。"
194
+BFrame.DeltaQP="B-フレームデルタ QP"
195
+BFrame.DeltaQP.Description="参照不可能なB-フレームに対する最後のI-フレームまたはP-フレームまでのデルタ QP の値。"
196
+BFrame.Reference="B-フレーム参照"
197
+BFrame.Reference.Description="B-フレームはP-フレームとI-フレームだけでなく、B-フレームも参照として使用できます。"
198
+BFrame.ReferenceDeltaQP="B-フレーム参照デルタ QP"
199
+BFrame.ReferenceDeltaQP.Description="参照可能なB-フレームに対する最後のI-フレームまたはP-フレームまでのデルタ QP の値。"
200
+DeblockingFilter="デブロックフィルタ"
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/ko-KR.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/ko-KR.ini
Changed
201
1
2
-AMF.Util.Default="기본값"
3
-AMF.Util.Automatic="자동"
4
-AMF.Util.Manual="수동"
5
-AMF.Util.Toggle.Disabled="비활성화"
6
-AMF.Util.Toggle.Enabled="활성화"
7
-AMF.H264.Preset="사전 설정"
8
-AMF.H264.Preset.ResetToDefaults="기본값으로 복구"
9
-AMF.H264.Preset.Recording="녹화"
10
-AMF.H264.Preset.HighQuality="우수한 품질"
11
-AMF.H264.Preset.Indistinguishable="무손실과 거의 구분 불가"
12
-AMF.H264.Preset.Lossless="무손실"
13
-AMF.H264.Preset.Twitch="트위치"
14
-AMF.H264.Preset.YouTube="유튜브"
15
-AMF.H264.Usage="용도"
16
-AMF.H264.Usage.Description="용도에 따라 AMF을 조율합니다:\n- '트랜스코딩'은 일반적인 용도에 적합한 설정입니다(추천).\n- '매우 낮은 지연시간'은 아주 낮은 인코딩 레이턴시를 의미합니다.\n- '낮은 지연시간'은 그 수준이 조금 더 높습니다.\n방송 목적으로는 '트랜스코딩'만 지원됩니다. 모든 다른 설정값은 녹화 용도에만 사용됩니다."
17
-AMF.H264.Usage.Transcoding="트랜스코딩"
18
-AMF.H264.Usage.UltraLowLatency="매우 낮은 지연 시간"
19
-AMF.H264.Usage.LowLatency="낮은 지연 시간"
20
-AMF.H264.QualityPreset="품질 사전 설정"
21
-AMF.H264.QualityPreset.Description="AMF 품질을 결정할 때 어떤 수준을 목표로 할지 결정합니다:\n-'속도'는 가장 빠르지만, 품질이 가장 나쁘며,\n- '균형'은 '속도'와 '품질' 사이의 수준을 제공합니다.\n- '품질'은 주어진 비트레이트 내에서 가장 뛰어난 품질을 제공합니다."
22
-AMF.H264.QualityPreset.Speed="속도"
23
-AMF.H264.QualityPreset.Balanced="균형"
24
-AMF.H264.QualityPreset.Quality="품질"
25
-AMF.H264.Profile="프로파일"
26
-AMF.H264.Profile.Description="인코딩에 사용할 H.264 프로파일을 선택합니다:\n- 'Baseline'은 지원하는 플랫폼이 가장 많습니다,\n- 'Main'은 비교적 오래된 장치에서 지원합니다. (모바일 장치를 대상으로 한다면 추천하는 설정입니다),\n- 'High'는 현재 장치에서 지원하는 설정입니다 (추천)."
27
-AMF.H264.ProfileLevel="프로필 수준"
28
-AMF.H264.ProfileLevel.Description="인코딩으로 사용할 H.264 프로파일 수준을 지정합니다:\n-'자동'은 설정된 프레임과 그 크기에 맞춰 가장 좋은 수준을 계산합니다,\n-'4.1'은 1920x1080 30FPS, 1280x720 60FPS, 960x540 90FPS을 지원합니다,\n-'4.2'는 1920x1080 60FPS, 1280x720 120FPS, 960x540 172FPS을 지원합니다,\n- '5.0'은 1920x1080 60FPS, 1280x720 144FPS, 960x540 172FPS을 지원합니다,\n- '5.1'은 3840x2160 30FPS, 1920x1080 120FPS, 1280x720 172FPS, 960x540 172FPS을 지원합니다,\n- '5.2'은 3840x2160 60FPS, 1920x1080 172FPS, 1280x720 172FPS, 960x540 172FPS을 지원합니다."
29
-AMF.H264.RateControlMethod="속도 제어 방식"
30
-AMF.H264.RateControlMethod.Description="속도 제어 동작 방식을 설정합니다:\n- '\@AMF.H264.RateControlMethod.CQP\@'는 고정된 I-/P-/B- 프레임 QP (양자화 매개변수) 값을 할당합니다, \n- '\@AMF.H264.RateControlMethod.CBR\@'은 주어진 목표 비트레이트를 유지합니다. (채우기 정보를 사용)(방송에 추천함),\n- '\@AMF.H264.RateControlMethod.VBR\@'은 주어진 최대 비트레이트보다 낮은 수준을 유지합니다,\n- '\@AMF.H264.RateControlMethod.VBR_LAT\@'는 GPU의 지연시간과 부하가 허용한다면 목표 비트레이트에 가까운 수준을 유지하며, 그렇지 않은 상황에서는 그보다 높은 비트레이트를 사용합니다. (녹화에 추천)."
31
-AMF.H264.RateControlMethod.CQP="고정 QP (CQP)"
32
-AMF.H264.RateControlMethod.CBR="고정 비트레이트 (CBR)"
33
-AMF.H264.RateControlMethod.VBR.Peak="가변 비트레이트 (최대 비트레이트 제약) (VBR)"
34
-AMF.H264.RateControlMethod.VBR.Latency="가변 비트레이트(지연율 제약) (VBR_LAT)"
35
-AMF.H264.Bitrate.Target="목표 비트레이트"
36
-AMF.H264.Bitrate.Target.Description="전체 장면에서 달성하려는 비트레이트"
37
-AMF.H264.Bitrate.Peak="최대 비트레이트"
38
-AMF.H264.Bitrate.Peak.Description="전체 장면에서 달성하려는 비트레이트 최고조"
39
-AMF.H264.QP.Minimum="최소 QP"
40
-AMF.H264.QP.Minimum.Description="하나의 프레임에 사용하는 최저 QP (양자화 매개변수) 값"
41
-AMF.H264.QP.Maximum="최대 QP"
42
-AMF.H264.QP.Maximum.Description="하나의 프레임에 사용하는 최고 QP (양자화 매개변수) 값"
43
-AMF.H264.QP.IFrame="I-프레임 QP"
44
-AMF.H264.QP.IFrame.Description="I-화면에 사용할 고정 QP 값입니다."
45
-AMF.H264.QP.PFrame="P-프레임 QP"
46
-AMF.H264.QP.PFrame.Description="P-화면에 사용할 고정 QP 값입니다."
47
-AMF.H264.QP.BFrame="BP-프레임 QP"
48
-AMF.H264.QP.BFrame.Description="B-화면에 사용하는 고정 QP (양자화 매개변수) 값."
49
-AMF.H264.VBVBuffer="VBV 버퍼"
50
-AMF.H264.VBVBuffer.Description="VBV 버퍼 크기를 결정하는 방식을 설정합니다:\n-'자동'은 엄격도의 제약하에 크기를 계산합니다.\n-'수동'은 사용자가 크기를 조절할 수 있도록 허용합니다.\n일부 특정 속도제어 방식이 사용하는 VBV (Video Buffering Verifier) 버퍼는 제공된 제약 안에서 전반적인 비트레이트를 유지합니다."
51
-AMF.H264.VBVBuffer.Strictness="VBV 버퍼 엄격도"
52
-AMF.H264.VBVBuffer.Strictness.Description="VBV 버퍼의 엄격도를 설정합니다. 0%는 제약이 사라지고 100%는 최대한 제한을 합니다."
53
-AMF.H264.VBVBuffer.Size="VBV 버퍼 크기"
54
-AMF.H264.VBVBuffer.Size.Description="VBV의 크기는 한 장면의 비트레이트 제어에 사용하는 단위입니다."
55
-AMF.H264.VBVBuffer.Fullness="VBV 버퍼 충만도"
56
-AMF.H264.VBVBuffer.Fullness.Description="초기 VBV버퍼가 얼마나 충만한지는 오로지 인코딩의 초반에만 영향을 미칩니다."
57
-AMF.H264.FillerData="채우기 정보"
58
-AMF.H264.FillerData.Description="데이터 채우기는 인코더가 한 장면에 남은 공간을 빈 정보로 채워 목표 비트레이트를 유지할 수 있도록 합니다."
59
-AMF.H264.FrameSkipping="프레임 생략"
60
-AMF.H264.FrameSkipping.Description="프레임 생략은 인코더가 목표로 하는 비트레이트 요건을 맞추기 위해 프레임을 떨어뜨릴 수 있습니다.\n인코더가 프레임 하나를 떨어뜨리면 마지막 프레임 NAL을 대신 전송합니다.\n목표 비트레이트가 아주 낮을 때 도움이 될 수 있습니다."
61
-AMF.H264.EnforceHRDCompatibility="HDR 호환모드 적용"
62
-AMF.H264.EnforceHRDCompatibility.Description="이론적 기본 디코더 강제는 프레임 하나의 최대 QP값 변화를 제한하는 설정입니다.\n녹화나 방송에는 적합하지 않고 기본 소프트웨어 디코더만 사용 가능한 매우 낡은 장치에서 영상을 재생할 때 사용합니다."
63
-AMF.H264.KeyframeInterval="키프레임 간격"
64
-AMF.H264.KeyframeInterval.Description="손실이 불가능한 프레임 사이에 얼마나 많은 시간(초)이 필요한지 설정합니다.\n또한 영상(GOP) 크기도 제어합니다."
65
-AMF.H264.IDRPeriod="IDR 주기"
66
-AMF.H264.IDRPeriod.Description="프레임 내에서 순간 복호 갱신(nstantaneous Decoding Refreshes) 사이의 거리를 설정합니다. 또한, GOP-장면 크기를 제어합니다."
67
-AMF.H264.BFrame.Pattern="B-화면"
68
-AMF.H264.BFrame.Pattern.Description="인코딩에 얼마나 많은 B-화면을 사용할지 설정합니다.\n2, 3세대 VCE카드에서 지원합니다. 인코딩 성능에 부정적인 영향을 줍니다."
69
-AMF.H264.BFrame.DeltaQP="B-화면 델타 QP"
70
-AMF.H264.BFrame.DeltaQP.Description="비참조 B-화면에 쓰이는 마지막 I- 혹은P-화면의 델타 QP 값"
71
-AMF.H264.BFrame.Reference="참조가능한 B-화면"
72
-AMF.H264.BFrame.Reference.Description="P-와 I-화면뿐만 아니라 B-화면도 참조할 수 있도록 허용합니다."
73
-AMF.H264.BFrame.ReferenceDeltaQP="참조가능한 B-화면 델타 QP"
74
-AMF.H264.BFrame.ReferenceDeltaQP.Description="비참조 B-화면에 쓰이는 마지막 I- 혹은P-화면의 델타 QP 값."
75
-AMF.H264.DeblockingFilter="디블록 필터"
76
-AMF.H264.DeblockingFilter.Description="디코더가 인코딩된 작업에 디블록 필터를 사용할 수 있도록 허용합니다."
77
-AMF.H264.ScanType="스캔 형식"
78
-AMF.H264.ScanType.Description="주사 방식을 설정합니다. 항상 '프로그레시브'로 두십시오."
79
-AMF.H264.ScanType.Progressive="프로그레시브"
80
-AMF.H264.ScanType.Interlaced="인터레이스"
81
-AMF.H264.MotionEstimation="동작 예측"
82
-AMF.H264.MotionEstimation.Description="동작 추정은 픽셀의 움직임을 추정하여 필요한 비트레이트를 줄일 수 있게 합니다."
83
-AMF.H264.MotionEstimation.None="없음"
84
-AMF.H264.MotionEstimation.Half="1/2 화소"
85
-AMF.H264.MotionEstimation.Quarter="1/4 화소"
86
-AMF.H264.MotionEstimation.Both="1/2 & 1/4 화소"
87
-AMF.H264.CodingType="부호화 형식"
88
-AMF.H264.CodingType.Description="부호화 형식을 결정합니다:\n* \@AMF.Util.Default\@ 은 AMF가 자동으로 선택합니다 (추천).\n* CALVC (문맥기반 적응적 가변길이 부호화) 는 빠르지만, 더 큽니다.\n* CABAC (문맥기반 적응적 이진산술 부호화) 는 느리지만, 더 작습니다."
89
+Utility.Default="기본값"
90
+Utility.Automatic="자동"
91
+Utility.Manual="수동"
92
+Utility.Switch.Disabled="비활성화"
93
+Utility.Switch.Enabled="활성화"
94
+Preset="사전 설정"
95
+Preset.ResetToDefaults="기본값으로 복구"
96
+Preset.Recording="녹화 중"
97
+Preset.HighQuality="우수한 품질"
98
+Preset.Indistinguishable="무손실과 거의 구분 불가"
99
+Preset.Lossless="무손실"
100
+Preset.Twitch="트위치"
101
+Preset.YouTube="유튜브"
102
+Usage="용도"
103
+Usage.Description="용도에 따라 AMF을 조율합니다:\n- '트랜스코딩'은 일반적인 용도에 적합한 설정입니다(추천).\n- '매우 낮은 지연시간'은 아주 낮은 인코딩 레이턴시를 의미합니다.\n- '낮은 지연시간'은 그 수준이 조금 더 높습니다.\n방송 목적으로는 '트랜스코딩'만 지원됩니다. 모든 다른 설정값은 녹화 용도에만 사용됩니다."
104
+Usage.Transcoding="트랜스코딩"
105
+Usage.UltraLowLatency="매우 낮은 지연 시간"
106
+Usage.LowLatency="낮은 지연 시간"
107
+Usage.Webcam="웹캠"
108
+QualityPreset="품질 사전 설정"
109
+QualityPreset.Description="AMF에서 목표로 하는 품질을 설정합니다:\n- '\@QualityPreset.Speed\@' 는 빠르지만 품질이 떨어지는 반면,\n- '\@QualityPreset.Balanced\@' 는 품질과 속도에 균형을 이룹니다.\n- '\@QualityPreset.Quality\@' 는 설정된 비트레이트 안에서 최고의 품질을 제공합니다."
110
+QualityPreset.Speed="속도"
111
+QualityPreset.Balanced="균형"
112
+QualityPreset.Quality="품질"
113
+Profile="프로파일"
114
+Profile.Description="인코딩에서 사용할 수 있는 프로파일을 나열했습니다."
115
+ProfileLevel="프로필 수준"
116
+ProfileLevel.Description="인코딩에서 사용할 프로필 수준을 결정합니다. \@Utility.Automatic\@로 둘 것을 권장합니다."
117
+Tier="단계"
118
+Tier.Description="인코딩에서 사용하는 단계를 설정합니다. Main이 기본 수준입니다. High는 높은 비트레이트를 필요로 하는 용도에 적합합니다."
119
+AspectRatio="가로세로 비율"
120
+AspectRatio.Description="출력 파일의 가로 세로 비율을 설정합니다."
121
+CodingType="부호화 형식"
122
+CodingType.Description="부호화 형식을 결정합니다:\n* \@AMF.Util.Default\@ 은 AMF가 자동으로 선택합니다 (추천).\n* CALVC (문맥기반 적응적 가변길이 부호화) 는 빠르지만, 더 큽니다.\n* CABAC (문맥기반 적응적 이진산술 부호화) 는 느리지만, 더 작습니다."
123
+MaximumReferenceFrames="최대 참조 프레임"
124
+MaximumReferenceFrames.Description="인코더가 얼마나 많은 프레임을 참조할지 설정합니다. 인코딩 품질에 큰 영향을 미칩니다."
125
+RateControlMethod="속도 제어 방식"
126
+RateControlMethod.Description="속도 제어 동작 방식을 설정합니다:\n- '\@AMF.H264.RateControlMethod.CQP\@'는 고정된 I-/P-/B- 프레임 QP (양자화 매개변수) 값을 할당합니다, \n- '\@AMF.H264.RateControlMethod.CBR\@'은 주어진 목표 비트레이트를 유지합니다. (채우기 정보를 사용)(방송에 추천함),\n- '\@AMF.H264.RateControlMethod.VBR\@'은 주어진 최대 비트레이트보다 낮은 수준을 유지합니다,\n- '\@AMF.H264.RateControlMethod.VBR_LAT\@'는 GPU의 지연시간과 부하가 허용한다면 목표 비트레이트에 가까운 수준을 유지하며, 그렇지 않은 상황에서는 그보다 높은 비트레이트를 사용합니다. (녹화에 추천)."
127
+RateControlMethod.CQP="고정 QP (CQP)"
128
+RateControlMethod.CBR="고정 비트레이트 (CBR)"
129
+RateControlMethod.VBR="가변 비트레이트 (최대 비트레이트 제약) (VBR)"
130
+RateControlMethod.VBRLAT="가변 비트레이트(지연율 제약) (VBR_LAT)"
131
+PrePassMode="프리-패스 모드"
132
+PrePassMode.Description="프리-패스 방식은 부가적인 처리를 하여 한 장면에서 비트레이트를 더 효율적으로 배분합니다. 카드마다 결과가 다를 수 있습니다."
133
+PrePassMode.Quarter="\@Utility.Switch.Enabled\@ (1/4 크기)"
134
+PrePassMode.Half="\@Utility.Switch.Enabled\@ (1/2 크기)"
135
+PrePassMode.Full="\@Utility.Switch.Enabled\@ (실물 크기)"
136
+Bitrate.Target="목표 비트레이트"
137
+Bitrate.Target.Description="전체 장면에서 달성하려는 비트레이트"
138
+Bitrate.Peak="최대 비트레이트"
139
+Bitrate.Peak.Description="전체 장면에서 달성하려는 비트레이트 최고조"
140
+QP.IFrame="I-프레임 QP"
141
+QP.IFrame.Description="I-화면에 사용할 고정 QP 값입니다."
142
+QP.PFrame="P-프레임 QP"
143
+QP.PFrame.Description="P-화면에 사용할 고정 QP 값입니다."
144
+QP.BFrame="B-프레임 QP"
145
+QP.BFrame.Description="B-화면에 사용할 고정 QP 값입니다."
146
+QP.Minimum="최소 QP"
147
+QP.Minimum.Description="프레임 한 장에 사용할 최저 QP 값입니다."
148
+QP.IFrame.Minimum="최소 I-프레임 QP"
149
+QP.IFrame.Minimum.Description="I-프레임 한 장에 사용할 최저 QP 값입니다."
150
+QP.PFrame.Minimum="최소 P-프레임 QP"
151
+QP.PFrame.Minimum.Description="P-프레임 한 장에 사용할 최저 QP 값입니다."
152
+QP.Maximum="최대 QP"
153
+QP.Maximum.Description="프레임 한 장에 사용할 최고 QP 값입니다."
154
+QP.IFrame.Maximum="최대 I-프레임 QP"
155
+QP.IFrame.Maximum.Description="I-프레임 한 장에 사용할 최고 QP 값입니다."
156
+QP.PFrame.Maximum="최대 P-프레임 QP"
157
+QP.PFrame.Maximum.Description="P-프레임 한 장에 사용할 최고 QP 값입니다."
158
+FillerData="채우기 정보"
159
+FillerData.Description="데이터 채우기는 인코더가 한 장면에 남은 공간을 빈 정보로 채워 목표 비트레이트를 유지할 수 있도록 합니다."
160
+FrameSkipping="프레임 생략"
161
+FrameSkipping.Description="프레임 생략은 인코더가 목표로 하는 비트레이트 요건을 맞추기 위해 프레임을 떨어뜨릴 수 있습니다.\n인코더가 프레임 하나를 떨어뜨리면 마지막 프레임 NAL을 대신 전송합니다.\n목표 비트레이트가 아주 낮을 때 도움이 될 수 있습니다."
162
+VBAQ="VBAQ"
163
+VBAQ.Description="'분산 기반 적응 양자화' (VBAQ) 를 사용하여 비트레이트를 효율적으로 배분합니다.\n이 방식은 인간의 시각 체계가 고밀도의 질감을 표현하는 영역에서 보이는 인공결함에 대해 덜 예민한 점을 이용했습니다. 따라서 동일한 비트레이트로 더 매끄러운 표면을 연출할 수 있습니다.\n처리하는 영상의 내용에 따라 품질에 대한 주관적인 평가가 개선될 수 있습니다."
164
+EnforceHRD="HRD 강제 적용"
165
+EnforceHRD.Description="가상 참조 디코더를 강제로 적용하여 출력 비트스트림을 검증합니다."
166
+VBVBuffer="VBV 버퍼"
167
+VBVBuffer.Description="VBV 버퍼 크기를 결정하는 방식을 설정합니다:\n-'자동'은 엄격도의 제약하에 크기를 계산합니다.\n-'수동'은 사용자가 크기를 조절할 수 있도록 허용합니다.\n일부 특정 속도제어 방식이 사용하는 VBV (Video Buffering Verifier) 버퍼는 제공된 제약 안에서 전반적인 비트레이트를 유지합니다."
168
+VBVBuffer.Strictness="VBV 버퍼 엄격도"
169
+VBVBuffer.Strictness.Description="VBV 버퍼의 엄격도를 설정합니다. 0%는 제약이 사라지고 100%는 최대한 제한을 합니다."
170
+VBVBuffer.Size="VBV 버퍼 크기"
171
+VBVBuffer.Size.Description="VBV의 크기는 한 장면의 비트레이트 제어에 사용하는 단위입니다."
172
+VBVBuffer.InitialFullness="VBV 버퍼 초기 충만도"
173
+VBVBuffer.InitialFullness.Description="초기 VBV버퍼가 얼마나 충만한지는 오로지 인코딩의 초반에만 영향을 미칩니다."
174
+KeyframeInterval="키프레임 간격"
175
+KeyframeInterval.Description="키프레임 사이의 간격 (초)."
176
+H264.IDRPeriod="IDR 기간 (프레임)"
177
+H264.IDRPeriod.Description="프레임 내에서 순간 복호 갱신(nstantaneous Decoding Refreshes) 사이의 거리를 설정합니다. 또한, GOP-장면 크기를 제어합니다."
178
+H265.IDRPeriod="IDR 기간 (프레임)"
179
+H265.IDRPeriod.Description="GOP 내에서 Instantaneous Decoding Refreshes (IDR) 의 간격을 설정합니다."
180
+GOP.Type="GOP 형식"
181
+GOP.Type.Description="GOP 형식을 결정합니다:\n- '\@GOP.Type.Fixed\@'는 GOP 간격을 항상 고정합니다.\n- '\@GOP.Type.Variable\@' 는 GOP 의 크기를 필요에 따라 조정합니다.\n'\@GOP.Type.Fixed\@'는 H264적용 방식이며 로컬 네트워크 스트리밍에 가장 알맞습니다. '\@GOP.Type.Variable\@'는 작은 크기, 고품질 녹화에 가장 알맞습니다."
182
+GOP.Type.Fixed="고정"
183
+GOP.Type.Variable="가변"
184
+GOP.Size="GOP 크기"
185
+GOP.Size.Description="프레임 내 GOP 크기"
186
+GOP.Size.Minimum="GOP 크기 최소"
187
+GOP.Size.Minimum.Description="프레임 내 GOP 크기를 최소화함"
188
+GOP.Size.Maximum="GOP 크기 최대"
189
+GOP.Size.Maximum.Description="프레임 내 GOP(Group of Pictures) 크기를 최대화함"
190
+GOP.Alignment="GOP 조정"
191
+GOP.Alignment.Description="현재 실험 및 개발 중인 기능입니다."
192
+BFrame.Pattern="B-화면 양상"
193
+BFrame.Pattern.Description="인코딩에 얼마나 많은 B-화면을 사용할지 설정합니다.\n2, 3세대 VCE카드에서 지원합니다. 인코딩 성능에 부정적인 영향을 줍니다."
194
+BFrame.DeltaQP="B-화면 델타 QP"
195
+BFrame.DeltaQP.Description="비참조 B-화면에 쓰이는 마지막 I- 혹은P-화면의 델타 QP 값"
196
+BFrame.Reference="B-프레임 참조"
197
+BFrame.Reference.Description="P-와 I-화면뿐만 아니라 B-화면도 참조할 수 있도록 허용합니다."
198
+BFrame.ReferenceDeltaQP="B-프레임 참조 델타 QP"
199
+BFrame.ReferenceDeltaQP.Description="참조 B-화면에 쓰이는 마지막 I- 혹은P-화면의 델타 QP 값."
200
+DeblockingFilter="디블록 필터"
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/nb-NO.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/nb-NO.ini
Changed
42
1
2
-AMF.Util.Default="Standard"
3
-AMF.Util.Automatic="Automatisk"
4
-AMF.Util.Toggle.Disabled="Deaktivert"
5
-AMF.Util.Toggle.Enabled="Aktivert"
6
-AMF.H264.Usage.Transcoding="Transkoding"
7
-AMF.H264.Usage.UltraLowLatency="Ultra-lav latens"
8
-AMF.H264.Usage.LowLatency="Lav latens"
9
-AMF.H264.QualityPreset="Kvalitet forhåndsinnstilling"
10
-AMF.H264.QualityPreset.Speed="Hastighet"
11
-AMF.H264.QualityPreset.Balanced="Balansert"
12
-AMF.H264.QualityPreset.Quality="Kvalitet"
13
-AMF.H264.Profile="Profil"
14
-AMF.H264.ProfileLevel="Profilnivå"
15
-AMF.H264.Bitrate.Target="Mål Bitrate"
16
-AMF.H264.Bitrate.Peak="Maks bitrate"
17
-AMF.H264.QP.Minimum="Minste QP"
18
-AMF.H264.QP.Maximum="Maksimal QP"
19
-AMF.H264.EnforceHRDCompatibility="Håndheve HRD kompatibilitet"
20
-AMF.H264.ScanType="Skanne Type"
21
+Utility.Default="Standard"
22
+Utility.Automatic="Automatisk"
23
+Utility.Manual="Manuell"
24
+Utility.Switch.Disabled="Deaktivert"
25
+Utility.Switch.Enabled="Aktivert"
26
+Preset="Preset"
27
+Preset.ResetToDefaults="Tilbakestill innstillinger"
28
+Preset.Recording="Opptak"
29
+Preset.HighQuality="Høy kvalitet"
30
+Preset.Lossless="Tapsfri"
31
+Preset.Twitch="Twitch"
32
+Preset.YouTube="YouTube"
33
+Usage.Transcoding="Transkoding"
34
+Usage.Webcam="Webkamera"
35
+QualityPreset.Speed="Hastighet"
36
+QualityPreset.Balanced="Balansert"
37
+QualityPreset.Quality="Kvalitet"
38
+Profile="Profil"
39
+Profile.Description="Hvilke profil å kode med. Sortert fra best støttede (øverst) til beste kvalitet (nederst)."
40
+ProfileLevel="Profilnivå"
41
42
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/nl-NL.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/nl-NL.ini
Changed
192
1
2
-AMF.Util.Default="Standaard"
3
-AMF.Util.Automatic="Automatisch"
4
-AMF.Util.Manual="Handmatig"
5
-AMF.Util.Toggle.Disabled="Uitgeschakeld"
6
-AMF.Util.Toggle.Enabled="Ingeschakeld"
7
-AMF.H264.Preset="Voorkeursinstelling"
8
-AMF.H264.Preset.ResetToDefaults="Standaardinstellingen herstellen"
9
-AMF.H264.Preset.Recording="Opname"
10
-AMF.H264.Preset.HighQuality="Hoge kwaliteit"
11
-AMF.H264.Preset.Indistinguishable="Ononderscheidbaar"
12
-AMF.H264.Preset.Lossless="Lossless"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Gebruik"
16
-AMF.H264.Usage.Description="Voor welk gebruik moet AMF ingesteld worden:\n- 'Transcoden' is standaard transcoden (aanbevolen),\n- 'Ultra Low Latency' is voor erg lage latency encoding,\n- 'Low Latency' is vergelijkbaar met bovenstaande met een iets hogere latency.\nVoor streamen is alleen 'Transcoden' mogelijk, alle andere waarden kunnen worden gebruikt voor opnemen."
17
-AMF.H264.Usage.Transcoding="Transcoding"
18
-AMF.H264.Usage.UltraLowLatency="Ultra Low Latency"
19
-AMF.H264.Usage.LowLatency="Low Latency"
20
-AMF.H264.QualityPreset="Kwaliteitsinstelling"
21
-AMF.H264.QualityPreset.Description="Welke kwaliteitsinstelling AMF moet proberen te halen:\n- '\@AMF.H264.QualityPreset.Speed\@' is de snelste maar heeft de slechtste kwaliteit,\n- '\@AMF.H264.QualityPreset.Balanced\@' is een gebalanceerde mix van beide,\n- '\@AMF.H264.QualityPreset.Quality\@' geeft de beste kwaliteit voor een gekozen bitrate."
22
-AMF.H264.QualityPreset.Speed="Snelheid"
23
-AMF.H264.QualityPreset.Balanced="Gebalanceerd"
24
-AMF.H264.QualityPreset.Quality="Kwaliteit"
25
-AMF.H264.Profile="Profiel"
26
-AMF.H264.Profile.Description="Welk h.264 profiel gebruikt moet worden, gesorteerd van beste kwaliteit tot breedste ondersteuning."
27
-AMF.H264.ProfileLevel="Profielniveau"
28
-AMF.H264.ProfileLevel.Description="Welk H.264 profielniveau moet worden gebruikt voor encoden:\n- 'Automatisch' berekent het beste profielniveau voor de gebruikte framerate en framegrootte.\n- '4.1' ondersteunt 1920x1080 30FPS, 1280x720 60FPS, 960x540 90FPS\n- '4.2' ondersteunt 1920x1080 60FPS, 1280x720 120FPS, 960x540 172FPS\n- '5.0' ondersteunt1920x1080 60FPS, 1280x720 144FPS, 960x540 172FPS\n- '5.1' ondersteunt3840x2160 30FPS, 1920x1080 120FPS, 1280x720 172FPS, 960x540 172FPS\n- '5.2' ondersteunt 3840x2160 60FPS, 1920x1080 172FPS, 1280x720 172FPS, 960x540 172FPS"
29
-AMF.H264.RateControlMethod="Rate control methode"
30
-AMF.H264.RateControlMethod.Description="Welke rate control methode gebruikt moet worden:\n- '\@AMF.H264.RateControlMethod.CQP\@' kent vaste I-/P-/B-Frame QP waardes toe,\n- '\@AMF.H264.RateControlMethod.CBR\@' blijft op de insgestelde doelbitrate (met opvuldata) (aanbevolen voor streamen),\n- '\@AMF.H264.RateControlMethod.VBR\@' blijft onder de ingestelde piek bitrate,\n- '\@AMF.H264.RateControlMethod.VBR_LAT\@' blijft in de buurt van de doelbitrate als de GPU latency en belasting het toestaan, anders zal er een hogere bitrate worden gebruikt (aanbevolen voor opnames)."
31
-AMF.H264.RateControlMethod.CQP="Constant QP (CQP)"
32
-AMF.H264.RateControlMethod.CBR="Constant Bitrate (CBR)"
33
-AMF.H264.RateControlMethod.VBR.Peak="Variable Bitrate (Peak Constrained) (VBR)"
34
-AMF.H264.RateControlMethod.VBR.Latency="Variable Bitrate (Latency Constrained) (VBR_LAT)"
35
-AMF.H264.Bitrate.Target="Doelbitrate"
36
-AMF.H264.Bitrate.Target.Description="Bitrate om te proberen aan te houden in de gehele reeks."
37
-AMF.H264.Bitrate.Peak="Maximale bitrate"
38
-AMF.H264.Bitrate.Peak.Description="Bitrate om in de gehele reeks maximaal naartoe te pieken."
39
-AMF.H264.QP.Minimum="Minimale QP"
40
-AMF.H264.QP.Minimum.Description="Laagste QP waarde om te gebruiken in een frame."
41
-AMF.H264.QP.Maximum="Maximale QP"
42
-AMF.H264.QP.Maximum.Description="Hoogste QP waarde om te gebruiken in een frame."
43
-AMF.H264.QP.IFrame="I-Frame QP"
44
-AMF.H264.QP.IFrame.Description="Vaste QP waarde om te gebruiken voor I-frames."
45
-AMF.H264.QP.PFrame="P-Frame QP"
46
-AMF.H264.QP.PFrame.Description="Vaste QP waarde om te gebruiken voor P-frames."
47
-AMF.H264.QP.BFrame="B-Frame QP"
48
-AMF.H264.QP.BFrame.Description="Vaste QP waarde om te gebruiken voor B-frames."
49
-AMF.H264.VBVBuffer="VBV Buffer"
50
-AMF.H264.VBVBuffer.Description="Welke methode moet worden gebruikt om de VBV buffergrootte te bepalen:\n- '\@AMF.Util.Automatic\@' berekent de grootte met een strengheid-instelling.\n- '\@AMF.Util.Manual\@' laat de gebruiker de grootte bepalen.\nVBV (Video Buffering Verifier) buffer wordt gebruikt door bepaalde Rate Control methodes om de algehele bitrate binnen de aangegeven perken te houden."
51
-AMF.H264.VBVBuffer.Strictness="VBV Buffer-strengheid"
52
-AMF.H264.VBVBuffer.Strictness.Description="Bepaalt de strengheid van de VBV buffer, waar 100% zo streng mogelijk is, en 0% geen restricties oplegt."
53
-AMF.H264.VBVBuffer.Size="VBV Buffergrootte"
54
-AMF.H264.VBVBuffer.Size.Description="De grootte van de VBV Buffer welke wordt gebruikt voor bitrate controle in een reeks."
55
-AMF.H264.VBVBuffer.Fullness="VBV Buffervulling"
56
-AMF.H264.VBVBuffer.Fullness.Description="Hoe vol de VBV Buffer initieel is, beïnvloedt alleen de initiële reeks van encoden."
57
-AMF.H264.FillerData="Opvuldata"
58
-AMF.H264.FillerData.Description="Inschakelen van opvuldata laat de encoder tenminste de doelbitrate aanhouden door de overtollige ruimte in een reeks te vullen met lege informatie."
59
-AMF.H264.FrameSkipping="Frames overslaan"
60
-AMF.H264.FrameSkipping.Description="Frame Skipping laat een encoder frames droppen om de doelbitrate te halen.\nAls de encoder een frame dropt vult het een herhaal-laatste-frame NAL in de stream.\nKan helpen bij erg lage doelbitrates."
61
-AMF.H264.EnforceHRDCompatibility="Forceer HDR compatibiliteit"
62
-AMF.H264.EnforceHRDCompatibility.Description="Forceer hypothetische referentiedecoder-restricties welke de maximale QP waarde veranderen binnen een frame."
63
-AMF.H264.KeyframeInterval="Keyframe-Interval"
64
-AMF.H264.KeyframeInterval.Description="Bepaalt de afstand tussen keyframes in seconden. Bepaalt ook de GOP-sequence size."
65
-AMF.H264.IDRPeriod="IDR Periode"
66
-AMF.H264.IDRPeriod.Description="Bepaalt de afstand tussen Instantaneous Decoding Refreshes (IDR) in frames. Bepaalt ook de GOP-sequence size."
67
-AMF.H264.BFrame.Pattern="B-frames"
68
-AMF.H264.BFrame.Pattern.Description="Het aantal B-frames om te gebruiken tijdens het encoden.\nOndersteund door 2e en 3e generatie VCE-kaarten. Negatieve invloed op encodingprestaties."
69
-AMF.H264.BFrame.DeltaQP="Delta QP voor B-frames"
70
-AMF.H264.BFrame.DeltaQP.Description="Delta QP waarde tot de laatste I- of P-frame voor niet-refereerbare B-frames."
71
-AMF.H264.BFrame.Reference="Refereerbare B-frames"
72
-AMF.H264.BFrame.Reference.Description="Laat een B-frame ook B-frames gebruiken als referentie, in plaats van enkel P- en I-frames."
73
-AMF.H264.BFrame.ReferenceDeltaQP="Delta QP voor refereerbare B-frames"
74
-AMF.H264.BFrame.ReferenceDeltaQP.Description="Delta QP waarde tot de laatste I- of P-frame voor refereerbare B-frames."
75
-AMF.H264.DeblockingFilter="Deblocking Filter"
76
-AMF.H264.DeblockingFilter.Description="Staat de encoder toe om een Deblocking Filter te gebruiken voor de gecodeerde stream."
77
-AMF.H264.ScanType="Scantype"
78
-AMF.H264.ScanType.Description="Welke scanmethode gebruikt moet worden, laat dit altijd op '\@AMF.H264.ScanType.Progressive\@'."
79
-AMF.H264.ScanType.Progressive="Progressive"
80
-AMF.H264.ScanType.Interlaced="Interlaced"
81
-AMF.H264.MotionEstimation="Bewegingsschatting"
82
-AMF.H264.MotionEstimation.Description="Bewigingsschatting laat de encoder de benodigde bitrate verlagen door te schatten waar een pixel heen ging."
83
-AMF.H264.MotionEstimation.None="Geen"
84
-AMF.H264.MotionEstimation.Half="Halve pixel"
85
-AMF.H264.MotionEstimation.Quarter="Kwartpixel"
86
-AMF.H264.MotionEstimation.Both="Halve en kwartpixel"
87
-AMF.H264.CodingType="Codeertype"
88
-AMF.H264.CodingType.Description="Welk codeertype gebruikt moet worden:\n* \@AMF.Util.Default\@ laat AMF bepalen (aanbevolen).\n* CALVC (Context-Adaptive Variable-Length Coding) is sneller, maar groter.\n* CABAC (Context-Adaptive Binary Arithmetic Coding) is langzamer, maar kleiner."
89
+Utility.Default="Standaard"
90
+Utility.Automatic="Automatisch"
91
+Utility.Manual="Handmatig"
92
+Utility.Switch.Disabled="Uitgeschakeld"
93
+Utility.Switch.Enabled="Ingeschakeld"
94
+Preset="Voorkeursinstelling"
95
+Preset.ResetToDefaults="Standaardinstellingen herstellen"
96
+Preset.Recording="Opname"
97
+Preset.HighQuality="Hoge kwaliteit"
98
+Preset.Indistinguishable="Ononderscheidbaar"
99
+Preset.Lossless="Lossless"
100
+Preset.Twitch="Twitch"
101
+Preset.YouTube="YouTube"
102
+Usage="Gebruik"
103
+Usage.Description="Voor welk gebruik moet AMF ingesteld worden:\n- '\@Usage.Transcoding\@' is standaard transcoden (aanbevolen),\n- '\@Usage.UltraLowLatency\@' is voor erg lage latency encoding,\n- '\@Usage.LowLatency\@' is vergelijkbaar met bovenstaande met een iets hogere latency.\nVoor streamen is alleen '\@Usage.Transcoding\@' mogelijk, alle andere waarden kunnen worden gebruikt voor opnemen."
104
+Usage.Transcoding="Transcoding"
105
+Usage.UltraLowLatency="Ultra Low Latency"
106
+Usage.LowLatency="Low Latency"
107
+Usage.Webcam="Webcam"
108
+QualityPreset="Kwaliteitsinstelling"
109
+QualityPreset.Description="Welke kwaliteitsinstelling AMF moet proberen te halen:\n- '\@QualityPreset.Speed\@' is de snelste maar heeft de slechtste kwaliteit,\n- '\@QualityPreset.Balanced\@' is een gebalanceerde mix van beide,\n- '\@QualityPreset.Quality\@' geeft de beste kwaliteit voor een gekozen bitrate."
110
+QualityPreset.Speed="Snelheid"
111
+QualityPreset.Balanced="Gebalanceerd"
112
+QualityPreset.Quality="Kwaliteit"
113
+Profile="Profiel"
114
+Profile.Description="Met welk profiel geëncodet moet worden. Gesorteerd van best ondersteunt (boven) tot beste kwaliteit (onder)."
115
+ProfileLevel="Profielniveau"
116
+Tier="Niveau"
117
+AspectRatio="Beeldverhouding"
118
+CodingType="Codeertype"
119
+MaximumReferenceFrames="Maximale referentieframes"
120
+RateControlMethod="Rate control methode"
121
+RateControlMethod.CQP="Constant QP (CQP)"
122
+RateControlMethod.CBR="Constant Bitrate (CBR)"
123
+RateControlMethod.VBR="Variable Bitrate (Peak Constrained) (VBR)"
124
+RateControlMethod.VBRLAT="Variable Bitrate (Latency Constrained) (VBRLAT)"
125
+Bitrate.Target="Doelbitrate"
126
+VBVBuffer.InitialFullness="Initiële VBV Buffervulling"
127
+KeyframeInterval="Keyframe-Interval"
128
+GOP.Type.Fixed="Vast"
129
+GOP.Type.Variable="Variabel"
130
+GOP.Size="GOP-grootte"
131
+GOP.Alignment="GOP-uitlijning"
132
+BFrame.Pattern.Description="Het aantal B-frames om te gebruiken tijdens het encoden.\nOndersteund door 2e en 3e generatie VCE-kaarten. Negatieve invloed op encodingprestaties."
133
+BFrame.DeltaQP.Description="Delta QP waarde tot de laatste I- of P-frame voor niet-refereerbare B-frames."
134
+BFrame.Reference.Description="Laat een B-frame ook B-frames gebruiken als referentie, in plaats van enkel P- en I-frames."
135
+BFrame.ReferenceDeltaQP.Description="Delta QP waarde tot de laatste I- of P-frame voor refereerbare B-frames."
136
+DeblockingFilter="Deblocking Filter"
137
+MotionEstimation="Bewegingsschatting"
138
+MotionEstimation.Description="Bewigingsschatting laat de encoder de benodigde bitrate verlagen door te schatten waar een pixel heen ging."
139
+MotionEstimation.Quarter="Kwartpixel"
140
+MotionEstimation.Half="Halve pixel"
141
+MotionEstimation.Full="Kwart- & Halve Pixel"
142
+Video.API="Video API"
143
+Video.API.Description="Welke API moet de backend gebruiken?"
144
+Video.Adapter="Videoadapter"
145
+Video.Adapter.Description="Op welke adapter moeten we proberen te encoden?"
146
+OpenCL="OpenCL"
147
+View="Weergavemodus"
148
+View.Basic="Simpel"
149
+View.Advanced="Geavanceerd"
150
+View.Expert="Expert"
151
+View.Master="Meester"
152
+Debug="Debug"
153
AMF.H264.MaximumLTRFrames="Maximale LTR Frames"
154
AMF.H264.MaximumLTRFrames.Description="Long Term Reference (LTR) frames zijn een functie waarmee de encoder bepaalde frames in een reeks kan aanmerken als refereerbaar gedurende een lange tijd.\nLTR frames kunnen niet met B-frames gebruikt worden, en de encoder zal B-frames ook uitzetten als deze gebruikt worden."
155
AMF.H264.MaximumAccessUnitSize="Maximale Access Unit grootte"
156
157
AMF.H264.HeaderInsertionSpacing.Description="Hoeveel frames er tussen NAL headers moeten zitten."
158
AMF.H264.WaitForTask="Wacht op taak"
159
AMF.H264.WaitForTask.Description="Onbekend, experimenteel"
160
-AMF.H264.PreAnalysisPass="Pre-analyse pass"
161
-AMF.H264.PreAnalysisPass.Description="Onbekend, experimenteel"
162
-AMF.H264.VBAQ="VBAQ"
163
-AMF.H264.VBAQ.Description="Onbekend, experimenteel"
164
-AMF.H264.GOPSize="GOP-grootte"
165
-AMF.H264.GOPSize.Description="Onbekend, experimenteel"
166
-AMF.H264.GOPAlignment="GOP-uitlijning"
167
-AMF.H264.GOPAlignment.Description="Onbekend, experimenteel"
168
-AMF.H264.MaximumReferenceFrames="Maximale referentieframes"
169
-AMF.H264.MaximumReferenceFrames.Description="Onbekend, experimenteel"
170
AMF.H264.SlicesPerFrame="Segmenten per frame"
171
AMF.H264.SlicesPerFrame.Description="Hoeveel I-frame segmenten moeten er worden opgeslagen bij elke frame?\nEen waarde van nul laat de encoder bepalen.\nIntra-refresh encoding wordt gebruikt voor snellere weergave van en zoeken door video."
172
AMF.H264.SliceMode="Slice-modus"
173
174
AMF.H264.IntraRefresh.NumberOfStripes.Description="Onbekend, experimenteel"
175
AMF.H264.IntraRefresh.MacroblocksPerSlot="Intra-Refresh Macroblocks per Slot"
176
AMF.H264.IntraRefresh.MacroblocksPerSlot.Description="Hoeveel Macroblocks moeten er in elk slot worden opgeslagen?\nEen waarde van 0 schakelt deze functie uit.\nIntra-Refresh encoding wordt gebruikt voor snellere weergave van en zoeken door video."
177
-AMF.H264.VideoAPI="Video API"
178
-AMF.H264.VideoAPI.Description="Welke API gebruikt moet worden voor encoden."
179
-AMF.H264.VideoAdapter="Videoadapter"
180
-AMF.H264.VideoAdapter.Description="Welke apter gebruikt moet worden voor encoding."
181
-AMF.H264.OpenCL="OpenCL"
182
-AMF.H264.OpenCL.Description="Moet de encoder OpenCL gebruiken om de individuele frames te leveren?"
183
-AMF.H264.View="Weergavemodus"
184
-AMF.H264.View.Description="Welke eigenschappen moeten getoond worden?\nHet gebruiken van '\@AMF.H264.View.Master\@' diskwalificeert je voor het ontvangen van ondersteuning."
185
-AMF.H264.View.Basic="Simpel"
186
-AMF.H264.View.Advanced="Geavanceerd"
187
-AMF.H264.View.Expert="Expert"
188
-AMF.H264.View.Master="Meester"
189
-AMF.H264.Debug="Debug"
190
-AMF.H264.Debug.Description="Schakel extra debug-logging in, dit moet actief zijn als je ondersteuning nodig hebt met deze encoder."
191
192
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/pl-PL.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/pl-PL.ini
Changed
133
1
2
-AMF.Util.Default="Domyślne"
3
-AMF.Util.Automatic="Automatycznie"
4
-AMF.Util.Manual="Ustawienia własne"
5
-AMF.Util.Toggle.Disabled="Wyłączone"
6
-AMF.Util.Toggle.Enabled="Włączone"
7
-AMF.H264.Preset="Profil"
8
-AMF.H264.Preset.ResetToDefaults="Przywróć ustawienia domyślne"
9
-AMF.H264.Preset.Recording="Nagrywanie"
10
-AMF.H264.Preset.HighQuality="Wysoka jakość"
11
-AMF.H264.Preset.Indistinguishable="Nie do odróżnienia"
12
-AMF.H264.Preset.Lossless="Bezstratny"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Sposób użycia"
16
-AMF.H264.Usage.Transcoding="Konwersja"
17
-AMF.H264.Usage.UltraLowLatency="Bardzo niskie opóźnienie"
18
-AMF.H264.Usage.LowLatency="Niskie opóźnienie"
19
-AMF.H264.QualityPreset="Ustawienie jakości"
20
-AMF.H264.QualityPreset.Speed="Szybkość"
21
-AMF.H264.QualityPreset.Balanced="Zrównoważone"
22
-AMF.H264.QualityPreset.Quality="Jakość"
23
-AMF.H264.Profile="Profil"
24
-AMF.H264.ProfileLevel="Profil"
25
-AMF.H264.RateControlMethod="Metoda kontroli przepływności"
26
-AMF.H264.RateControlMethod.CQP="Stała QP (CQP)"
27
-AMF.H264.RateControlMethod.CBR="Stała przepływność (CBR)"
28
-AMF.H264.RateControlMethod.VBR.Peak="Zmienna przepływność (z ograniczeniem górnym) (VBR)"
29
-AMF.H264.RateControlMethod.VBR.Latency="Zmienna przepływność (z ograniczeniem opóźnieniem) (VBR_LAT)"
30
-AMF.H264.Bitrate.Target="Przepływność docelowa"
31
-AMF.H264.Bitrate.Target.Description="Średni bitrate do uzyskania w sekwencji."
32
-AMF.H264.Bitrate.Peak="Przepływność szczytowa"
33
-AMF.H264.Bitrate.Peak.Description="Maksymalny bitrate do uzyskania w sekwencji."
34
-AMF.H264.QP.Minimum="Minimalna QP"
35
-AMF.H264.QP.Minimum.Description="Najniższa wartość QP (parametr kwantyzacji) do użycia w ramce."
36
-AMF.H264.QP.Maximum="Maksymalna QP"
37
-AMF.H264.QP.Maximum.Description="Najwyższa wartość QP (parametr kwantyzacji) do użycia w ramce."
38
-AMF.H264.QP.IFrame="I-Frame QP"
39
-AMF.H264.QP.IFrame.Description="Stała wartość QP dla ramek I-Frame."
40
-AMF.H264.QP.PFrame="P-Frame QP"
41
-AMF.H264.QP.PFrame.Description="Stała wartość QP dla ramek P-Frame."
42
-AMF.H264.QP.BFrame="B-Frame QP"
43
-AMF.H264.QP.BFrame.Description="Stała wartość QP (parametr kwantyzacji) do użycia w ramce B-Frame."
44
-AMF.H264.VBVBuffer="Bufor VBV"
45
-AMF.H264.VBVBuffer.Strictness="Odchylenie bufora VBV"
46
-AMF.H264.VBVBuffer.Strictness.Description="Określa rygor wykorzystania bufora VBV, gdzie 100% oznacza pełne podporządkowanie wartości a 0% - dowolne."
47
-AMF.H264.VBVBuffer.Size="Rozmiar bufora VBV"
48
-AMF.H264.VBVBuffer.Size.Description="Rozmiar bufora VBV używanego w kontroli przepływności sekwencji kodowania."
49
-AMF.H264.VBVBuffer.Fullness="Zapełnienie bufora VBV"
50
-AMF.H264.VBVBuffer.Fullness.Description="Jak bardzo zapełniony na starcie powinien być bufor VBV. Wpływa jedynie na początkową sekwencję kodowania."
51
-AMF.H264.FillerData="Filler Data"
52
-AMF.H264.FrameSkipping="Pomijanie klatek"
53
-AMF.H264.EnforceHRDCompatibility="Wymuszanie zgodności HRD"
54
-AMF.H264.KeyframeInterval="Interwał klatki kluczowej"
55
-AMF.H264.KeyframeInterval.Description="Określa odległość (w sekundach) między klatkami kluczowymi oraz kontroluje rozmiar GOP."
56
-AMF.H264.IDRPeriod="Okres IDR"
57
-AMF.H264.IDRPeriod.Description="Określa (w klatkach) odległość między natychmiastowymi odświeżeniami dekodera. Kontroluje również rozmiar sekwencji GOP.
58
-"
59
-AMF.H264.DeblockingFilter="Filtr niwelujacy bloki obrazu"
60
-AMF.H264.ScanType="Metoda skanowania"
61
-AMF.H264.ScanType.Progressive="Progresywne"
62
-AMF.H264.ScanType.Interlaced="Z przeplotem"
63
-AMF.H264.MotionEstimation="Szacowania ruchu"
64
-AMF.H264.MotionEstimation.None="Żaden"
65
-AMF.H264.MotionEstimation.Half="Pół piksela"
66
-AMF.H264.MotionEstimation.Quarter="Kwartał piksela"
67
-AMF.H264.MotionEstimation.Both="Pół i kwartał piksela"
68
-AMF.H264.CodingType="Typ kodowania"
69
+Utility.Default="Domyślnie"
70
+Utility.Automatic="Automatycznie"
71
+Utility.Manual="Ustawienia własne"
72
+Utility.Switch.Disabled="Wyłączone"
73
+Utility.Switch.Enabled="Włączone"
74
+Preset="Profil"
75
+Preset.ResetToDefaults="Przywróć ustawienia domyślne"
76
+Preset.Recording="Nagrywanie"
77
+Preset.HighQuality="High Quality (wysoka jakość)"
78
+Preset.Indistinguishable="Nie do odróżnienia"
79
+Preset.Lossless="Lossless (bezstratny)"
80
+Preset.Twitch="Twitch"
81
+Preset.YouTube="YouTube"
82
+Usage="Sposób użycia"
83
+Usage.Transcoding="Konwersja"
84
+Usage.UltraLowLatency="Bardzo niskie opóźnienie"
85
+Usage.LowLatency="Niskie opóźnienie"
86
+Usage.Webcam="Kamerka internetowa"
87
+QualityPreset="Ustawienie jakości"
88
+QualityPreset.Speed="Szybkość"
89
+QualityPreset.Balanced="Zrównoważone"
90
+QualityPreset.Quality="Jakość"
91
+Profile="Profil"
92
+ProfileLevel="Profil - poziom"
93
+Tier="Poziom"
94
+AspectRatio="Współczynnik proporcji"
95
+CodingType="Typ kodowania"
96
+AMF.H264.MaximumLTRFrames="Maksimum ramek LTR"
97
+AMF.H264.MaximumLTRFrames.Description="Long Term Reference (LTR) Frames (ramki LTR) to opcja pozwalająca na oznaczenie przez enkoder ramek, które mają być referencyjnymi przez dłuższy czas.\nRamki LTR nie mogą być używane wraz z B-ramkami. Enkoder wyłączy B-ramki w przypadku użycia opcji ramek LTR."
98
AMF.H264.MaximumAccessUnitSize="Maksymalny rozmiar Access Unit"
99
AMF.H264.MaximumAccessUnitSize.Description="Maksymalny rozmiar Access Unit. Wartość 0 umożliwia enkoderowi wybranie najlepszej wartości."
100
AMF.H264.HeaderInsertionSpacing="Rozmiar nagłówka (w klatkach)"
101
AMF.H264.HeaderInsertionSpacing.Description="Ile klatek powinno być między nagłówkami. Nie zaleca się zmieniać wartości na inną niż 0 (automatycznie)."
102
-AMF.H264.VideoAPI="Typ API"
103
-AMF.H264.VideoAPI.Description="Rodzaj API wykorzystywanego do enkodowania."
104
-AMF.H264.VideoAdapter="Karta graficzna"
105
-AMF.H264.VideoAdapter.Description="Karta graficzna wykorzystywana do enkodowania."
106
-AMF.H264.OpenCL="OpenCL"
107
-AMF.H264.OpenCL.Description="Czy enkoder ma użyć OpenCL do wysyłania poszczególnych klatek?"
108
-AMF.H264.View="Tryb ustawień"
109
-AMF.H264.View.Description="Którego typu ustawień używać.\nWłączenie '\@AMF.H264.View.Master\@' oznacza rezygnację ze wsparcia technicznego."
110
-AMF.H264.View.Basic="Podstawowy"
111
-AMF.H264.View.Advanced="Zaawansowany"
112
-AMF.H264.View.Expert="Ekspercki"
113
-AMF.H264.View.Master="Pełny"
114
-AMF.H264.Debug="Debugowanie"
115
-AMF.H264.Debug.Description="Włącza dodatkowe opcje logowania w trybie debug. Przydatne w przypadku poszukiwania wsparcia technicznego dla tego enkodera."
116
+AMF.H264.WaitForTask="Wait For Task"
117
+AMF.H264.WaitForTask.Description="Nieznany, eksperymentalne"
118
+AMF.H264.SlicesPerFrame="Liczba bloków w jednej klatce"
119
+AMF.H264.SlicesPerFrame.Description="Ile bloków I-ramek powinno być zapisanych w jednej ramce?\nWartość 0 oznacza, że enkoder decyduje automatycznie.\nEnkodowanie Intra-Refresh używane jest w celu szybszego odtwarzania i przewijania."
120
+AMF.H264.SliceMode="Slice Mode"
121
+AMF.H264.SliceMode.Description="Nieznany, eksperymentalne"
122
+AMF.H264.MaximumSliceSize="Maksymalny rozmiar bloku"
123
+AMF.H264.MaximumSliceSize.Description="Nieznany, eksperymentalne"
124
+AMF.H264.SliceControlMode="Tryb kontroli bloku"
125
+AMF.H264.SliceControlMode.Description="Nieznany, eksperymentalne"
126
+AMF.H264.SliceControlSize="Rozmiar kontroli bloku"
127
+AMF.H264.SliceControlSize.Description="Nieznany, eksperymentalne"
128
+AMF.H264.IntraRefresh.NumberOfStripes="Liczba pasków Intra-Refresh"
129
+AMF.H264.IntraRefresh.NumberOfStripes.Description="Nieznany, eksperymentalne"
130
+AMF.H264.IntraRefresh.MacroblocksPerSlot="Liczba makrobloków Intra-Refresh na slot"
131
+AMF.H264.IntraRefresh.MacroblocksPerSlot.Description="Ile makrobloków należy zapisać w jednym slocie?\n0 wyłącza opcję\nEnkodowanie Intra-Refresh pozwala na szybsze odtwarzanie i przewijanie."
132
133
obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/pt-BR.ini
Added
5
1
2
+AMF.H264.SliceControlMode.Description="Desconhecido, Experimental"
3
+AMF.H264.SliceControlSize.Description="Desconhecido, Experimental"
4
+
5
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/ru-RU.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/ru-RU.ini
Changed
201
1
2
-AMF.Util.Default="По умолчанию"
3
-AMF.Util.Automatic="Автоматически"
4
-AMF.Util.Manual="Руководство"
5
-AMF.Util.Toggle.Disabled="Выключено"
6
-AMF.Util.Toggle.Enabled="Включено"
7
-AMF.H264.Preset="Предустановка"
8
-AMF.H264.Preset.ResetToDefaults="Сброс по умолчанию"
9
-AMF.H264.Preset.Recording="Запись"
10
-AMF.H264.Preset.HighQuality="Высокое качество"
11
-AMF.H264.Preset.Indistinguishable="Незаметные потери"
12
-AMF.H264.Preset.Lossless="Без потерь"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Назначение"
16
-AMF.H264.Usage.Description="На какой режим использования должен быть настроен AMF:\n- 'Перекодировка' — для перекодировки общего назначения (рекомендуется),\n- 'Очень низкая задержка' — для кодировки с очень низкой задержкой,\n- 'Низкая задержка' похожа на пункт выше, но с немного большей задержкой.\nТрансляции поддерживают только 'перекодировку', все остальные значения могут быть использованы для записи."
17
-AMF.H264.Usage.Transcoding="Транскодирование"
18
-AMF.H264.Usage.UltraLowLatency="Очень низкая задержка"
19
-AMF.H264.Usage.LowLatency="Низкая задержка"
20
-AMF.H264.QualityPreset="Предустановки качества"
21
-AMF.H264.QualityPreset.Description="К какому пресету качества AMF нужно стремиться:\n-'Speed' самый быстрый, но имеет самое низкое качество,\n-'Balanced' между 'Speed' и 'Quality', предоставляет хорошее соотношение между скоростью и качеством,\n-'Quality' предоставляет наилучшее качество для предоставленного битрейта."
22
-AMF.H264.QualityPreset.Speed="Скорость"
23
-AMF.H264.QualityPreset.Balanced="Баланс"
24
-AMF.H264.QualityPreset.Quality="Качество"
25
-AMF.H264.Profile="Профиль кодирования"
26
-AMF.H264.Profile.Description="Какой профиль формата H.264, использовать для кодирования, отсортированный от высочайшего качества для самой широкой поддержки."
27
-AMF.H264.ProfileLevel="Уровень профиля"
28
-AMF.H264.ProfileLevel.Description="Какой уровень профиля H.264 использовать для кодирования:\n- 'Автоматически' выбирает наиболее подходящий уровень под выбранную частоту и размер кадра,\n- '4.1' поддерживает 1920x1080 30FPS, 1280x720 60FPS, 960x540 90FPS\n- '4.2' поддерживает 1920x1080 60FPS, 1280x720 120FPS, 960x540 172FPS\n- '5.0' поддерживает 1920x1080 60FPS, 1280x720 144FPS, 960x540 172FPS\n- '5.1' поддерживает 3840x2160 30FPS, 1920x1080 120FPS, 1280x720 172FPS, 960x540 172FPS\n- '5.2' поддерживает 3840x2160 60FPS, 1920x1080 172FPS, 1280x720 172FPS, 960x540 172FPS"
29
-AMF.H264.RateControlMethod="Метод кодирования"
30
-AMF.H264.RateControlMethod.Description="Как оценить способ контроля должны быть использованы:\n- '\@AMF.H264.RateControlMethod.CQP\@' назначает фиксированные I-/P-/B-Значения кадра QP,\n- '\@AMF.H264.RateControlMethod.CBR\@' остается в данном целевом Битрейте (используя данные заполнителя) (рекомендуется для стрима),\n-'\@AMF.H264.RateControlMethod.VBR\@' остается ниже пика Битрейта,\n-'\@AMF.H264.RateControlMethod.VBR_LAT\@' остается близко к целевому Битрейту, если задержка GPU и нагрузки позволяют, в противном случае будут использовать более высокий Битрейт (рекомендуется для стрима)."
31
-AMF.H264.RateControlMethod.CQP="CQP: постоянное качество"
32
-AMF.H264.RateControlMethod.CBR="CBR: постоянный битрейт"
33
-AMF.H264.RateControlMethod.VBR.Peak="VBR: переменный битрейт (Ограничение пиков)"
34
-AMF.H264.RateControlMethod.VBR.Latency="VBR: переменный битрейт (Ограничение задержки)"
35
-AMF.H264.Bitrate.Target="Битрейт"
36
-AMF.H264.Bitrate.Target.Description="Битрейт желаемый для получения во всей последовательности."
37
-AMF.H264.Bitrate.Peak="Пиковый битрейт"
38
-AMF.H264.Bitrate.Peak.Description="Максимальный пиковый битрейт желаемый для получения во всей последовательности."
39
-AMF.H264.QP.Minimum="Минимальное QP"
40
-AMF.H264.QP.Minimum.Description="Наименьшее значение QP (Параметр квантования) для использования в кадре."
41
-AMF.H264.QP.Maximum="Максимальное QP"
42
-AMF.H264.QP.Maximum.Description="Наибольшее значение QP (Параметр квантования) для использования в кадре."
43
-AMF.H264.QP.IFrame="I-кадр QP"
44
-AMF.H264.QP.IFrame.Description="Фиксированное значение QP используемое для I-Кадров."
45
-AMF.H264.QP.PFrame="P-кадр QP"
46
-AMF.H264.QP.PFrame.Description="Фиксированное значение QP используемое для P-Кадров."
47
-AMF.H264.QP.BFrame="B-кадр QP"
48
-AMF.H264.QP.BFrame.Description="Фиксированное значение QP (Параметр квантования) для использования в B-Кадрах."
49
-AMF.H264.VBVBuffer="Буфер VBV"
50
-AMF.H264.VBVBuffer.Description="Какой метод следует использовать для определения Размера буфера VBV:\n- '\@AMF.Util.Automatic\@' рассчитывает размер ограничивающийся строгостью,\n- '\@AMF.Util.Manual\@' позволяет пользователю контролировать размер буфера.\nVBV (Верификатор буферизации видео) буфер используется некоторыми Методами управления скоростью, чтобы сохранить общий битрейт в пределах заданных ограничений."
51
-AMF.H264.VBVBuffer.Strictness="Строгость буфера VBV"
52
-AMF.H264.VBVBuffer.Strictness.Description="Определяет жесткость буфера vbv, при 100% будет максимально жестким и 0% будет неограниченным."
53
-AMF.H264.VBVBuffer.Size="Размер буфера VBV"
54
-AMF.H264.VBVBuffer.Size.Description="Размер буфера vbv, которая используется для управления скорости передачи данных в последовательности."
55
-AMF.H264.VBVBuffer.Fullness="Заполнение буфера VBV"
56
-AMF.H264.VBVBuffer.Fullness.Description="Изначальная степень заполнения VBV буфера, будет влиять только на первоначальную последовательность кодирования."
57
-AMF.H264.FillerData="Данные наполнителя"
58
-AMF.H264.FillerData.Description="Включение данных наполнителей позволяет кодировщику сохранять, по крайней мере, целевой Битрейт, заполняя оставшееся пространство в последовательности с пустой информации."
59
-AMF.H264.FrameSkipping="Пропуск кадров"
60
-AMF.H264.FrameSkipping.Description="Пропуск кадров позволяет кодировщику падение кадров в целях соответствия требованиям целевого битрейта.\nКогда в энкодере пропадает рамка вместо этого вставьте повторять-последний кадр NAL в стрим.\nМожет помочь с очень низким битрейтом."
61
-AMF.H264.EnforceHRDCompatibility="Принудительная HRD совместимость"
62
-AMF.H264.EnforceHRDCompatibility.Description="Соблюдение гипотетическому эталону Декодера ограничения, которые ограничивают максимальное значение QP изменения в кадре."
63
-AMF.H264.KeyframeInterval="Интервал ключевых кадров"
64
-AMF.H264.KeyframeInterval.Description="Сколько секунд должен быть просадок кадров.\nТакже контролирует GOP Size."
65
-AMF.H264.IDRPeriod="Период IDR"
66
-AMF.H264.IDRPeriod.Description="Определяет расстояние между Мгновенными обновлениями декодирования (IDR) в кадрах. Так же контролирует размер последовательности GOP."
67
-AMF.H264.BFrame.Pattern="B-Кадры"
68
-AMF.H264.BFrame.Pattern.Description="Количество B-кадров использованное при кодировании.\nПоддерживается 2-й и 3-й VCE карт поколения. Негативно влияет на производительность кодирования."
69
-AMF.H264.BFrame.DeltaQP="QP дельта для B-Кадров"
70
-AMF.H264.BFrame.DeltaQP.Description="Значение дельты QP в последних I- или P-Кадров для нессылаемых B-Кадров."
71
-AMF.H264.BFrame.Reference="Ссылаемые B-Кадры"
72
-AMF.H264.BFrame.Reference.Description="Разрешить B-Кадру так же использовать B-Кадры как ссылки, вместо просто P- и I-Кадров."
73
-AMF.H264.BFrame.ReferenceDeltaQP="Дельта QP для ссылаемых B-кадров"
74
-AMF.H264.BFrame.ReferenceDeltaQP.Description="Значение дельты QP в последних I- или P-Кадров для ссылаемых B-Кадров."
75
-AMF.H264.DeblockingFilter="Фильтр деблокинга"
76
-AMF.H264.DeblockingFilter.Description="Устанавливает флаг, что декодер может использовать фильтр удаления блочности для прямой трансляции."
77
-AMF.H264.ScanType="Развертка"
78
-AMF.H264.ScanType.Description="Какой режим сканирования использовать; всегда оставляется этот параметр на 'прогрессивном'."
79
-AMF.H264.ScanType.Progressive="Прогрессивная"
80
-AMF.H264.ScanType.Interlaced="Чересстрочная"
81
-AMF.H264.MotionEstimation="Оценка движения"
82
-AMF.H264.MotionEstimation.Description="Оценки движения позволяет кодировщику необходимость уменьшить Битрейт, оценивая, где пиксель прошел."
83
-AMF.H264.MotionEstimation.None="Нет"
84
-AMF.H264.MotionEstimation.Half="Пол-пиксельная"
85
-AMF.H264.MotionEstimation.Quarter="Четверть-пиксельная"
86
-AMF.H264.MotionEstimation.Both="Пол- & Четверть-пиксельная"
87
-AMF.H264.CodingType="Тип кодирования"
88
-AMF.H264.CodingType.Description="Какой тип кодирования использовать:\n* \@AMF.Util.Default\@ позволяет решать AMF (рекомендуется).\n* CALVC (контекстно-Адаптивное с переменной длинной кодирования) - это быстрее, но больше.\n* CABAC (контекстно-Адаптивное Двоичное арифметическое кодирование) - это медленнее, но меньше."
89
+Utility.Default="По умолчанию"
90
+Utility.Automatic="Автоматически"
91
+Utility.Manual="Вручную"
92
+Utility.Switch.Disabled="Выключено"
93
+Utility.Switch.Enabled="Включено"
94
+Preset="Предустановка"
95
+Preset.ResetToDefaults="Сбросить на значения по умолчанию"
96
+Preset.Recording="Запись"
97
+Preset.HighQuality="Высокое качество"
98
+Preset.Indistinguishable="Незаметные потери"
99
+Preset.Lossless="Без потерь"
100
+Preset.Twitch="Twitch"
101
+Preset.YouTube="YouTube"
102
+Usage="Использование"
103
+Usage.Description="На какой режим использования должен быть настроен AMF:\n- '\@Usage.Transcoding\@' — для перекодировки общего назначения (рекомендуется),\n- '\@Usage.UltraLowLatency\@' — для кодировки с очень низкой задержкой,\n- '\@Usage.LowLatency\@' похожа на пункт выше, но с немного большей задержкой.\nТрансляции поддерживают только '\@Usage.Transcoding\@', все остальные значения могут быть использованы для записи."
104
+Usage.Transcoding="Транскодирование"
105
+Usage.UltraLowLatency="Очень низкая задержка"
106
+Usage.LowLatency="Низкая задержка"
107
+Usage.Webcam="Вебкамера"
108
+QualityPreset="Предустановки качества"
109
+QualityPreset.Description="К какой предустановке качества AMF нужно стремиться:\n- '\@QualityPreset.Speed\@' самая быстрая, но низкого качества,\n- '\@QualityPreset.Balanced\@ сбалансированное сочетание обоих,\n- '\@QualityPreset.Quality\@ предоставляет наилучшее качество для заданного битрейта."
110
+QualityPreset.Speed="Скорость"
111
+QualityPreset.Balanced="Баланс"
112
+QualityPreset.Quality="Качество"
113
+Profile="Профиль"
114
+Profile.Description="Какой профиль использовать для кодирования. Сортировка от лучшей поддержки (сверху) до лучшего качества (снизу)."
115
+ProfileLevel="Уровень профиля"
116
+ProfileLevel.Description="Уровень используемого профиля. Лучше оставить \@Utility.Automatic\@."
117
+Tier="Уровень"
118
+Tier.Description="На каком Уровне кодировать. \"Высокий\" нацелен на высокий битрейт/использование пропускной способности, в то время как \"Основной\" нацелен на средства массовой информации."
119
+AspectRatio="Соотношение сторон"
120
+AspectRatio.Description="С каким соотношением сторон должен быть записан выходной файл."
121
+CodingType="Тип кодирования"
122
+CodingType.Description="Какой тип кодирования использовать:\n* '\@Utility.Automatic\@' позволяет решать AMF (рекомендуется).\n* 'CALVC' (контекстно-Адаптивное с переменной длинной кодирования) - это быстрее, но больше.\n* 'CABAC' (контекстно-Адаптивное Двоичное арифметическое кодирование) - это медленнее, но меньше."
123
+MaximumReferenceFrames="Максимум кадров-ссылок"
124
+MaximumReferenceFrames.Description="Количество кадров, используемых кодировщиком в качестве опорных. Имеет непосредственное влияние на качество кодирования."
125
+RateControlMethod="Метод кодирования"
126
+RateControlMethod.Description="Какой способ контроля битрейта должен быть использован:\n- '\@RateControlMethod.CQP\@' задает фиксированные значения QP I-/P-/B-кадра,\n- '\@RateControlMethod.CBR\@' придерживается целевого битрейта (используя данные заполнителя) (рекомендуется для стрима),\n-'\@RateControlMethod.VBR\@' держится ниже пикового битрейта,\n-'\@RateControlMethod.VBRLAT\@' держится близко к целевому битрейту, если задержка GPU и нагрузка позволяют, в противном случае будет использован более высокий битрейт (рекомендуется для стрима)."
127
+RateControlMethod.CQP="Постоянное качество (CQP)"
128
+RateControlMethod.CBR="Постоянный битрейт (CBR)"
129
+RateControlMethod.VBR="Переменный битрейт (Ограничение пиков) (VBR)"
130
+RateControlMethod.VBRLAT="Переменный битрейт (Ограничение задержки) (VBR)"
131
+PrePassMode="Режим пред-прохода"
132
+PrePassMode.Description="Пред-проход - это вторичный проход распространения битрейта, который позволяет лучше распространить битрейт по последовательности, однако эффект от этого может варьироваться от карты к карте."
133
+PrePassMode.Quarter="\@Utility.Switch.Enabled\@ (Четверть размера)"
134
+PrePassMode.Half="\@Utility.Switch.Enabled\@ (Половина размера)"
135
+PrePassMode.Full="\@Utility.Switch.Enabled\@ (Полный размер)"
136
+Bitrate.Target="Битрейт"
137
+Bitrate.Target.Description="Битрейт, желаемый для получения во всей последовательности."
138
+Bitrate.Peak="Пиковый битрейт"
139
+Bitrate.Peak.Description="Максимальный пиковый битрейт, желаемый для получения во всей последовательности."
140
+QP.IFrame="I-кадр QP"
141
+QP.IFrame.Description="Фиксированное значение QP используемое для I-Кадров."
142
+QP.PFrame="P-кадр QP"
143
+QP.PFrame.Description="Фиксированное значение QP используемое для P-Кадров."
144
+QP.BFrame="B-кадр QP"
145
+QP.BFrame.Description="Фиксированное значение QP используемое для B-Кадров."
146
+QP.Minimum="Минимальное QP"
147
+QP.Minimum.Description="Наименьшее значение QP для использования в Кадре."
148
+QP.IFrame.Minimum="Минимальный QP I-Кадра"
149
+QP.IFrame.Minimum.Description="Наименьшее значение QP используемое для I-Кадров."
150
+QP.PFrame.Minimum="Минимальный QP P-Кадра"
151
+QP.PFrame.Minimum.Description="Наименьшее значение QP, используемое для P-Кадров."
152
+QP.Maximum="Максимальное QP"
153
+QP.Maximum.Description="Наибольшее значение QP для использования в Кадре."
154
+QP.IFrame.Maximum="Максимальный QP I-Кадра"
155
+QP.IFrame.Maximum.Description="Наибольшее значение QP для использования в I-Кадре."
156
+QP.PFrame.Maximum="Максимальный QP P-Кадра"
157
+QP.PFrame.Maximum.Description="Наибольшее значение QP для использования в P-Кадре."
158
+FillerData="Данные наполнителя"
159
+FillerData.Description="Включение данных наполнителей позволяет кодировщику сохранять, по крайней мере, целевой Битрейт, заполняя оставшееся пространство в последовательности с пустой информации."
160
+FrameSkipping="Пропуск кадров"
161
+FrameSkipping.Description="Пропуск кадров позволяет кодировщику падение кадров в целях соответствия требованиям целевого битрейта.\nКогда в энкодере пропадает рамка вместо этого вставьте повторять-последний кадр NAL в стрим.\nМожет помочь с очень низким битрейтом."
162
+VBAQ="VBAQ"
163
+VBAQ.Description="Включить функцию \"Дисперсия на основе адаптивного квантования\" (VBAQ) которая основана на дисперсии пикселей для лучшего распространения битрейта.\nФункция работает на идее что зрительная система человека менее чувствительна к артефактам в высоко текстурированных областях и таким образом будет смещать битрейт к гладкой поверхности.\nВключение может привести к улучшению субъективного качества с определенным содержанием."
164
+EnforceHRD="Принудительно использовать HRD"
165
+EnforceHRD.Description="Принудительно использовать HRD (Hypothetical Reference Decoder), используемого для проверки выходного потока данных."
166
+VBVBuffer="Буфер VBV"
167
+VBVBuffer.Description="Какой метод следует использовать для определения Размера буфера VBV:\n- '\@Utlity.Automatic\@' рассчитывает размер ограничивающийся строгостью,\n- '\@Utlity.Manual\@' позволяет пользователю контролировать размер буфера.\nVBV (Верификатор буферизации видео) буфер используется некоторыми Методами управления скоростью, чтобы сохранить общий битрейт в пределах заданных ограничений."
168
+VBVBuffer.Strictness="Строгость буфера VBV"
169
+VBVBuffer.Strictness.Description="Определяет жесткость буфера VBV, при 100% будет максимально жестким и 0% будет неограниченным."
170
+VBVBuffer.Size="Размер буфера VBV"
171
+VBVBuffer.Size.Description="Размер буфера VBV, которая используется для управления скорости передачи данных в последовательности."
172
+VBVBuffer.InitialFullness="Изначальное заполнение буфера VBV"
173
+VBVBuffer.InitialFullness.Description="Изначальная степень заполнения VBV буфера (в %), будет влиять только на первоначальную последовательность кодирования."
174
+KeyframeInterval="Интервал ключевых кадров"
175
+KeyframeInterval.Description="Интервал (в секундах) между ключевыми кадрами."
176
+H264.IDRPeriod="IDR период (в кадрах)"
177
+H264.IDRPeriod.Description="Определяет расстояние между Мгновенными обновлениями декодирования (IDR) в кадрах. Так же контролирует размер последовательности GOP."
178
+H265.IDRPeriod="IDR период (в группах изображений)"
179
+H265.IDRPeriod.Description="Определяет расстояние между \"Мгновенными обновлениями декодирования\" (IDR) в GOP."
180
+GOP.Type="Тип GOP"
181
+GOP.Type.Description="Какой тип GOP должен быть использован:\n- '\@GOP.Type.Fixed\@' всегда будет использовать фиксированные расстояния между каждой GOP.\n- '\@GOP.Type.Variable\@' использует GOP различных размеров, в зависимости от того, какой нужен.\n'\@GOP.Type.Fixed\@' работает так же как устроен H264 и это лучшее решение для трансляции по локальной сети, в то время как '\@GOP.Type.Variable\@' лучше всего подходит для высококачественных записей низкого размера."
182
+GOP.Type.Fixed="Постоянный"
183
+GOP.Type.Variable="Переменный"
184
+GOP.Size="Размер GOP"
185
+GOP.Size.Description="Размер GOP (группы изображений) в кадрах."
186
+GOP.Size.Minimum="Минимальный размер GOP"
187
+GOP.Size.Minimum.Description="Минимальный размер GOP (группы изображений) в кадрах."
188
+GOP.Size.Maximum="Максимальный размер GOP"
189
+GOP.Size.Maximum.Description="Максимальный размер GOP (группы изображений) в кадрах."
190
+GOP.Alignment="Выравнивание GOP"
191
+GOP.Alignment.Description="Экспериментально, последствия неизвестны. Используйте на свой страх и риск."
192
+BFrame.Pattern="Структура B-Кадров"
193
+BFrame.Pattern.Description="Количество B-кадров, используемых при кодировании.\nПоддерживается 2-м и 3-м поколением VCE карт. Негативно влияет на производительность кодирования."
194
+BFrame.DeltaQP="Отклонение QP B-Кадров"
195
+BFrame.DeltaQP.Description="Отклонение QP для не опорных B-Кадров, по отношению к последнему I- или P-Кадру."
196
+BFrame.Reference="Опорный B-Кадр"
197
+BFrame.Reference.Description="Разрешить B-Кадру так же использовать B-Кадры как ссылки, вместо просто P- и I-Кадров."
198
+BFrame.ReferenceDeltaQP="Отклонение QP опорных B-кадров"
199
+BFrame.ReferenceDeltaQP.Description="Значение дельты QP в последних I- или P-Кадрах для ссылаемых B-Кадров."
200
+DeblockingFilter="Фильтр деблокинга"
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/sr-CS.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/sr-CS.ini
Changed
49
1
2
-AMF.Util.Default="Podrazumevano"
3
-AMF.Util.Automatic="Automatski"
4
-AMF.Util.Manual="Ručno"
5
-AMF.Util.Toggle.Disabled="Onemogućeno"
6
-AMF.Util.Toggle.Enabled="Omogućeno"
7
-AMF.H264.Preset="Šablon"
8
-AMF.H264.Preset.ResetToDefaults="Vrati na podrazumevane vrednosti"
9
-AMF.H264.Preset.Recording="Snimanje"
10
-AMF.H264.Preset.HighQuality="Visoki kvalitet"
11
-AMF.H264.Preset.Indistinguishable="Istovetno"
12
-AMF.H264.Preset.Lossless="Bez gubitaka"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Upotreba"
16
-AMF.H264.Usage.Description="Za koju upotrebu bi AMF trebao biti podešen:\n- '\@AMF.H264.Usage.Transcoding\@' je transkoding opšte namene (preporučeno),\n- '\@AMF.H264.Usage.UltraLowLatency\@' je za enkoding veoma niskog kašnjenja,\n- '\@AMF.H264.Usage.LowLatency\@' je slično prethodnom sa malo višim kašnjenjem.\nEmitovanje podržava samo '\@AMF.H264.Usage.Transcoding\@', sve ostale vrednosti se mogu koristiti za snimanje."
17
-AMF.H264.Usage.Transcoding="Transkodiranje"
18
-AMF.H264.Usage.UltraLowLatency="Ultra nisko kašnjenje"
19
-AMF.H264.Usage.LowLatency="Nisko kašnjenje"
20
-AMF.H264.QualityPreset="Šablon kvaliteta"
21
-AMF.H264.QualityPreset.Description="Koji šablon za kvalitet bi AMF trebao da cilja:\n- '\@AMF.H264.QualityPreset.Speed\@' je najbrži sa najlošijim kvalitetom,\n- '\@AMF.H264.QualityPreset.Balanced\@' je balansiran spoj oba,\n- '\@AMF.H264.QualityPreset.Quality\@' daje najbolji kvalitet za zadati bitrejt."
22
-AMF.H264.QualityPreset.Speed="Brzina"
23
-AMF.H264.QualityPreset.Balanced="Izbalansirano"
24
-AMF.H264.QualityPreset.Quality="Kvalitet"
25
-AMF.H264.Profile="Profil"
26
-AMF.H264.Profile.Description="Koji H.264 profil koristiti za enkodiranje:\n- 'Baseline' ima najveću podršku platformi,\n- 'Main' je podržan na starijim uređajima (preporučeno ako se ide ka mobilnim uređajima),\n- 'High' je podržan na aktuelnim uređajima (preporučeno)."
27
-AMF.H264.ProfileLevel="Nivo profila"
28
-AMF.H264.RateControlMethod="Metoda kontrole protoka"
29
-AMF.H264.RateControlMethod.CQP="Konstantan kvalitet (CQP)"
30
-AMF.H264.RateControlMethod.CBR="Konstantan protok (CBR)"
31
-AMF.H264.RateControlMethod.VBR.Peak="Promenjivi protok (sa gornjom granicom) (VBR)"
32
-AMF.H264.RateControlMethod.VBR.Latency="Promenjivi protok (sa granicom kašnjenja) (VBR_LAT)"
33
-AMF.H264.Bitrate.Target="Ciljani protok"
34
-AMF.H264.Bitrate.Peak="Granica protoka"
35
-AMF.H264.QP.Minimum="Minimalni QP"
36
-AMF.H264.QP.Maximum="Maksimalni QP"
37
-AMF.H264.QP.IFrame="I-Frejm QP"
38
-AMF.H264.QP.PFrame="P-Frejm QP"
39
-AMF.H264.QP.BFrame="B-Frejm QP"
40
-AMF.H264.FillerData="Podaci za popunjavanje"
41
-AMF.H264.FrameSkipping="Preskakanje frejmova"
42
-AMF.H264.EnforceHRDCompatibility="Prisilna HRD kompatibilnost"
43
-AMF.H264.DeblockingFilter="Odblokirajući filter"
44
-AMF.H264.ScanType="Vrsta skeniranja"
45
-AMF.H264.ScanType.Progressive="Progresivno"
46
-AMF.H264.ScanType.Interlaced="Isprekidano"
47
AMF.H264.MaximumLTRFrames="Maksimalan broj LTR frejmova"
48
49
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/sv-SE.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/sv-SE.ini
Changed
201
1
2
-AMF.Util.Default="Standard"
3
-AMF.Util.Automatic="Automatisk"
4
-AMF.Util.Manual="Manuell"
5
-AMF.Util.Toggle.Disabled="Inaktiverad"
6
-AMF.Util.Toggle.Enabled="Aktiverad"
7
-AMF.H264.Preset="Förinställning"
8
-AMF.H264.Preset.ResetToDefaults="Återställ till standardvärden"
9
-AMF.H264.Preset.Recording="Spelar in"
10
-AMF.H264.Preset.HighQuality="Hög kvalitet"
11
-AMF.H264.Preset.Indistinguishable="Oskiljbar"
12
-AMF.H264.Preset.Lossless="Förlustfri"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Användning"
16
-AMF.H264.Usage.Description="Vilken användning AMF borde vara inställd på:\n- '\@AMF.H264.Usage.Transcoding\@' är för allmän omkodning (rekommenderas),\n- '\@AMF.H264.Usage.UltraLowLatency\@' är för omkodning med riktigt låg latens,\n- '\@AMF.H264.Usage.LowLatency\@' liknar ovanstående men med lite högre latens.\nStrömning stöder endast '\@AMF.H264.Usage.Transcoding\@', alla andra värden kan användas för inspelning."
17
-AMF.H264.Usage.Transcoding="Omkodning"
18
-AMF.H264.Usage.UltraLowLatency="Ultralåg latens"
19
-AMF.H264.Usage.LowLatency="Låg latens"
20
-AMF.H264.QualityPreset="Kvalitetsförinställning"
21
-AMF.H264.QualityPreset.Description="Vilken kvalitetsmall AMF bör försöka att uppnå:\n- '\@AMF.H264.QualityPreset.Speed\@' är den snabbaste men har den sämsta kvaliteten,\n- '\@AMF.H264.QualityPreset.Balanced\@' är en balanserad mix av båda,\n- '\@AMF.H264.QualityPreset.Quality\@' ger den bästa kvaliteten för en angiven bithastighet."
22
-AMF.H264.QualityPreset.Speed="Hastighet"
23
-AMF.H264.QualityPreset.Balanced="Balanserad"
24
-AMF.H264.QualityPreset.Quality="Kvalitet"
25
-AMF.H264.Profile="Profil"
26
-AMF.H264.Profile.Description="Vilken H.264-profil att använda för kodning:\n- 'Baseline' stödjer flest plattformar,\n- 'Main' stöds av äldre enheter (rekommenderas för mobila enheter),\n- 'High' stöds av aktuella enheter (rekommenderas)."
27
-AMF.H264.ProfileLevel="Profilnivå"
28
-AMF.H264.ProfileLevel.Description="Vilken H.264-profilnivå att använda för kodning:\n- '\@AMF.Util.Automatic\@' beräknar den bästa profilnivån för den angivna bildfrekvensen och bildstorleken,\n- '4.1' stöder 1920x1080 30FPS, 1280x720 60FPS, 960x540 90FPS\n- '4.2' stöder 1920x1080 60FPS, 1280x720 120FPS, 960x540 172FPS\n- '5.0' stöder 1920x1080 60FPS, 1280x720 144FPS, 960x540 172FPS\n- '5.1' stöder 3840x2160 30FPS, 1920x1080 120FPS, 1280x720 172FPS, 960x540 172FPS\n- '5.2' stöder 3840x2160 60FPS, 1920x1080 172FPS, 1280x720 172FPS, 960x540 172FPS"
29
-AMF.H264.RateControlMethod.CQP="Konstant QP (CQP)"
30
-AMF.H264.RateControlMethod.CBR="Konstant bithastighet (CBR)"
31
-AMF.H264.Bitrate.Target="Målets bithastighet"
32
-AMF.H264.Bitrate.Target.Description="Bithastighet att försöka uppnå i den övergripande sekvensen."
33
-AMF.H264.Bitrate.Peak="Maximal bithastighet"
34
-AMF.H264.QP.Minimum="Minimal QP"
35
-AMF.H264.QP.Minimum.Description="Lägsta QP-värde att använda i en bildruta."
36
-AMF.H264.QP.Maximum="Maximal QP"
37
-AMF.H264.QP.Maximum.Description="Högsta QP-värde att använda i en bildruta."
38
-AMF.H264.QP.IFrame="QP för I-bildrutor"
39
-AMF.H264.QP.IFrame.Description="Konstant QP-värde att använda för I-bildrutor."
40
-AMF.H264.QP.PFrame="QP för P-bildrutor"
41
-AMF.H264.QP.PFrame.Description="Konstant QP-värde att använda för P-bildrutor."
42
-AMF.H264.QP.BFrame="QP för B-bildrutor"
43
-AMF.H264.QP.BFrame.Description="Konstant QP-värde att använda för B-bildrutor."
44
-AMF.H264.VBVBuffer="VBV-buffert"
45
-AMF.H264.VBVBuffer.Description="Vilken metod som ska användas för att bestämma VBV-buffertens storlek:\n- '\@AMF.Util.Automatic\@' beräknar storleken med hjälp av en strikt begränsning,\n- '\@AMF.Util.Manual\@' låter användaren kontrollera storleken.\nVBV-buffertern (Video Buffering Verifier) används av vissa Rate Control Methods för att hålla den övergripande bithastigheten inom de angivna begränsningarna."
46
-AMF.H264.VBVBuffer.Strictness="Strikthet för VBV-buffert"
47
-AMF.H264.VBVBuffer.Strictness.Description="Bestämmer noggrannheten för VBV-bufferten, där 100% är så noggrann som möjligt och 0% är gränslös."
48
-AMF.H264.VBVBuffer.Size="VBV-buffertstorlek"
49
-AMF.H264.FillerData="Fyllningsdata"
50
-AMF.H264.FillerData.Description="Fyllningsdata låter kodaren behålla önskad bithastighet genom att fylla upp det återstående utrymmet i en sekvens med tom information."
51
-AMF.H264.FrameSkipping="Hoppa över bildrutor"
52
-AMF.H264.EnforceHRDCompatibility="Tvinga HRD-kompatibilitet"
53
-AMF.H264.KeyframeInterval="Intervall för keyframes"
54
-AMF.H264.KeyframeInterval.Description="Definierar avståndet mellan keyframes i sekunder. Kontrollerar även GOP-sekvensens storlek."
55
-AMF.H264.IDRPeriod="IDR-period"
56
-AMF.H264.IDRPeriod.Description="Definierar avståndet mellan Instantaneous Decoding Refreshes (IDR) i bildrutor. Kontrollerar även GOP-sekvensens storlek."
57
-AMF.H264.BFrame.Pattern="B-bildrutor"
58
-AMF.H264.DeblockingFilter="Avblockningsfilter"
59
-AMF.H264.ScanType="Typ av skanning"
60
-AMF.H264.ScanType.Description="Vilken skanningsmetod att använda, lämna alltid detta på '\@AMF.H264.ScanType.Progressive\@'."
61
-AMF.H264.ScanType.Progressive="Progressiv"
62
-AMF.H264.ScanType.Interlaced="Sammanflätad"
63
-AMF.H264.MotionEstimation="Rörelseuppskattning"
64
-AMF.H264.MotionEstimation.Description="Rörelseuppskattning låter kodaren reducera nödvändig bithastighet genom att uppskatta var en bildpunkt förflyttas."
65
-AMF.H264.MotionEstimation.None="Ingen"
66
-AMF.H264.MotionEstimation.Half="Halv bildpunkt"
67
-AMF.H264.MotionEstimation.Quarter="Fjärdedels bildpunkt"
68
-AMF.H264.MotionEstimation.Both="Halv och fjärdedels bildpunkt"
69
-AMF.H264.CodingType="Kodningstyp"
70
-AMF.H264.CodingType.Description="Vilken typ av kodning som ska användas:\n* \@AMF.Util.Default\@ låter AMF bestämma (rekommenderas).\n* CALVC (Context-Adaptive Variable-Length Coding) är snabbare, men större.\n* CABAC (Context-Adaptive Binary Arithmetic Coding) är långsammare, men mindre."
71
+Utility.Default="Standard"
72
+Utility.Automatic="Automatisk"
73
+Utility.Manual="Manuell"
74
+Utility.Switch.Disabled="Inaktiverad"
75
+Utility.Switch.Enabled="Aktiverad"
76
+Preset="Förinställning"
77
+Preset.ResetToDefaults="Återställ till standardvärden"
78
+Preset.Recording="Spelar in"
79
+Preset.HighQuality="Hög kvalitet"
80
+Preset.Indistinguishable="Oskiljbar"
81
+Preset.Lossless="Förlustfritt"
82
+Preset.Twitch="Twitch"
83
+Preset.YouTube="YouTube"
84
+Usage="Användning"
85
+Usage.Description="Vilken användning AMF borde vara inställd på:\n- '\@Usage.Transcoding\@' är för allmän omkodning (rekommenderas),\n- '\@Usage.UltraLowLatency\@' är för omkodning med riktigt låg latens,\n- '\@Usage.LowLatency\@' liknar ovanstående men med lite högre latens.\nStrömning stöder endast '\@Usage.Transcoding\@', alla andra värden kan användas för inspelning."
86
+Usage.Transcoding="Omkodning"
87
+Usage.UltraLowLatency="Ultralåg latens"
88
+Usage.LowLatency="Låg latens"
89
+Usage.Webcam="Webbkamera"
90
+QualityPreset="Kvalitetsförinställning"
91
+QualityPreset.Description="Vilken kvalitetsmall AMF bör försöka att uppnå:\n- '\@QualityPreset.Speed\@' är den snabbaste men har den sämsta kvaliteten,\n- '\@QualityPreset.Balanced\@' är en balanserad mix av båda,\n- '\@QualityPreset.Quality\@' ger den bästa kvaliteten för en angiven bithastighet."
92
+QualityPreset.Speed="Hastighet"
93
+QualityPreset.Balanced="Balanserad"
94
+QualityPreset.Quality="Kvalitet"
95
+Profile="Profil"
96
+Profile.Description="Vilken profil att använda för kodning, sorteras från mest utbrett stöd till högsta kvalitet."
97
+ProfileLevel="Profilnivå"
98
+ProfileLevel.Description="Vilken profilnivå att använda för kodning, det är bäst att lämna detta på \@Utility.Automatic\@"
99
+Tier="Nivå"
100
+Tier.Description="Vilken nivå att koda på. 'Hög' siktar på hög bithastighet/bandbredd använder medan 'Huvud' siktar på mainstreammedia."
101
+AspectRatio="Aspektförhållande"
102
+AspectRatio.Description="Vilket bildförhållande som bör skrivas till utmatningsfilen."
103
+CodingType="Kodningstyp"
104
+CodingType.Description="Vilken typ av kodning som ska användas:\n* '\@Utility.Automatic\@' låter AMF bestämma (rekommenderas).\n* 'CALVC' (Context-Adaptive Variable-Length Coding) är snabbare, men större.\n* 'CABAC' (Context-Adaptive Binary Arithmetic Coding) är långsammare, men mindre."
105
+MaximumReferenceFrames="Maximalt antal referensbildrutor"
106
+MaximumReferenceFrames.Description="Hur många bildrutor kodaren kan referera som mest under kodning, påverkar kodningskvalitet avsevärt."
107
+RateControlMethod.CQP="Konstant QP (CQP)"
108
+RateControlMethod.CBR="Konstant bithastighet (CBR)"
109
+RateControlMethod.VBR="Varierande bithastighet (begränsat maxvärde) (VBR_LAT)"
110
+RateControlMethod.VBRLAT="Varierande bithastighet (begränsad latens) (VBR_LAT)"
111
+PrePassMode.Quarter="\@Utility.Switch.Enabled\@ (kvarts storlek)"
112
+PrePassMode.Half="\@Utility.Switch.Enabled\@ (halv storlek)"
113
+PrePassMode.Full="\@Utility.Switch.Enabled\@ (full storlek)"
114
+Bitrate.Target="Målbithastighet"
115
+Bitrate.Target.Description="Bithastighet att försöka uppnå i den övergripande sekvensen."
116
+Bitrate.Peak="Maximal bithastighet"
117
+Bitrate.Peak.Description="Bithastighet att maximalt försöka uppnå i den övergripande sekvensen."
118
+QP.IFrame="QP för I-bildrutor"
119
+QP.IFrame.Description="Konstant QP-värde att använda för I-bildrutor."
120
+QP.PFrame="QP för P-bildrutor"
121
+QP.PFrame.Description="Konstant QP-värde att använda för P-bildrutor."
122
+QP.BFrame="QP för B-bildrutor"
123
+QP.BFrame.Description="Konstant QP-värde att använda för B-bildrutor."
124
+QP.Minimum="Minimal QP"
125
+QP.Minimum.Description="Lägsta QP-värde att använda i en bildruta."
126
+QP.IFrame.Minimum.Description="Lägsta QP-värde att använda i en I-bildruta."
127
+QP.PFrame.Minimum.Description="Lägsta QP-värde att använda i en P-bildruta."
128
+QP.Maximum="Maximal QP"
129
+QP.Maximum.Description="Högsta QP-värde att använda i en bildruta."
130
+QP.IFrame.Maximum.Description="Högsta QP-värde att använda i en I-bildruta."
131
+QP.PFrame.Maximum.Description="Högsta QP-värde att använda i en P-bildruta."
132
+FillerData="Fyllningsdata"
133
+FillerData.Description="Fyllningsdata låter kodaren behålla minst \@Bitrate.Target\@ genom att fylla upp det återstående utrymmet i en sekvens med tom information."
134
+FrameSkipping="Hoppa över bildrutor"
135
+VBAQ="VBAQ"
136
+EnforceHRD="Tvinga HRD"
137
+VBVBuffer="VBV-buffert"
138
+VBVBuffer.Description="Vilken metod som ska användas för att bestämma VBV-buffertens storlek:\n- '\@Utlity.Automatic\@' beräknar storleken med hjälp av en strikt begränsning,\n- '\@Utlity.Manual\@' låter användaren kontrollera storleken.\nVBV-buffertern (Video Buffering Verifier) används av vissa Rate Control Methods för att hålla den övergripande bithastigheten inom de angivna begränsningarna."
139
+VBVBuffer.Strictness="Noggrannhet för VBV-buffert"
140
+VBVBuffer.Strictness.Description="Bestämmer noggrannheten för VBV-bufferten, där 100% är så noggrann som möjligt och 0% är gränslös."
141
+VBVBuffer.Size="VBV-buffertstorlek"
142
+VBVBuffer.Size.Description="Storleken för VBV-bufferten som används för bithastighetskontroll i en sekvens."
143
+VBVBuffer.InitialFullness.Description="Hur full VBV-bufferten är från början (i %), kommer endast påverka den inledande kodningssekvensen."
144
+KeyframeInterval="Intervall för keyframes"
145
+KeyframeInterval.Description="Intervall (i sekunder) mellan keyframes."
146
+H264.IDRPeriod="IDR-period (i bildrutor)"
147
+H264.IDRPeriod.Description="Definierar avståndet mellan Instantaneous Decoding Refreshes (IDR) i bildrutor. Kontrollerar även GOP-sekvensens storlek."
148
+H265.IDRPeriod="IDR-period (i GOP)"
149
+H265.IDRPeriod.Description="Definierar avståndet mellan Instantaneous Decoding Refreshes (IDR) i GOP."
150
+GOP.Type="GOP-typ"
151
+GOP.Type.Description="Vilken typ av GOP bör användas:\n- '\@GOP.Type.Fixed\@' kommer alltid använda fasta avstånd mellan varje GOP.\n- '\@GOP.Type.Variable\@' tillåter GOP i olika storlekar, beroende på vad som behövs.\n'\@GOP.Type.Fixed\@' är hur H264-implementeringen fungerar och är bäst för lokal nätverksströmning, medan '\@GOP.Type.Variable\@' är bäst för korta inspelningar i hög kvalitet."
152
+GOP.Type.Fixed="Konstant"
153
+GOP.Type.Variable="Variabel"
154
+GOP.Size="GOP-storlek"
155
+GOP.Size.Description="Storleken för en GOP (Group Of Pictures) i bildrutor."
156
+GOP.Size.Minimum="Minimal GOP-storlek"
157
+GOP.Size.Minimum.Description="Minimal storlek för en GOP (Group Of Pictures) i bildrutor."
158
+GOP.Size.Maximum="Maximal GOP-storlek"
159
+GOP.Size.Maximum.Description="Maximal storlek för en GOP (Group Of Pictures) i bildrutor."
160
+GOP.Alignment="GOP-justering"
161
+GOP.Alignment.Description="Experimentell. Bieffekterna är okända. Använd på egen risk."
162
+BFrame.Pattern.Description="Antalet B-bildrutor att använda under kodning.\nStöds av andra och tredje generationens VCE-kort. Påverkar kodningsprestandan negativt."
163
+BFrame.DeltaQP.Description="Delta QP-värde till den sista I- eller P-bildrutan för icke-referensbara B-bildrutor."
164
+BFrame.Reference.Description="Låt en B-bildruta också använda B-bildrutor som referens, i stället för bara P- och I-bildrutor."
165
+BFrame.ReferenceDeltaQP.Description="Delta QP-värde till den sista I- eller P-bildrutan för referensbara B-bildrutor."
166
+DeblockingFilter="Avblockningsfilter"
167
+DeblockingFilter.Description="Låter kodaren tillämpa ett avblockeringsfilter."
168
+MotionEstimation="Rörelseuppskattning"
169
+MotionEstimation.Description="Rörelseuppskattning låter kodaren reducera nödvändig bithastighet genom att uppskatta var en bildpunkt förflyttas."
170
+MotionEstimation.Quarter="Fjärdedels bildpunkt"
171
+MotionEstimation.Half="Halv bildpunkt"
172
+MotionEstimation.Full="Fjärdedels och halv bildpunkt"
173
+Video.API="Video-API"
174
+Video.API.Description="Vilket API bör användas av backend?"
175
+Video.Adapter="Grafikkort"
176
+Video.Adapter.Description="På vilken adapter bör vi försöka koda på?"
177
+OpenCL="OpenCL"
178
+View="Visningsläge"
179
+View.Description="Vilka egenskaper bör visas?\nOm '\@View.Master\@' används kommer du inte få någon hjälp."
180
+View.Basic="Grundläggande"
181
+View.Advanced="Avancerat"
182
+View.Expert="Expert"
183
+View.Master="Mästare"
184
+Debug="Felsök"
185
+Debug.Description="Aktivera ytterligare felsökningsmeddelanden. Kräver att du kör Open Broadcaster Software Studio med kommandoraden \"--verbose --log_unfiltered\" (utan citationstecken)."
186
AMF.H264.MaximumLTRFrames="Maximalt antal LTR-bildrutor"
187
+AMF.H264.MaximumAccessUnitSize="Maximal storlek på åtkomstenhet"
188
+AMF.H264.MaximumAccessUnitSize.Description="Största storleken på en åtkomstenhet för en NAL."
189
AMF.H264.HeaderInsertionSpacing.Description="Hur många bildrutor som borde vara mellan NAL-headers."
190
AMF.H264.WaitForTask="Väntar på arbetsuppgifter"
191
AMF.H264.WaitForTask.Description="Okänd, experimentell"
192
-AMF.H264.PreAnalysisPass.Description="Okänd, experimentell"
193
-AMF.H264.VBAQ="VBAQ"
194
-AMF.H264.VBAQ.Description="Okänd, experimentell"
195
-AMF.H264.GOPSize="GOP-storlek"
196
-AMF.H264.GOPSize.Description="Okänd, experimentell"
197
-AMF.H264.GOPAlignment="GOP-justering"
198
-AMF.H264.GOPAlignment.Description="Okänd, experimentell"
199
-AMF.H264.MaximumReferenceFrames.Description="Okänd, experimentell"
200
AMF.H264.SliceMode.Description="Okänd, experimentell"
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/tr-TR.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/tr-TR.ini
Changed
54
1
2
-AMF.Util.Default="Varsayılan"
3
-AMF.Util.Automatic="Otomatik"
4
-AMF.Util.Manual="Elle"
5
-AMF.Util.Toggle.Disabled="Devre Dışı"
6
-AMF.Util.Toggle.Enabled="Etkin"
7
-AMF.H264.Preset="Ön Tanımlı"
8
-AMF.H264.Preset.ResetToDefaults="Varsayılan Ayarlara Geri Dön"
9
-AMF.H264.Preset.Recording="Kaydediliyor"
10
-AMF.H264.Preset.HighQuality="Yüksek Kalite"
11
-AMF.H264.Preset.Lossless="Kayıpsız"
12
-AMF.H264.Preset.Twitch="Twitch"
13
-AMF.H264.Preset.YouTube="YouTube"
14
-AMF.H264.Usage="Kullanım"
15
-AMF.H264.Usage.UltraLowLatency="Ultra Düşük Gecikme"
16
-AMF.H264.Usage.LowLatency="Düşük Gecikme"
17
-AMF.H264.QualityPreset.Speed="Hız"
18
-AMF.H264.QualityPreset.Balanced="Dengeli"
19
-AMF.H264.QualityPreset.Quality="Kalite"
20
-AMF.H264.Profile="Profil"
21
-AMF.H264.ProfileLevel="Profil Seviyesi"
22
-AMF.H264.Bitrate.Target="Hedef Bit Hızı"
23
-AMF.H264.QP.Minimum="Minimum QP"
24
-AMF.H264.QP.Maximum="Maksimum QP"
25
-AMF.H264.VBVBuffer.Size="VBV Arabellek Boyutu"
26
-AMF.H264.FrameSkipping="Kare Atlama"
27
-AMF.H264.ScanType="Tarama Türü"
28
-AMF.H264.MotionEstimation.None="Hiçbiri"
29
-AMF.H264.MotionEstimation.Half="Yarım Piksel"
30
-AMF.H264.MotionEstimation.Quarter="Çeyrek Piksel"
31
-AMF.H264.MotionEstimation.Both="Yarım ve Çeyrek Piksel"
32
AMF.H264.WaitForTask.Description="Bilinmeyen, Deneysel"
33
-AMF.H264.PreAnalysisPass.Description="Bilinmeyen, Deneysel"
34
-AMF.H264.VBAQ="VBAQ"
35
-AMF.H264.VBAQ.Description="Bilinmeyen, Deneysel"
36
-AMF.H264.GOPSize.Description="Bilinmeyen, Deneysel"
37
-AMF.H264.GOPAlignment.Description="Bilinmeyen, Deneysel"
38
-AMF.H264.MaximumReferenceFrames.Description="Bilinmeyen, Deneysel"
39
AMF.H264.SliceMode.Description="Bilinmeyen, Deneysel"
40
AMF.H264.MaximumSliceSize.Description="Bilinmeyen, Deneysel"
41
AMF.H264.SliceControlMode.Description="Bilinmeyen, Deneysel"
42
AMF.H264.SliceControlSize.Description="Bilinmeyen, Deneysel"
43
AMF.H264.IntraRefresh.NumberOfStripes.Description="Bilinmeyen, Deneysel"
44
-AMF.H264.VideoAPI="Video API"
45
-AMF.H264.VideoAdapter="Ekran Kartı"
46
-AMF.H264.OpenCL="OpenCL"
47
-AMF.H264.View="Görüntüleme Modu"
48
-AMF.H264.View.Basic="Temel"
49
-AMF.H264.View.Advanced="Gelişmiş"
50
-AMF.H264.View.Expert="Uzman"
51
-AMF.H264.View.Master="Usta"
52
-AMF.H264.Debug="Hata Ayıklama"
53
54
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/uk-UA.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/uk-UA.ini
Changed
201
1
2
-AMF.Util.Default="За замовчанням"
3
-AMF.Util.Automatic="Автоматично"
4
-AMF.Util.Manual="Вручну"
5
-AMF.Util.Toggle.Disabled="Вимкнено"
6
-AMF.Util.Toggle.Enabled="Увімкнено"
7
-AMF.H264.Preset="Шаблон"
8
-AMF.H264.Preset.ResetToDefaults="Відновити параметри за замовчанням"
9
-AMF.H264.Preset.Recording="Звичайний запис"
10
-AMF.H264.Preset.HighQuality="Висока якість"
11
-AMF.H264.Preset.Indistinguishable="Якість майже без втрат"
12
-AMF.H264.Preset.Lossless="Без втрат якості"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Використання"
16
-AMF.H264.Usage.Description="Тип використання AMF або напрямок його використання, тобто:\n 'Для перекодування' - загальний тип налаштувань (рекомендований).\n 'З ультра-низькою затримкою' - тип лише для дійсно низької затримки під час кодування.\n 'З низькою затримкою' - схожий на зазначений вище, але з трохи більшою затримкою.\n\nТрансляції підтримують лише напрямок використання 'Для перекодування'."
17
-AMF.H264.Usage.Transcoding="Для перекодування"
18
-AMF.H264.Usage.UltraLowLatency="З ультра-низькою затримкою"
19
-AMF.H264.Usage.LowLatency="З низькою затримкою"
20
-AMF.H264.QualityPreset="Шаблон якості"
21
-AMF.H264.QualityPreset.Description="Визначає який Шаблон якості AMF намагатиметься встановити:\n 'Швидкість' - є найшвидшим, але має гіршу якість відео.\n 'Збалансований' - це баланс між шаблонами Швидкість та Якість.\n 'Якість' - дає найкращу якість відео для заданого бітрейту."
22
-AMF.H264.QualityPreset.Speed="Швидкість"
23
-AMF.H264.QualityPreset.Balanced="Збалансований"
24
-AMF.H264.QualityPreset.Quality="Якість"
25
-AMF.H264.Profile="Профіль"
26
-AMF.H264.Profile.Description="Зазначений профіль H.264 буде використано енкодером:\n 'Baseline' - найпоширеніший серед пристроїв відтворення\n 'Main' - майже всі пристрої відтворення мають підтримку цього профілю\n 'High' - профіль підтримується найсучаснішими пристроями (рекомендується)."
27
-AMF.H264.ProfileLevel="Рівень профілю"
28
-AMF.H264.ProfileLevel.Description="Визначає рівень профілю H.264 який буде використано під час кодування:\n 'Автоматично' - програма сама встановить найкращій рівень профілю згідно розміру та частоти кадрів,\n '4.1' - підтримує 1920x1080 30 кадрів/с, 1280x720 60 кадрів/с, 960x540 90 кадрів/с\n '4.2' - підтримує 1920x1080 60 кадрів/с, 1280x720 120 кадрів/с, 960x540 172 кадрів/с\n '5.0' - підтримує 1920x1080 60 кадрів/с, 1280x720 144 кадрів/с, 960x540 172 кадрів/с\n '5.1' - підтримує 3840x2160 30 кадрів/с, 1920x1080 120 кадрів/с, 1280x720 172 кадрів/с, 960x540 172 кадрів/с\n '5.2' - підтримує 3840x2160 60 кадрів/с, 1920x1080 172 кадрів/с, 1280x720 172 кадрів/с, 960x540 172 кадрів/с"
29
-AMF.H264.RateControlMethod="Метод керування потоком"
30
-AMF.H264.RateControlMethod.Description="Визначає метод керування потоком:\n 'Фіксований QP (CQP)' - встановлює фіксовані QP для I-/P-/B-кадрів,\n 'Постійний бітрейт (CBR)' - дотримується значення Бажаний бітрейт потоку (використовуючи\nопцію Заповнювати пустоти у бітрейту) (рекомендується для трансляцій),\n 'Змінний бітрейт (максимальний бітрейт обмежено) (VBR)' - потік завжди залишається нижче значення Максимальний бітрейт,\n 'Змінний бітрейт (затримку обмежено) (VBR_LAT)' - потік буде збережено близько до значення Бажаний бітрейт,\nдопоки затримка графічного адаптеру та навантаження на нього дозволятимуть це,\nв іншому випадку бітрейт буде збільшено (рекомендується для запису).\n\nQP - Quantization Parameter (параметр квантування)."
31
-AMF.H264.RateControlMethod.CQP="Фіксований QP (CQP)"
32
-AMF.H264.RateControlMethod.CBR="Постійний бітрейт (CBR)"
33
-AMF.H264.RateControlMethod.VBR.Peak="Змінний бітрейт (максимальний бітрейт обмежено) (VBR)"
34
-AMF.H264.RateControlMethod.VBR.Latency="Змінний бітрейт (затримку обмежено) (VBR_LAT)"
35
-AMF.H264.Bitrate.Target="Бажаний бітрейт"
36
-AMF.H264.Bitrate.Target.Description="Енкодер буде намагатися дотримуватись цього бітрейту."
37
-AMF.H264.Bitrate.Peak="Максимальний бітрейт"
38
-AMF.H264.Bitrate.Peak.Description="Енкодер буде намагатися не перевищувати цього бітрейту."
39
-AMF.H264.QP.Minimum="Мінімальний QP"
40
-AMF.H264.QP.Minimum.Description="Найнижчий QP (параметр квантування) в кадрі."
41
-AMF.H264.QP.Maximum="Максимальний QP"
42
-AMF.H264.QP.Maximum.Description="Найвищий QP (параметр квантування) в кадрі."
43
-AMF.H264.QP.IFrame="QP для I-кадрів"
44
-AMF.H264.QP.IFrame.Description="Фіксоване значення QP (параметр квантування) для I-кадрів."
45
-AMF.H264.QP.PFrame="QP для P-кадрів"
46
-AMF.H264.QP.PFrame.Description="Фіксоване значення QP (параметр квантування) для P-кадрів."
47
-AMF.H264.QP.BFrame="QP для B-кадрів"
48
-AMF.H264.QP.BFrame.Description="Фіксоване значення QP (параметр квантування) для B-кадрів."
49
-AMF.H264.VBVBuffer="Буфер VBV"
50
-AMF.H264.VBVBuffer.Description="Метод, що використовується для визначення параметру Розмір VBV буфера:\n 'Автоматично' - енкодер вираховує розмір враховуючи параметр Буфер VBV, кореляція.\n 'Вручну' - дозволяє користувачеві контролювати цей розмір.\nVBV (Video Buffering Verifier) Буфер використовується різними Методами керування потоком для збереження бітрейту у зазначених межах."
51
-AMF.H264.VBVBuffer.Strictness="Буфер VBV, кореляція"
52
-AMF.H264.VBVBuffer.Strictness.Description="Визначає як близько значення Буфер VBV дорівнює заданому, у відсотках."
53
-AMF.H264.VBVBuffer.Size="Розмір VBV буфера"
54
-AMF.H264.VBVBuffer.Size.Description="Розмір VBV буфера (Video Buffering Verifier) використовується під час контролю бітрейта відео."
55
-AMF.H264.VBVBuffer.Fullness="Початкова повнота буферу VBV"
56
-AMF.H264.VBVBuffer.Fullness.Description="Визначає початкову заповнюваність Буферу VBV, діє лише на початку кодування."
57
-AMF.H264.FillerData="Заповнювати пустоти у бітрейту"
58
-AMF.H264.FillerData.Description="Заповнювати пустоти у бітрейту - це наповнювання інформацією, яку декодер просто ігнорує. Якщо увімкнено то зайве місце у бітрейті буде заповнено нічого не значущою інформацією за для досягнення точного значення Бажаний бітрейт. Аналог Filler Data."
59
-AMF.H264.FrameSkipping="Пропускати кадри"
60
-AMF.H264.FrameSkipping.Description="Пропускати кадри - дозволяє енкодеру відкидати кадри, якщо керування потоком не може досягти встановленого значення Бажаний бітрейт.\nКоли енкодер пропускає кадр, він додає дублювати-останній-кадр NAL до потоку.\nМоже допомогти при встановленні дуже низьких значень Бажаний бітрейт."
61
-AMF.H264.EnforceHRDCompatibility="Застосувати примусову сумісність з HRD"
62
-AMF.H264.EnforceHRDCompatibility.Description="Застосувати примусову сумісність з HRD (Hypothetical Reference Decoder) - накладає обмеження на максимальне значення QP (параметра квантування) у кадрі задля досягнення сумісності з HRD.\nНе рекомендується для записів або трансляцій. Використовувати лише для сумісності з найстарішими пристроями які мають лише базовий декодер."
63
-AMF.H264.KeyframeInterval="Інтервал ключових кадрів"
64
-AMF.H264.KeyframeInterval.Description="Визначає кількість секунд між двома повними кадрами (ключовими кадрами).\nТакож контролює довжину послідовності кадрів у групі зображень (GOP)."
65
-AMF.H264.IDRPeriod="IDR, період (кадрів)"
66
-AMF.H264.IDRPeriod.Description="Визначає відстань між Instantaneous Decoding Refreshes (IDR) (ключовими кадрами), в кадрах.\nТакож контролює довжину послідовності кадрів у групі зображень (GOP)."
67
-AMF.H264.BFrame.Pattern="B-кадри"
68
-AMF.H264.BFrame.Pattern.Description="Визначає кількість послідовних B-кадрів у кодуванні.\nПідтримується принаймні 2-м та 3-м поколінням VCE карт. Маєнегативний вплив на продуктивність."
69
-AMF.H264.BFrame.DeltaQP="B-кадри, відхил QP"
70
-AMF.H264.BFrame.DeltaQP.Description="Відхил QP (параметра квантування) для не опорних B-кадрів, по відношенню до I-кадрів та P-кадрів."
71
-AMF.H264.BFrame.Reference="B-кадри як опорні"
72
-AMF.H264.BFrame.Reference.Description="Дозволяє робити B-кадри опорними для інших B-кадрів в додаток до вже існуючих P- та I-кадрів."
73
-AMF.H264.BFrame.ReferenceDeltaQP="Відхил QP (параметра квантування) для опорних B-кадрів"
74
-AMF.H264.BFrame.ReferenceDeltaQP.Description="Відхил QP (параметра квантування) для опорних B-кадрів, по відношенню до I-кадрів та P-кадрів."
75
-AMF.H264.DeblockingFilter="Деблокінг-фільтр"
76
-AMF.H264.DeblockingFilter.Description="Встановлює позначку, що дозволяє декодеру використовувати Деблокінг-фільтр для цього відео."
77
-AMF.H264.ScanType="Вид розгортки"
78
-AMF.H264.ScanType.Description="Визначає вид розгортки який треба використовувати у кодуванні,\nзавжди користуйтеся значенням 'Прогресивна'."
79
-AMF.H264.ScanType.Progressive="Прогресивна"
80
-AMF.H264.ScanType.Interlaced="Черезрядкова"
81
-AMF.H264.MotionEstimation="Оцінка руху"
82
-AMF.H264.MotionEstimation.Description="Оцінка руху дозволяє енкодеру зменшити вимоги до бітрейту завдяки розрахункам з переміщення пікселів."
83
-AMF.H264.MotionEstimation.None="Немає"
84
-AMF.H264.MotionEstimation.Half="Пів-пікселя"
85
-AMF.H264.MotionEstimation.Quarter="Чверть-пікселя"
86
-AMF.H264.MotionEstimation.Both="Пів-пікселя та Чверть-пікселя"
87
-AMF.H264.CodingType="Схема кодування"
88
-AMF.H264.CodingType.Description="Визначає яку схему кодування використовувати:\n 'За замовчанням' - програма вирішує самостійно (рекомендується).\n 'CABAC' - контекстно-залежне адаптивне бінарне арифметичне кодування, схема має кращу компресію даних, але здійснює більше навантаження.\n 'CAVLC' - контекстно-залежне адаптивне кодування із змінною довжиною кодового слова, схема має дещо меншу компресію даних, але й здійснює менше навантаження."
89
+Utility.Default="За замовчанням"
90
+Utility.Automatic="Автоматично"
91
+Utility.Manual="Вручну"
92
+Utility.Switch.Disabled="Вимкнено"
93
+Utility.Switch.Enabled="Увімкнено"
94
+Preset="Шаблон"
95
+Preset.ResetToDefaults="Відновити параметри за замовчанням"
96
+Preset.Recording="Звичайний запис"
97
+Preset.HighQuality="Висока якість"
98
+Preset.Indistinguishable="Якість майже без втрат"
99
+Preset.Lossless="Без втрат якості"
100
+Preset.Twitch="Twitch"
101
+Preset.YouTube="YouTube"
102
+Usage="Використання"
103
+Usage.Description="Тип використання AMF або напрямок його використання, тобто:\n 'Для перекодування' - загальний тип налаштувань (рекомендований).\n 'З ультра-низькою затримкою' - тип лише для дійсно низької затримки під час кодування.\n 'З низькою затримкою' - схожий на зазначений вище, але з трохи більшою затримкою.\n\nТрансляції підтримують лише напрямок використання 'Для перекодування'."
104
+Usage.Transcoding="Для перекодування"
105
+Usage.UltraLowLatency="З ультра-низькою затримкою"
106
+Usage.LowLatency="З низькою затримкою"
107
+Usage.Webcam="Для вебкамери"
108
+QualityPreset="Шаблон якості"
109
+QualityPreset.Description="Визначає який Шаблон якості AMF намагатиметься встановити:\n 'Швидкість' - є найшвидшим, але має гіршу якість відео.\n 'Збалансований' - це баланс між шаблонами Швидкість та Якість.\n 'Якість' - дає найкращу якість відео для заданого бітрейту."
110
+QualityPreset.Speed="Швидкість"
111
+QualityPreset.Balanced="Збалансований"
112
+QualityPreset.Quality="Якість"
113
+Profile="Профіль"
114
+Profile.Description="Зазначений профіль буде використано енкодером. Від того що має найвищу сумісність (вище) до найвищої якості (нижче)."
115
+ProfileLevel="Рівень профілю"
116
+ProfileLevel.Description="Визначає рівень профілю який буде використано під час кодування. 'Автоматично' - програма сама встановить найкращій рівень."
117
+Tier="Рівень додатку"
118
+Tier.Description="Рівень додатку (або Tier). 'High' використовується для змісту з високим бітрейтом або професійне використання, тоді як 'Main' застосовується в усіх інших випадках."
119
+AspectRatio="Пропорції"
120
+AspectRatio.Description="Співвідношення сторін яке буде записано до файлу Виводу."
121
+CodingType="Схема кодування"
122
+CodingType.Description="Визначає яку схему кодування використовувати:\n 'За замовчанням' - програма вирішує самостійно (рекомендується).\n 'CABAC' - контекстно-залежне адаптивне бінарне арифметичне кодування, схема має кращу компресію даних, але здійснює більше навантаження.\n 'CAVLC' - контекстно-залежне адаптивне кодування із змінною довжиною кодового слова, схема має дещо меншу компресію даних, але й здійснює менше навантаження."
123
+MaximumReferenceFrames="Максимальна кількість опорних кадрів"
124
+MaximumReferenceFrames.Description="Визначає яку кількість кадрів дозволено енкодеру використовувати у якості опорних. Має безпосередній вплив на якість кодування."
125
+RateControlMethod="Метод керування потоком"
126
+RateControlMethod.Description="Визначає метод керування потоком:\n 'Фіксований QP (CQP)' - встановлює фіксовані QP для I-/P-/B-кадрів,\n 'Постійний бітрейт (CBR)' - дотримується значення Бажаний бітрейт потоку (використовуючи\nопцію Заповнювати пустоти у бітрейту) (рекомендується для трансляцій),\n 'Змінний бітрейт (максимальний бітрейт обмежено) (VBR)' - потік завжди залишається нижче значення Максимальний бітрейт,\n 'Змінний бітрейт (затримку обмежено) (VBR_LAT)' - потік буде збережено близько до значення Бажаний бітрейт,\nдопоки затримка графічного адаптеру та навантаження на нього дозволятимуть це,\nв іншому випадку бітрейт буде збільшено (рекомендується для запису).\n\nQP - Quantization Parameter (параметр квантування)."
127
+RateControlMethod.CQP="Фіксований QP (CQP)"
128
+RateControlMethod.CBR="Постійний бітрейт (CBR)"
129
+RateControlMethod.VBR="Змінний бітрейт (максимальний бітрейт обмежено) (VBR)"
130
+RateControlMethod.VBRLAT="Змінний бітрейт (затримку обмежено) (VBR_LAT)"
131
+PrePassMode="Попередній прохід"
132
+PrePassMode.Description="Це ще один прохід енкодера, що дозволяє ще компактніше розташувати блоки даних у наданому бітрейту. Ефективність методу залежить від апаратного забезпечення."
133
+PrePassMode.Quarter="Увімкнено (на чверть від повного розміру)"
134
+PrePassMode.Half="Увімкнено (на половину від повного розміру)"
135
+PrePassMode.Full="Увімкнено (на повний розмір)"
136
+Bitrate.Target="Бажаний бітрейт"
137
+Bitrate.Target.Description="Енкодер буде намагатися дотримуватись цього бітрейту."
138
+Bitrate.Peak="Максимальний бітрейт"
139
+Bitrate.Peak.Description="Енкодер буде намагатися не перевищувати цього бітрейту."
140
+QP.IFrame="QP для I-кадрів"
141
+QP.IFrame.Description="Фіксоване значення QP (параметр квантування) для I-кадрів."
142
+QP.PFrame="QP для P-кадрів"
143
+QP.PFrame.Description="Фіксоване значення QP (параметр квантування) для P-кадрів."
144
+QP.BFrame="QP для B-кадрів"
145
+QP.BFrame.Description="Фіксоване значення QP (параметр квантування) для B-кадрів."
146
+QP.Minimum="Мінімальний QP"
147
+QP.Minimum.Description="Найнижчий QP (параметр квантування) в кадрі."
148
+QP.IFrame.Minimum="Мінімальний QP для I-кадрів"
149
+QP.IFrame.Minimum.Description="Найнижчий QP (параметр квантування) для I-кадрів."
150
+QP.PFrame.Minimum="Мінімальний QP для P-кадрів"
151
+QP.PFrame.Minimum.Description="Найнижчий QP (параметр квантування) для P-кадрів."
152
+QP.Maximum="Максимальний QP"
153
+QP.Maximum.Description="Найвищий QP (параметр квантування) в кадрі."
154
+QP.IFrame.Maximum="Максимальний QP для I-кадрів"
155
+QP.IFrame.Maximum.Description="Найвищий QP (параметр квантування) для I-кадрів."
156
+QP.PFrame.Maximum="Максимальний QP для P-кадрів"
157
+QP.PFrame.Maximum.Description="Найвищий QP (параметр квантування) для P-кадрів."
158
+FillerData="Заповнювати пустоти у бітрейту"
159
+FillerData.Description="Заповнювати пустоти у бітрейту - це наповнювання інформацією, яку декодер просто ігнорує. Якщо увімкнено, то зайве місце у бітрейті буде заповнено нічого не значущою інформацією за для дотримання точного значення Бажаний бітрейт. Аналог Filler Data."
160
+FrameSkipping="Пропускати кадри"
161
+FrameSkipping.Description="Пропускати кадри - дозволяє енкодеру відкидати кадри, якщо керування потоком не може досягти встановленого значення Бажаний бітрейт.\nКоли енкодер пропускає кадр, він додає дублювати-останній-кадр NAL до потоку.\nМоже допомогти при встановленні дуже низьких значень Бажаний бітрейт."
162
+VBAQ="VBAQ"
163
+VBAQ.Description="Увімкнути використання функції Variance Based Adaptive Quantization (VBAQ), яка базується на дисперсії пікселів задля кращого використання наявного бітрейту.\nЗаощаджує на комплексних текстурах, до яких око людини менш чутливе, на користь плавних переходів в інших місцях.\nЗа рахунок цього, може дещо поліпшити якість зображення."
164
+EnforceHRD="Застосувати примусову сумісність з HRD"
165
+EnforceHRD.Description="Застосувати примусову сумісність з HRD (Hypothetical Reference Decoder) - накладає обмеження на енкодер задля забезпечення норм стандартного потоку."
166
+VBVBuffer="Буфер VBV"
167
+VBVBuffer.Description="Метод, що використовується для визначення параметру Розмір VBV буфера:\n 'Автоматично' - енкодер вираховує розмір враховуючи параметр Буфер VBV, кореляція.\n 'Вручну' - дозволяє користувачеві контролювати цей розмір.\n\nVBV (Video Buffering Verifier) Буфер використовується різними Методами керування потоком для збереження бітрейту у зазначених межах."
168
+VBVBuffer.Strictness="Буфер VBV, кореляція"
169
+VBVBuffer.Strictness.Description="Визначає як близько значення Буфер VBV дорівнює заданому, у відсотках."
170
+VBVBuffer.Size="Розмір VBV буфера"
171
+VBVBuffer.Size.Description="Розмір VBV буфера (Video Buffering Verifier) використовується під час контролю бітрейта відео."
172
+VBVBuffer.InitialFullness="Початкова повнота буферу VBV"
173
+VBVBuffer.InitialFullness.Description="Визначає початкову заповнюваність Буферу VBV (у відсотках), діє лише на початку кодування."
174
+KeyframeInterval="Інтервал ключових кадрів"
175
+KeyframeInterval.Description="Визначає кількість секунд між двома повними кадрами (ключовими кадрами)."
176
+H264.IDRPeriod="IDR, період (кадрів)"
177
+H264.IDRPeriod.Description="Визначає відстань між Instantaneous Decoding Refreshes (IDR) (ключовими кадрами), в кадрах.\nТакож контролює довжину послідовності кадрів у групі зображень (GOP)."
178
+H265.IDRPeriod="IDR, період (групи зображень)"
179
+H265.IDRPeriod.Description="Визначає відстань між Instantaneous Decoding Refreshes (IDR) (ключовими кадрами), тут вимірюється у кількості груп зображень (GOP) між двома IDR."
180
+GOP.Type="Тип розміру GOP"
181
+GOP.Type.Description="Визначає який тип розміру групи зображень (GOP) буде використано у кодуванні:\n 'Фіксований' - постійна відстань між двома групами зображень.\n 'Змінний' - розмір кожної групи зображень може змінюватись у часі.\nФіксований розмір групи зображень є часткою стандарту H.264 та найбільш відповідає трансляціям, у той час як Змінний розмір групи зображень краще застосовувати у високоякісних записах малого розміру."
182
+GOP.Type.Fixed="Фіксований"
183
+GOP.Type.Variable="Змінний"
184
+GOP.Size="Розмір GOP"
185
+GOP.Size.Description="Розмір групи зображень (GOP), у кадрах."
186
+GOP.Size.Minimum="Мінімальний розмір GOP"
187
+GOP.Size.Minimum.Description="Мінімальний розмір групи зображень (GOP), у кадрах."
188
+GOP.Size.Maximum="Максимальний розмір GOP"
189
+GOP.Size.Maximum.Description="Максимальний розмір групи зображень (GOP), у кадрах."
190
+GOP.Alignment="Вирівнювання GOP"
191
+GOP.Alignment.Description="Експериментально, ефект не відомо. Використовувати лише на свій страх і ризик."
192
+BFrame.Pattern="Послідовні B-кадри"
193
+BFrame.Pattern.Description="Визначає кількість послідовних B-кадрів у кодуванні.\nПідтримується принаймні 2-м та 3-м поколінням VCE карт. Має негативний вплив на продуктивність."
194
+BFrame.DeltaQP="B-кадри, відхил QP"
195
+BFrame.DeltaQP.Description="Відхил QP (параметра квантування) для не опорних B-кадрів, по відношенню до I-кадрів та P-кадрів."
196
+BFrame.Reference="B-кадри як опорні"
197
+BFrame.Reference.Description="Дозволяє робити B-кадри опорними для інших B-кадрів в додаток до вже існуючих P- та I-кадрів."
198
+BFrame.ReferenceDeltaQP="Відхил QP для опорних B-кадрів"
199
+BFrame.ReferenceDeltaQP.Description="Відхил QP (параметра квантування) для опорних B-кадрів, по відношенню до I-кадрів та P-кадрів."
200
+DeblockingFilter="Деблокінг-фільтр"
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/vi-VN.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/vi-VN.ini
Changed
156
1
2
-AMF.Util.Default="Mặc định"
3
-AMF.Util.Automatic="Tự động"
4
-AMF.Util.Manual="Thủ công"
5
-AMF.Util.Toggle.Disabled="Tắt"
6
-AMF.Util.Toggle.Enabled="Bật"
7
-AMF.H264.Preset="Mẫu thiết lập"
8
-AMF.H264.Preset.ResetToDefaults="Thiết lập về mặc định"
9
-AMF.H264.Preset.Recording="Quay video"
10
-AMF.H264.Preset.HighQuality="Chất lượng cao"
11
-AMF.H264.Preset.Indistinguishable="Không thể phân biệt"
12
-AMF.H264.Preset.Lossless="Lossless"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="Sử dụng"
16
-AMF.H264.Usage.Transcoding="Chuyển mã"
17
-AMF.H264.Usage.UltraLowLatency="Độ trễ cực thấp"
18
-AMF.H264.Usage.LowLatency="Độ trễ thấp"
19
-AMF.H264.QualityPreset="Quality Preset"
20
-AMF.H264.QualityPreset.Speed="Tốc độ"
21
-AMF.H264.QualityPreset.Balanced="Cân bằng"
22
-AMF.H264.QualityPreset.Quality="Chất lượng"
23
-AMF.H264.Profile="Profile"
24
-AMF.H264.ProfileLevel="Profile Level"
25
-AMF.H264.RateControlMethod="Cách kiểm soát Bitrate"
26
-AMF.H264.RateControlMethod.CQP="QP Không thay đổi (CQP)"
27
-AMF.H264.RateControlMethod.CBR="Bitrate Không thay đổi (CBR)"
28
-AMF.H264.RateControlMethod.VBR.Peak="Bitrate Thay đổi được (Phụ thuộc vào Bitrate Cao nhất) (VBR)"
29
-AMF.H264.RateControlMethod.VBR.Latency="Bitrate Thay đổi được (Phụ thuộc vào độ trễ) (VBR_LAT)"
30
-AMF.H264.Bitrate.Target="Bitrate Mục tiêu"
31
-AMF.H264.Bitrate.Peak="Bitrate Cao nhất"
32
-AMF.H264.QP.Minimum="QP Thấp nhất"
33
-AMF.H264.QP.Maximum="QP Cao nhất"
34
-AMF.H264.QP.IFrame="I-Frame QP"
35
-AMF.H264.QP.PFrame="P-Frame QP"
36
-AMF.H264.QP.BFrame="B-Frame QP"
37
-AMF.H264.FillerData="Filler Data (Thêm data cho đủ bitrate)"
38
-AMF.H264.FrameSkipping="Frame Skipping"
39
-AMF.H264.EnforceHRDCompatibility="Enforce HRD Compatibility"
40
-AMF.H264.KeyframeInterval="Thời gian đặt keyframe"
41
-AMF.H264.DeblockingFilter="De-blocking Filter (Lọc chống nhiễu ảnh)"
42
-AMF.H264.ScanType="Quét hình loại"
43
-AMF.H264.ScanType.Progressive="Quét nguyên ảnh (Progressive)"
44
-AMF.H264.ScanType.Interlaced="Quét 1/2 ảnh (Interlaced)"
45
-AMF.H264.MotionEstimation="Dự đoán bù trừ chuyển động"
46
-AMF.H264.MotionEstimation.Description="Dự toán chuyển động cho phép bộ mã hóa giảm bitrate cần thiết bằng cách ước tính một pixel sẽ đi đâu."
47
-AMF.H264.MotionEstimation.None="Không"
48
-AMF.H264.MotionEstimation.Half="1/2 Pixel"
49
-AMF.H264.MotionEstimation.Quarter="1/4 Pixel"
50
-AMF.H264.MotionEstimation.Both="1/2 và 1/4 Pixel"
51
-AMF.H264.CodingType="Coding Type"
52
+Utility.Default="Mặc định"
53
+Utility.Automatic="Tự động"
54
+Utility.Manual="Thủ công"
55
+Utility.Switch.Disabled="Tắt"
56
+Utility.Switch.Enabled="Bật"
57
+Preset="Mẫu thiết lập"
58
+Preset.ResetToDefaults="Thiết lập về mặc định"
59
+Preset.Recording="Quay video"
60
+Preset.HighQuality="Chất lượng cao"
61
+Preset.Indistinguishable="Không thể phân biệt"
62
+Preset.Lossless="Lossless"
63
+Preset.Twitch="Twitch"
64
+Preset.YouTube="YouTube"
65
+Usage="Sử dụng"
66
+Usage.Transcoding="Chuyển mã"
67
+Usage.UltraLowLatency="Độ trễ cực thấp"
68
+Usage.LowLatency="Độ trễ thấp"
69
+Usage.Webcam="Webcam"
70
+QualityPreset="Quality Preset"
71
+QualityPreset.Speed="Tốc độ"
72
+QualityPreset.Balanced="Cân bằng"
73
+QualityPreset.Quality="Chất lượng"
74
+Profile="Hồ sơ"
75
+ProfileLevel="Profile Level"
76
+AspectRatio="Tỉ lệ"
77
+CodingType="Coding Type"
78
+RateControlMethod="Cách kiểm soát Bitrate"
79
+RateControlMethod.CQP="QP Không thay đổi (CQP)"
80
+RateControlMethod.CBR="Bitrate Không thay đổi (CBR)"
81
+RateControlMethod.VBR="Bitrate Thay đổi được (Phụ thuộc vào Bitrate Cao nhất) (VBR)"
82
+RateControlMethod.VBRLAT="Bitrate Thay đổi được (Phụ thuộc vào độ trễ) (VBR_LAT)"
83
+PrePassMode="Pre-Pass Mode"
84
+Bitrate.Target="Bitrate Mục tiêu"
85
+Bitrate.Peak="Bitrate Cao nhất"
86
+QP.IFrame="I-Frame QP"
87
+QP.PFrame="P-Frame QP"
88
+QP.BFrame="B-Frame QP"
89
+QP.Minimum="QP Thấp nhất"
90
+QP.Minimum.Description="Giá trị QP nhỏ nhất sử dụng trong 1 khung ảnh."
91
+QP.IFrame.Minimum="I-Frame QP Thấp nhất"
92
+QP.IFrame.Minimum.Description="Giá trị QP nhỏ nhất sử dụng trong 1 I-Frame."
93
+QP.PFrame.Minimum="P-Frame QP Thấp nhất"
94
+QP.PFrame.Minimum.Description="Giá trị QP nhỏ nhất sử dụng trong 1 P-Frame."
95
+QP.Maximum="QP Cao nhất"
96
+QP.Maximum.Description="Giá trị QP lớn nhất sử dụng trong 1 khung ảnh."
97
+QP.IFrame.Maximum="I-Frame QP Cao nhất"
98
+QP.IFrame.Maximum.Description="Giá trị QP lớn nhất sử dụng trong 1 I-Frame."
99
+QP.PFrame.Maximum="P-Frame QP Cao nhất"
100
+QP.PFrame.Maximum.Description="Giá trị QP lớn nhất sử dụng trong P-Frame."
101
+FillerData="Filler Data (Thêm data cho đủ bitrate)"
102
+FillerData.Description="Bật Filler Data cho phép bộ mã hóa giữ ít nhất \@Bitrate.Target\@ bằng cách điền vào không gian còn lại trong một chuỗi thông tin trống."
103
+VBAQ="VBAQ"
104
+EnforceHRD="Ép sử dụng HRD"
105
+KeyframeInterval="Thời gian đặt keyframe"
106
+KeyframeInterval.Description="Khoảng thời gian (bằng giây) giữa các khung hình."
107
+GOP.Type="Loại GOP"
108
+GOP.Type.Fixed="Cố định"
109
+GOP.Type.Variable="Biến"
110
+GOP.Size="Kích cỡ GOP"
111
+GOP.Size.Description="Kích thước của một GOP (Nhóm ảnh) trong khung hình."
112
+GOP.Size.Minimum="Kích thước GOP tối thiểu"
113
+GOP.Size.Minimum.Description="Kích thước tối thiểu của một GOP (Nhóm ảnh) trong khung hình."
114
+GOP.Size.Maximum="Kích thước GOP tối đa"
115
+GOP.Size.Maximum.Description="Kích thước tối đa của một GOP (Nhóm ảnh) trong khung hình."
116
+GOP.Alignment.Description="Thử nghiệm, kết quả chưa biết. Dùng nó có thể tạo một số rủi ro."
117
+DeblockingFilter="De-blocking Filter (Lọc chống nhiễu ảnh)"
118
+DeblockingFilter.Description="Cho phép bộ giải mã áp dụng lọc chống nhiễu ảnh."
119
+MotionEstimation="Dự đoán bù trừ chuyển động"
120
+MotionEstimation.Description="Dự đoán bù trừ chuyển động cho phép bộ mã hóa giảm bitrate cần thiết bằng cách ước tính một pixel sẽ đi đâu."
121
+MotionEstimation.Quarter="1/4 Pixel"
122
+MotionEstimation.Half="1/2 Pixel"
123
+MotionEstimation.Full="1/4 & 1/2 Pixel"
124
+Video.API="Video API"
125
+Video.Adapter="Card đồ họa"
126
+OpenCL="OpenCL"
127
+OpenCL.Description="Nên sử dụng OpenCL để gửi các khung? Về mặt kỹ thuật thì nhanh hơn nhưng có thể gây ra vấn đề với driver của Intel (do thư viện OpenCL không tương thích)."
128
+View="Chế độ xem"
129
+View.Description="Những thuộc tính gì sẽ được hiển thị?\nNếu sử dụng '\@View.Master\@' thì bạn sẽ không nhận được hỗ trợ."
130
+View.Basic="Cơ bản"
131
+View.Advanced="Nâng cao"
132
+View.Expert="Chuyên gia"
133
+View.Master="Bật cả tính năng ẩn"
134
+Debug="Gỡ lỗi"
135
+Debug.Description="Cho phép hiện thông báo gỡ lỗi bổ sung. Đòi hỏi bạn phải chạy Open Broadcaster Software Studio với dòng lệnh --verbose --log_unfiltered."
136
AMF.H264.MaximumLTRFrames="LTR Frames tối đa"
137
-AMF.H264.GOPSize="Kích cỡ GOP"
138
-AMF.H264.GOPSize.Description="Không rõ, thử nghiệm"
139
+AMF.H264.WaitForTask.Description="Không rõ, thử nghiệm"
140
AMF.H264.SlicesPerFrame="Lát cho mỗi khung hình"
141
-AMF.H264.VideoAPI="Video API"
142
-AMF.H264.VideoAdapter="Card đồ họa"
143
-AMF.H264.OpenCL="OpenCL"
144
-AMF.H264.View="Chế độ xem"
145
-AMF.H264.View.Basic="Cơ bản"
146
-AMF.H264.View.Advanced="Nâng cao"
147
-AMF.H264.View.Expert="Chuyên gia"
148
-AMF.H264.View.Master="Bật cả tính năng ẩn"
149
-AMF.H264.Debug="Gỡ lỗi"
150
+AMF.H264.SliceMode.Description="Không rõ, thử nghiệm"
151
+AMF.H264.MaximumSliceSize.Description="Không rõ, thử nghiệm"
152
+AMF.H264.SliceControlMode.Description="Không rõ, thử nghiệm"
153
+AMF.H264.SliceControlSize.Description="Không rõ, thử nghiệm"
154
+AMF.H264.IntraRefresh.NumberOfStripes.Description="Không rõ, thử nghiệm"
155
156
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/zh-CN.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/zh-CN.ini
Changed
201
1
2
-AMF.Util.Default="默认"
3
-AMF.Util.Automatic="自动"
4
-AMF.Util.Manual="手动"
5
-AMF.Util.Toggle.Disabled="禁用"
6
-AMF.Util.Toggle.Enabled="启用"
7
-AMF.H264.Preset="预设"
8
-AMF.H264.Preset.ResetToDefaults="重置为默认值"
9
-AMF.H264.Preset.Recording="录像"
10
-AMF.H264.Preset.HighQuality="高质量"
11
-AMF.H264.Preset.Indistinguishable="无法区分"
12
-AMF.H264.Preset.Lossless="无损"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="使用"
16
-AMF.H264.Usage.Description="AMF 应调整为什么用法:\n-'转码' 是通用转码(推荐), \n '超低延迟' 对于真的低延迟编码,\n-'低延迟' 类似于上面稍高的延迟.\n 推流仅支持 '转码', 所有其他值可以用于录制."
17
-AMF.H264.Usage.Transcoding="转码"
18
-AMF.H264.Usage.UltraLowLatency="超低延迟"
19
-AMF.H264.Usage.LowLatency="低延迟"
20
-AMF.H264.QualityPreset="质量预设"
21
-AMF.H264.QualityPreset.Description="哪种质量预设 AMF 应该尝试对于目标:\n-'速度' 是最快但有最差的质量,\n-'平衡' 是 '速度' 和 '质量' 之间, 提供一个两者之间的较好的平衡,\n-'质量' 给出了最好的质量对于给定的比特率."
22
-AMF.H264.QualityPreset.Speed="速度"
23
-AMF.H264.QualityPreset.Balanced="平衡"
24
-AMF.H264.QualityPreset.Quality="质量"
25
-AMF.H264.Profile="配置文件"
26
-AMF.H264.Profile.Description="H.264的编码选项有:\n-'Baseline' 支持的平台最广,\n-'Main' 支持较老的设备(如果使用的平台是手机,推荐使用),\n-'High' 被当下的设备支持(推荐使用)。"
27
-AMF.H264.ProfileLevel="配置等级"
28
-AMF.H264.ProfileLevel.Description="对于编码使用哪种 H.264 Profile Level:\n-'Automatic' 根据给定的帧率和帧大小计算最优的 profile level,\n-'4.1' 支持 1920x1080 30FPS, 1280x720 60FPS, 960x540 90FPS\n-'4.2' 支持 1920x1080 60FPS, 1280x720 120FPS, 960x540 172FPS\n-'5.0' 支持 1920x1080 60FPS, 1280x720 144FPS, 960x540 172FPS\n-'5.1' 支持 3840x2160 30FPS, 1920x1080 120FPS, 1280x720 172FPS, 960x540 172FPS\n-'5.2' 支持 3840x2160 60FPS, 1920x1080 172FPS, 1280x720 172FPS, 960x540 172FPS"
29
-AMF.H264.RateControlMethod="速率控制方法"
30
-AMF.H264.RateControlMethod.Description="该使用什么调节码率的方法:\n- '\@AMF.H264.RateControlMethod.CQP\@' assigns fixed I-/P-/B-Frame QP (Quantization Parameter) values,\n- '\@AMF.H264.RateControlMethod.CBR\@' stays at the given Target Bitrate (using Filler Data) (推荐推流使用),\n- '\@AMF.H264.RateControlMethod.VBR\@' stays below the given Peak Bitrate,\n- '\@AMF.H264.RateControlMethod.VBR_LAT\@' stays close to the Target Bitrate if GPU latency and load allow for it, otherwise will use higher bitrate (推荐录像使用)."
31
-AMF.H264.RateControlMethod.CQP="恒定 QP (CQP)"
32
-AMF.H264.RateControlMethod.CBR="固定比特率 (CBR)"
33
-AMF.H264.RateControlMethod.VBR.Peak="变比特率 (峰值约束) (VBR)"
34
-AMF.H264.RateControlMethod.VBR.Latency="变比特率 (延迟约束) (VBR_LAT)"
35
-AMF.H264.Bitrate.Target="目标比特率"
36
-AMF.H264.Bitrate.Target.Description="尝试在这个序列中获取的比特率."
37
-AMF.H264.Bitrate.Peak="峰值比特率"
38
-AMF.H264.Bitrate.Peak.Description="尝试在这个序列中获取的峰值比特率."
39
-AMF.H264.QP.Minimum="最低 QP"
40
-AMF.H264.QP.Minimum.Description="一帧中最低 QP (量化参数) 值"
41
-AMF.H264.QP.Maximum="最高 QP"
42
-AMF.H264.QP.Maximum.Description="一帧中最高 QP (量化参数) 值"
43
-AMF.H264.QP.IFrame="I 帧 QP"
44
-AMF.H264.QP.IFrame.Description="用于 I 帧的固定的 QP 值."
45
-AMF.H264.QP.PFrame="P 帧 QP"
46
-AMF.H264.QP.PFrame.Description="用于 P 帧的固定 QP 值."
47
-AMF.H264.QP.BFrame="B 帧 QP"
48
-AMF.H264.QP.BFrame.Description="用于 B 帧的固定 QP (量化参数) 值."
49
-AMF.H264.VBVBuffer="VBV 缓存"
50
-AMF.H264.VBVBuffer.Description="应使用什么方法来确定 VBV 缓冲区大小:\n-'自动' 计算使用严格约束的大小,\n- '手册' 允许用户控制大小.\nVBV缓存 (视频缓冲程序验证程序) 用于某些率控制方法来保持整体的比特率在给定的约束内."
51
-AMF.H264.VBVBuffer.Strictness="VBV 缓存规范性"
52
-AMF.H264.VBVBuffer.Strictness.Description="决定 VBV 缓存的严格性, 100% 表示尽可能严格, 0% 表示无限制."
53
-AMF.H264.VBVBuffer.Size="VBV 缓存大小"
54
-AMF.H264.VBVBuffer.Size.Description="用于在一个序列中的控制比特率的 VBV 缓存的大小."
55
-AMF.H264.VBVBuffer.Fullness="VBV 缓冲满"
56
-AMF.H264.VBVBuffer.Fullness.Description="VBV 缓存最初应该多满, 将只会影响最初的序列的编码."
57
-AMF.H264.FillerData="填充数据"
58
-AMF.H264.FillerData.Description="启用填充数据允许编码器至少保持目标比特率, 通过填满空信息序列中的剩余空间."
59
-AMF.H264.FrameSkipping="跳过的帧"
60
-AMF.H264.FrameSkipping.Description="跳过的帧允许编码器下丢帧, 以满足目标比特率要求.\n当编码器丢帧时, 它反而插入一个重复最后一帧的 NAL 到流中.\n可以帮助非常低的目标比特率."
61
-AMF.H264.EnforceHRDCompatibility="强制 HRD 兼容"
62
-AMF.H264.EnforceHRDCompatibility.Description="强制假设的参考解码器限制在一个帧内的最大的 QP 值更改.\n不推荐用于录制或推流, 并且应仅用于面向只有参考软件解码器的很老的设备."
63
-AMF.H264.KeyframeInterval="关键帧间隔"
64
-AMF.H264.KeyframeInterval.Description="非丢弃帧之间应该多少秒.\n也控制序列(GOP) 的大小."
65
-AMF.H264.IDRPeriod="IDR 周期"
66
-AMF.H264.IDRPeriod.Description="定义的帧内瞬时解码刷新 (IDR) 的距离. 也控制 GOP 序列长度."
67
-AMF.H264.BFrame.Pattern="B 帧"
68
-AMF.H264.BFrame.Pattern.Description="多少 B 帧应该用于编码.\n2 代和 3 代 VCE 卡支持. 对编码性能有负面影响."
69
-AMF.H264.BFrame.DeltaQP="B 帧差值 QP"
70
-AMF.H264.BFrame.DeltaQP.Description="对于非参考 B 帧, 相对于上一个 I 或者 P 帧的差值 QP 值."
71
-AMF.H264.BFrame.Reference="参考 B 帧"
72
-AMF.H264.BFrame.Reference.Description="允许 B 帧也使用 B 帧作为参考, 而不是只是 P 和 I 帧."
73
-AMF.H264.BFrame.ReferenceDeltaQP="参考 B 帧差值 QP"
74
-AMF.H264.BFrame.ReferenceDeltaQP.Description="对于参考 B 帧, 相对于上一个 I 或者 P 帧的差值 QP 值."
75
-AMF.H264.DeblockingFilter="去块滤波"
76
-AMF.H264.DeblockingFilter.Description="设置解码器允许使用的标记, 用于编码流去块滤波器."
77
-AMF.H264.ScanType="扫描类型"
78
-AMF.H264.ScanType.Description="使用哪种扫描方法, 通常设置为'Progressive'."
79
-AMF.H264.ScanType.Progressive="渐进"
80
-AMF.H264.ScanType.Interlaced="交错"
81
-AMF.H264.MotionEstimation="移动侦测"
82
-AMF.H264.MotionEstimation.Description="运动侦测允许编码器通过估计一个像素去了哪里来降低比特率."
83
-AMF.H264.MotionEstimation.None="无"
84
-AMF.H264.MotionEstimation.Half="半像素"
85
-AMF.H264.MotionEstimation.Quarter="四分之一像素"
86
-AMF.H264.MotionEstimation.Both="半&四分之一像素"
87
-AMF.H264.CodingType="编码类型"
88
-AMF.H264.CodingType.Description="使用哪种编码类型:\n* \@AMF.Util.Default\@ 让 AMF 决定(推荐).\n* CALVC(上下文自适应可变长度编码) 速度更快但是更大.\n* CABAC(上下文自适应二进制算术编码)速度更慢, 但是更小."
89
+Utility.Default="默认"
90
+Utility.Automatic="自动"
91
+Utility.Manual="手动"
92
+Utility.Switch.Disabled="禁用"
93
+Utility.Switch.Enabled="启用"
94
+Preset="预设"
95
+Preset.ResetToDefaults="重置为默认值"
96
+Preset.Recording="录像"
97
+Preset.HighQuality="高质量"
98
+Preset.Indistinguishable="无法区分"
99
+Preset.Lossless="无损"
100
+Preset.Twitch="Twitch"
101
+Preset.YouTube="YouTube"
102
+Usage="使用"
103
+Usage.Description="AMF 应调整为什么用法:\n-'\@Usage.Transcoding\@' 是通用转码(推荐),\n- '\@Usage.UltraLowLatency\@' 用于真正低延迟编码,\n-'\@Usage.LowLatency\@' 类似于上面稍高的延迟.\n 推流仅支持 '\@Usage.Transcoding\@', 所有其他值可以用于录制."
104
+Usage.Transcoding="转码"
105
+Usage.UltraLowLatency="超低延迟"
106
+Usage.LowLatency="低延迟"
107
+Usage.Webcam="网络摄像头"
108
+QualityPreset="质量预设"
109
+QualityPreset.Description="质量预设 AMF 应尝试向目标:\n-'\@QualityPreset.Speed\@' 是最快但最差的质量,\n-'\@QualityPreset.Balanced\@' 是平衡两者的混合,\n-'\@QualityPreset.Quality\@' 给出了最好的质量为给定的比特率."
110
+QualityPreset.Speed="速度"
111
+QualityPreset.Balanced="平衡"
112
+QualityPreset.Quality="质量"
113
+Profile="配置文件"
114
+Profile.Description="什么配置文件进行编码. 从最佳支持(顶部) 到最好的质量(底部) 排序."
115
+ProfileLevel="配置等级"
116
+ProfileLevel.Description="要使用哪些配置文件级别. 最好设置在 \@Utility.Automatic\@."
117
+Tier="层"
118
+Tier.Description="要在编码在哪一层. '高' 目标高的比特率/带宽使用, 而 '主' 针对主流媒体."
119
+AspectRatio="长宽比"
120
+AspectRatio.Description="哪个长宽比应写入输出文件."
121
+CodingType="编码类型"
122
+CodingType.Description="使用哪种编码类型:\n* '\@Utility.Automatic\@' 让 AMF 决定(推荐).\n* 'CALVC'(上下文自适应可变长度编码) 速度更快但是更大.\n* 'CABAC'(上下文自适应二进制算术编码)速度更慢, 但是更小."
123
+MaximumReferenceFrames="最大参考帧"
124
+MaximumReferenceFrames.Description="在大多数编码时多少帧编码器可能会引用, 对编码质量有直接影响."
125
+RateControlMethod="速率控制方法"
126
+RateControlMethod.Description="应该使用什么比率控制方法:\n- '\@RateControlMethod.CQP\@' 赋值固定的 I/P/B 帧 QP(量化参数) 值,\n- '\@RateControlMethod.CBR\@' 保持在一个给定的目标比特率(使用过滤数据)(推荐用于推流),\n- '\@RateControlMethod.VBR\@' 保持在给定的峰值比特率以下,\n- '\@RateControlMethod.VBRLAT\@' 保持接近目标比特率如果 GPU 延迟和负载, 否则将会使用更高的比特率(推荐用于录制)."
127
+RateControlMethod.CQP="恒定 QP (CQP)"
128
+RateControlMethod.CBR="固定比特率 (CBR)"
129
+RateControlMethod.VBR="变比特率 (峰值约束) (VBR)"
130
+RateControlMethod.VBRLAT="变比特率 (延迟约束) (VBR_LAT)"
131
+PrePassMode="前通模式"
132
+PrePassMode.Description="前通是次选的比特率发行通过, 允许更好发行在一个序列内的比特率, 然而效果可能会随着不同的卡而不同."
133
+PrePassMode.Quarter="\@Utility.Switch.Enabled\@ (四分之一大小)"
134
+PrePassMode.Half="\@Utility.Switch.Enabled\@ (半尺寸)"
135
+PrePassMode.Full="\@Utility.Switch.Enabled\@ (全尺寸)"
136
+Bitrate.Target="目标比特率"
137
+Bitrate.Target.Description="尝试在整个序列中获取的比特率."
138
+Bitrate.Peak="峰值比特率"
139
+Bitrate.Peak.Description="尝试在整个序列中最大获取的比特率."
140
+QP.IFrame="I 帧 QP"
141
+QP.IFrame.Description="用于 I 帧的固定的 QP 值."
142
+QP.PFrame="P 帧 QP"
143
+QP.PFrame.Description="用于 P 帧的固定 QP 值."
144
+QP.BFrame="B 帧 QP"
145
+QP.BFrame.Description="用于 B 帧的固定的 QP 值."
146
+QP.Minimum="最低 QP"
147
+QP.Minimum.Description="在一个 I 帧中使用的最低 QP 值."
148
+QP.IFrame.Minimum="最小 I-帧 QP"
149
+QP.IFrame.Minimum.Description="在一个 I 帧中使用的最低 QP 值."
150
+QP.PFrame.Minimum="最小 I-帧 QP"
151
+QP.PFrame.Minimum.Description="在一个 P 帧中使用的最低 QP 值."
152
+QP.Maximum="最高 QP"
153
+QP.Maximum.Description="在一个帧中使用的最高 QP 值."
154
+QP.IFrame.Maximum="最大 I-帧 QP"
155
+QP.IFrame.Maximum.Description="在一个 I 帧中使用的最高 QP 值."
156
+QP.PFrame.Maximum="最大的 P 帧 QP"
157
+QP.PFrame.Maximum.Description="在一个 P 帧中使用的最高 QP 值."
158
+FillerData="填充数据"
159
+FillerData.Description="启用填充数据允许编码器至少保持 \@Bitrate.Target\@, 通过填满空信息序列中的剩余空间."
160
+FrameSkipping="跳过的帧"
161
+FrameSkipping.Description="跳过的帧允许编码器下丢帧, 以满足\@Bitrate.Target\@ 要求.\n当编码器丢帧时, 它反而插入一个重复最后一帧的 NAL 到流中.\n可以帮助非常低的\@Bitrate.Target\@."
162
+VBAQ="VBAQ"
163
+VBAQ.Description="启用'基于方差的自适应量化'(VBAQ), 基于像素的方差来更好地区分比特率.\n他基于原理人类的视觉系统是对高纹理的物体不敏感, 因而将推动比特率来实现更平滑的界面.\n启用这个可能会导致某些内容的主观质量的改善."
164
+EnforceHRD="强制 HRD"
165
+EnforceHRD.Description="强制使用假设的参考解码器, 用于验证输出码流是否正确."
166
+VBVBuffer="VBV 缓存"
167
+VBVBuffer.Description="应使用什么方法来确定 VBV 缓冲区大小:\n-'\@Utlity.Automatic\@' 计算使用严格约束的大小,\n- '\@Utlity.Manual\@' 允许用户控制大小.\nVBV缓存 (视频缓冲程序验证程序) 用于某些率控制方法来保持整体的比特率在给定的约束内."
168
+VBVBuffer.Strictness="VBV 缓存规范性"
169
+VBVBuffer.Strictness.Description="决定 VBV 缓存的严格性, 100% 表示尽可能严格, 0% 表示无限制."
170
+VBVBuffer.Size="VBV 缓存大小"
171
+VBVBuffer.Size.Description="用于在一个序列中的控制比特率的 VBV 缓存的大小."
172
+VBVBuffer.InitialFullness="VBV 缓冲区初始满"
173
+VBVBuffer.InitialFullness.Description="VBV 缓存最初应该多满(百分比), 将只会影响最初的序列的编码."
174
+KeyframeInterval="关键帧间隔"
175
+KeyframeInterval.Description="关键帧之间间隔(以秒为单位)."
176
+H264.IDRPeriod="IDR 周期 (帧)"
177
+H264.IDRPeriod.Description="定义帧内瞬时解码刷新 (IDR) 的距离. 也控制 GOP 序列长度."
178
+H265.IDRPeriod="IDR 周期 (GOPs)"
179
+H265.IDRPeriod.Description="定义 GOP 之间瞬时解码刷新 (IDR) 的距离。"
180
+GOP.Type="GOP 类型"
181
+GOP.Type.Description="应使用哪种类型的 GOP:\n-'\@GOP.Type.Fixed\@' 将始终使用固定的每个 GOP 之间的距离之.\n-'\@GOP.Type.Variable\@' 允许 GOPs 为不同值, 取决于什么是需要的.\n'\@GOP.Type.Fixed\@' 是 H264 实现如何工作和最好的本地网络推流, 而 '\@GOP.Type.Variable\@' 是最适合低大小高品质的录像."
182
+GOP.Type.Fixed="固定的"
183
+GOP.Type.Variable="可变的"
184
+GOP.Size="GOP 大小"
185
+GOP.Size.Description="帧中最大的 GOP (Group Of Pictures) 大小"
186
+GOP.Size.Minimum="GOP 大小最小值"
187
+GOP.Size.Minimum.Description="帧中最小的 GOP (Group Of Pictures) 大小"
188
+GOP.Size.Maximum="GOP 大小最大值"
189
+GOP.Size.Maximum.Description="帧中最大的 GOP (Group Of Pictures) 大小"
190
+GOP.Alignment="GOP 对齐"
191
+GOP.Alignment.Description="实验, 效果是未知. 使用风险由自己负责."
192
+BFrame.Pattern="B 帧模式"
193
+BFrame.Pattern.Description="在编码时使用多少 B 帧.\n2 代和 3 代 VCE 卡支持. 对编码性能有负面影响."
194
+BFrame.DeltaQP="B 帧差值 QP"
195
+BFrame.DeltaQP.Description="对于非参考 B 帧, 相对于上一个 I 或者 P 帧的差值 QP 值."
196
+BFrame.Reference="B 帧参考"
197
+BFrame.Reference.Description="允许 B 帧也使用 B 帧作为参考, 而不是只是 P 和 I 帧."
198
+BFrame.ReferenceDeltaQP="B 帧参考差值 QP"
199
+BFrame.ReferenceDeltaQP.Description="对于参考 B 帧, 相对于上一个 I 或者 P 帧的差值 QP 值."
200
+DeblockingFilter="去块滤波"
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Resources/locale/zh-TW.ini -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Resources/locale/zh-TW.ini
Changed
201
1
2
-AMF.Util.Default="預設"
3
-AMF.Util.Automatic="自動"
4
-AMF.Util.Manual="手動"
5
-AMF.Util.Toggle.Disabled="停用"
6
-AMF.Util.Toggle.Enabled="啟用"
7
-AMF.H264.Preset="預設"
8
-AMF.H264.Preset.ResetToDefaults="重設為預設值"
9
-AMF.H264.Preset.Recording="錄影"
10
-AMF.H264.Preset.HighQuality="高品質"
11
-AMF.H264.Preset.Indistinguishable="無法區分"
12
-AMF.H264.Preset.Lossless="無損"
13
-AMF.H264.Preset.Twitch="Twitch"
14
-AMF.H264.Preset.YouTube="YouTube"
15
-AMF.H264.Usage="用法"
16
-AMF.H264.Usage.Description="根據用途 AMF 應調整為︰ \n- '\@AMF.H264.Usage.Transcoding\@' 是通用轉碼 (推薦),\n- '\@AMF.H264.Usage.UltraLowLatency\@' 是為了真的非常低延遲的編碼,\n- '\@AMF.H264.Usage.LowLatency\@'是類似於上面但延遲稍高。 \n串流僅支援'\@AMF.H264.Usage.Transcoding\@',其他值可以用於錄影。"
17
-AMF.H264.Usage.Transcoding="轉碼"
18
-AMF.H264.Usage.UltraLowLatency="超低延遲"
19
-AMF.H264.Usage.LowLatency="低延遲"
20
-AMF.H264.QualityPreset="預設品質"
21
-AMF.H264.QualityPreset.Description="AMF 嘗試達成的預設品質:\n- '\@AMF.H264.QualityPreset.Speed\@' 為最快但最差的品質,\n- '\@AMF.H264.QualityPreset.Balanced\@' 為中間點,\n- '\@AMF.H264.QualityPreset.Quality\@' 在給定的位元速率下有最佳的品質。"
22
-AMF.H264.QualityPreset.Speed="速度"
23
-AMF.H264.QualityPreset.Balanced="平衡"
24
-AMF.H264.QualityPreset.Quality="品質"
25
-AMF.H264.Profile="設定檔"
26
-AMF.H264.Profile.Description="用於編碼的 H.264 設定:\n- 'Baseline' 有最廣泛的平台支援度,\n- 'Main' 較舊的裝置也支援 (如果目標是行動裝置,建議選此),\n- 'High' 當前主流裝置支援 (建議選此)。"
27
-AMF.H264.ProfileLevel="設定檔級別"
28
-AMF.H264.ProfileLevel.Description="用於編碼的 H.264 設定等級:\n- '\@AMF.Util.Automatic\@'根據給定的畫面播放速率以及尺寸計算最佳的設定等級,\n- '4.1'支援 1920x1080 30FPS, 1280x720 60FPS, 960x540 90FPS\n- '4.2'支援 1920x1080 60FPS, 1280x720 120FPS, 960x540 172FPS\n- '5.0'支援 1920x1080 60FPS, 1280x720 144FPS, 960x540 172FPS\n- '5.1'支援3840x2160 30FPS, 1920x1080 120FPS, 1280x720 172FPS, 960x540 172FPS\n- '5.2'支援3840x2160 60FPS, 1920x1080 172FPS, 1280x720 172FPS, 960x540 172FPS"
29
-AMF.H264.RateControlMethod="速率控制方法"
30
-AMF.H264.RateControlMethod.Description="該使用什麼位元速率控制方法:\n- '\@AMF.H264.RateControlMethod.CQP\@' 指定固定的 I-/P-/B-訊框 QP (量化參數)值,\n- '\@AMF.H264.RateControlMethod.CBR\@' 固定在給定的目標位元速率 (藉由填塞空白資料)(建議用於串流),\n- '\@AMF.H264.RateControlMethod.VBR\@' 保持低於給定的位元速率最大值,\n- '\@AMF.H264.RateControlMethod.VBR_LAT\@' 在 GPU 延遲跟負載允許的情況下盡量接近目標位元速率,不足時使用較高的位元速率(建議用於錄影)。"
31
-AMF.H264.RateControlMethod.CQP="固定 QP (CQP)"
32
-AMF.H264.RateControlMethod.CBR="固定位元率 (CBR)"
33
-AMF.H264.RateControlMethod.VBR.Peak="可變位元率 (限制最大位元率) (VBR)"
34
-AMF.H264.RateControlMethod.VBR.Latency="可變位元率 (限制延遲) (VBR)"
35
-AMF.H264.Bitrate.Target="目標位元率"
36
-AMF.H264.Bitrate.Target.Description="在整體過程中嘗試達成的位元速率。"
37
-AMF.H264.Bitrate.Peak="最大位元率"
38
-AMF.H264.Bitrate.Peak.Description="在整體過程中嘗試不超過的位元速率。"
39
-AMF.H264.QP.Minimum="最低 QP 值"
40
-AMF.H264.QP.Minimum.Description="一個訊框中使用的最低 QP (量化參數) 值。"
41
-AMF.H264.QP.Maximum="最大 QP 值"
42
-AMF.H264.QP.Maximum.Description="一個訊框中使用的最高 QP (量化參數) 值。"
43
-AMF.H264.QP.IFrame="I-訊框 QP"
44
-AMF.H264.QP.IFrame.Description="I 訊框所使用的固定 QP 值"
45
-AMF.H264.QP.PFrame="P-訊框 QP"
46
-AMF.H264.QP.PFrame.Description="P 訊框所使用的固定 QP 值"
47
-AMF.H264.QP.BFrame="B-訊框 QP"
48
-AMF.H264.QP.BFrame.Description="B-訊框使用的固定 QP (量化參數) 值。"
49
-AMF.H264.VBVBuffer="VBV(Video Buffering Verifier) 緩衝區"
50
-AMF.H264.VBVBuffer.Description="決定 VBV 緩衝區大小的方法:\n- '\@AMF.Util.Automatic\@' 根據嚴格性計算大小,\n- '\@AMF.Util.Manual\@' 允許使用者調整大小。\n 某些速率控制方法會使用 VBV (Video Buffering Verifier) 緩衝區讓整體的位元速率保持在給定的條件之內。"
51
-AMF.H264.VBVBuffer.Strictness="VBV 緩衝區嚴格性"
52
-AMF.H264.VBVBuffer.Strictness.Description="決定 VBV 緩衝區的嚴密性,100% 表示盡可能的嚴格,0% 表示完全不限制。"
53
-AMF.H264.VBVBuffer.Size="VBV 緩衝區大小"
54
-AMF.H264.VBVBuffer.Size.Description="VBV緩衝區的大小,這將用於過程中的位元速率控制"
55
-AMF.H264.VBVBuffer.Fullness="初始 VBV 緩衝區填充度"
56
-AMF.H264.VBVBuffer.Fullness.Description="VBV 緩衝區起始該多滿,將只影響編碼的起始。"
57
-AMF.H264.FillerData="填塞空白資料"
58
-AMF.H264.FillerData.Description="啟用填塞空白資料允許編碼器保持位元速率至少有目標位元速率,編碼器將會將不足的位元用空白訊息填滿"
59
-AMF.H264.FrameSkipping="省略訊框"
60
-AMF.H264.FrameSkipping.Description="省略訊框允許編碼器在為了達成目標位元速率時省略部份訊框。\n當編碼器省略訊框時,他將插入重複上一個訊框的指令。\n對極低的目標位元速率有幫助。"
61
-AMF.H264.EnforceHRDCompatibility="與 HRD 相容"
62
-AMF.H264.EnforceHRDCompatibility.Description="執行 Hypothetical Reference Decoder 限制,這將限制單一訊框內 QP 值的最大變化量。"
63
-AMF.H264.KeyframeInterval="關鍵訊框間隔"
64
-AMF.H264.KeyframeInterval.Description="以秒為單位,定義關鍵訊框之間的距離。同時也控制了 GOP 序列的大小。"
65
-AMF.H264.IDRPeriod="IDR 周期"
66
-AMF.H264.IDRPeriod.Description="以訊框為單位,定義瞬間解碼重新更新(Instantaneous Decoding Refreshes)間的距離。同時也控制了 GOP 序列的大小。"
67
-AMF.H264.BFrame.Pattern="B 訊框"
68
-AMF.H264.BFrame.Pattern.Description="編碼時使用的 B 訊框數量。\n搭載第二代和第三代影像編碼引擎的顯示卡支援此參數。對編碼效能會有不良影響。"
69
-AMF.H264.BFrame.DeltaQP="B 訊框的 QP 值變化"
70
-AMF.H264.BFrame.DeltaQP.Description="在沒使用可參照 B 訊框時, B 訊框與上一個I或P訊框間的QP值變化。"
71
-AMF.H264.BFrame.Reference="可參照 B 訊框"
72
-AMF.H264.BFrame.Reference.Description="允許 B 訊框也使用 B 訊框作為參照,而不限於 P 和 I 訊框。"
73
-AMF.H264.BFrame.ReferenceDeltaQP="可參照 B 訊框的 QP 值變化"
74
-AMF.H264.BFrame.ReferenceDeltaQP.Description="在使用可參照 B 訊框時,B 訊框與上一個 I 或 P 訊框間的 QP 值變化。"
75
-AMF.H264.DeblockingFilter="去塊狀色斑濾鏡"
76
-AMF.H264.DeblockingFilter.Description="設定選項,讓解碼器可以使用去塊狀色斑濾鏡。"
77
-AMF.H264.ScanType="掃描類型"
78
-AMF.H264.ScanType.Description="掃描方式,請確保此值為'\@AMF.H264.ScanType.Progressive\@'。"
79
-AMF.H264.ScanType.Progressive="漸進式"
80
-AMF.H264.ScanType.Interlaced="交错式"
81
-AMF.H264.MotionEstimation="動態估算"
82
-AMF.H264.MotionEstimation.Description="動態估算讓編碼器藉由估算像素移動來減少位元速率。"
83
-AMF.H264.MotionEstimation.None="無"
84
-AMF.H264.MotionEstimation.Half="半像素"
85
-AMF.H264.MotionEstimation.Quarter="四分之一像素"
86
-AMF.H264.MotionEstimation.Both="半 & 四分之一像素"
87
-AMF.H264.CodingType="Coding Type"
88
-AMF.H264.CodingType.Description="Which type of coding to use:\n* \@AMF.Util.Default\@ lets AMF decide (recommended).\n* CALVC (Context-Adaptive Variable-Length Coding) is faster, but larger.\n* CABAC (Context-Adaptive Binary Arithmetic Coding) is slower, but smaller."
89
+Utility.Default="預設"
90
+Utility.Automatic="自動"
91
+Utility.Manual="自訂"
92
+Utility.Switch.Disabled="已停用"
93
+Utility.Switch.Enabled="已啟用"
94
+Preset="預設"
95
+Preset.ResetToDefaults="重設為預設值"
96
+Preset.Recording="錄影"
97
+Preset.HighQuality="高畫質"
98
+Preset.Indistinguishable="無法區分"
99
+Preset.Lossless="無損"
100
+Preset.Twitch="Twitch"
101
+Preset.YouTube="YouTube"
102
+Usage="使用情況"
103
+Usage.Description="根據用途 AMF 應調整為︰ \n- '\@Usage.Transcoding\@' 是通用轉碼 (推薦),\n- '\@Usage.UltraLowLatency\@' 是為了真的非常低延遲的編碼,\n- '\@Usage.LowLatency\@'是類似於上面但延遲稍高。 \n串流僅支援'\@Usage.Transcoding\@',其他值可以用於錄影。"
104
+Usage.Transcoding="轉碼"
105
+Usage.UltraLowLatency="超低延遲"
106
+Usage.LowLatency="低延遲"
107
+Usage.Webcam="網路攝影機"
108
+QualityPreset="品質預設"
109
+QualityPreset.Description="AMF 嘗試達成的預設品質:\n- '\@QualityPreset.Speed\@' 為最快但最差的品質,\n- '\@QualityPreset.Balanced\@' 為中間點,\n- '\@QualityPreset.Quality\@' 在給定的位元速率下有最佳的品質。"
110
+QualityPreset.Speed="速度"
111
+QualityPreset.Balanced="平衡"
112
+QualityPreset.Quality="品質"
113
+Profile="設定"
114
+Profile.Description="使用哪種設定進行編碼。從最廣泛被支援(頂部)到最好的畫質(底部)排序。"
115
+ProfileLevel="設定級別"
116
+ProfileLevel.Description="使用哪種設定級別。建議保持設定為\@Utility.Automatic\@。"
117
+Tier="Tier"
118
+Tier.Description="對哪種 Tier 編碼。'High' 針對高位元率/頻寬的情境,'Main' 針對主流媒介。"
119
+AspectRatio="長寬比"
120
+AspectRatio.Description="寫進輸出檔案的長寬比"
121
+CodingType="編碼類型"
122
+CodingType.Description="使用哪種類型的編碼︰ \n* '\@Utility.Automatic\@' 讓 AMF 決定 (推薦)。 \n* 'CALVC' (上下文自我調整可變長度編碼) 較快,但產出較大的檔案。 \n* 'CABAC' (上下文自我調整二進位算術編碼) 較慢,但較小。"
123
+MaximumReferenceFrames="最大參考訊框"
124
+MaximumReferenceFrames.Description="編碼器在編碼時最多可參照的訊框數,直接影響編碼品質。"
125
+RateControlMethod="速率控制方法"
126
+RateControlMethod.Description="該使用什麼位元速率控制方法:\n- '\@RateControlMethod.CQP\@' 指定固定的 I-/P-/B-訊框 QP (量化參數)值,\n- '\@RateControlMethod.CBR\@' 固定在給定的目標位元速率 (藉由填塞空白資料)(建議用於串流),\n- '\@RateControlMethod.VBR\@' 保持低於給定的位元速率最大值,\n- '\@RateControlMethod.VBRLAT\@' 在 GPU 延遲跟負載允許的情況下盡量接近目標位元速率,不足時使用較高的位元速率(建議用於錄影)。"
127
+RateControlMethod.CQP="恒定 QP (CQP)"
128
+RateControlMethod.CBR="固定位元率 (CBR)"
129
+RateControlMethod.VBR="可變位元率 (限制最大位元率) (VBR)"
130
+RateControlMethod.VBRLAT="可變位元率 (限制延遲) (VBR)"
131
+PrePassMode="前置階段模式"
132
+PrePassMode.Description="前置階段是次要的位元率分配階段,此階段讓過程內的位元率能有更好的分配,然而這個效果對每個顯示卡都有所不同。"
133
+PrePassMode.Quarter="\@Utility.Switch.Enabled\@ (四分之一大小)"
134
+PrePassMode.Half="\@Utility.Switch.Enabled\@ (半尺寸)"
135
+PrePassMode.Full="\@Utility.Switch.Enabled\@ (全尺寸)"
136
+Bitrate.Target="目標位元率"
137
+Bitrate.Target.Description="在整體過程中嘗試達成的位元速率。"
138
+Bitrate.Peak="最大位元率"
139
+Bitrate.Peak.Description="在整體過程中嘗試不超過的位元速率。"
140
+QP.IFrame="I-訊框 QP"
141
+QP.IFrame.Description="I 訊框所使用的固定 QP 值"
142
+QP.PFrame="P-訊框 QP"
143
+QP.PFrame.Description="P 訊框所使用的固定 QP 值"
144
+QP.BFrame="B-訊框 QP"
145
+QP.BFrame.Description="B 訊框所使用的固定 QP 值"
146
+QP.Minimum="最低 QP 值"
147
+QP.Minimum.Description="在一個訊框中使用的最低 QP 值。"
148
+QP.IFrame.Minimum="最低 I-訊框 QP"
149
+QP.IFrame.Minimum.Description="在一個 I-訊框中使用的最低 QP 值。"
150
+QP.PFrame.Minimum="最低 P-訊框 QP"
151
+QP.PFrame.Minimum.Description="在一個 P-訊框中使用的最低 QP 值。"
152
+QP.Maximum="最大 QP 值"
153
+QP.Maximum.Description="在一個訊框中使用的最高 QP 值。"
154
+QP.IFrame.Maximum="最大 I-訊框 QP"
155
+QP.IFrame.Maximum.Description="在一個 I-訊框中使用的最高 QP 值。"
156
+QP.PFrame.Maximum="最大 P-訊框 QP"
157
+QP.PFrame.Maximum.Description="在一個 P-訊框中使用的最高 QP 值。"
158
+FillerData="填塞空白資料"
159
+FillerData.Description="啟用填塞空白資料允許編碼器保持位元速率至少有\@Bitrate.Target\@,編碼器將會將不足的位元用空白訊息填滿"
160
+FrameSkipping="省略訊框"
161
+FrameSkipping.Description="省略訊框允許編碼器在為了達成\@Bitrate.Target\@時省略部份訊框。\n當編碼器省略訊框時,他將插入重複上一個訊框的指令。\n對極低的\@Bitrate.Target\@有幫助。"
162
+VBAQ="VBAQ"
163
+EnforceHRD="強制使用 HRD"
164
+EnforceHRD.Description="強制使用 Hypothetical Reference Decoder,HRD 用於驗證輸出位元流是否正確。"
165
+VBVBuffer="VBV(Video Buffering Verifier) 緩衝區"
166
+VBVBuffer.Description="決定 VBV 緩衝區大小的方法:\n- '\@Utility.Automatic\@' 根據嚴格性計算大小,\n- '\@Utility.Manual\@' 允許使用者調整大小。\n 某些速率控制方法會使用 VBV (Video Buffering Verifier) 緩衝區讓整體的位元速率保持在給定的條件之內。"
167
+DeblockingFilter="去塊狀色斑濾鏡"
168
+DeblockingFilter.Description="允許解碼器使用去塊狀色斑濾鏡。"
169
+MotionEstimation="動態估算"
170
+MotionEstimation.Description="動態估算讓編碼器藉由估算像素移動來減少位元速率。"
171
+MotionEstimation.Quarter="四分之一像素"
172
+MotionEstimation.Half="半像素"
173
+MotionEstimation.Full="四分之一與半像素"
174
+Video.API="影像 API"
175
+Video.API.Description="後端應使用什麼 API?"
176
+Video.Adapter="顯示卡"
177
+Video.Adapter.Description="該嘗試用那個顯示卡編碼?"
178
+OpenCL="OpenCL"
179
+OpenCL.Description="使用 OpenCL 提交訊框?技術上更快,但 (由於不相容的 OpenCL 函式庫) 會跟 Intel 驅動程式相衝。"
180
+View="檢視模式"
181
+View.Description="該顯示哪些屬性?\n使用'\@View.Master\@'時將不提供任何的支援。"
182
+View.Basic="基本"
183
+View.Advanced="進階"
184
+View.Expert="專家"
185
+View.Master="上帝模式"
186
+Debug="除錯模式"
187
+Debug.Description="啟用額外的除錯訊息。需要用 '--verbose --log_unfiltered' 命令列來啟動 OBS"
188
AMF.H264.MaximumLTRFrames="Maximum LTR Frames"
189
AMF.H264.MaximumLTRFrames.Description="Long Term Reference (LTR) Frames are a feature that allows the encoder to flag certain frames in a sequence as referencable for a long time.\nLTR Frames can't be used with B-Frames and the encoder will disable B-Frames if these are used."
190
AMF.H264.MaximumAccessUnitSize="Maximum Access Unit Size"
191
192
AMF.H264.HeaderInsertionSpacing.Description="How many frames should be between NAL headers."
193
AMF.H264.WaitForTask="Wait For Task"
194
AMF.H264.WaitForTask.Description="Unknown, Experimental"
195
-AMF.H264.PreAnalysisPass="預分析階段"
196
-AMF.H264.PreAnalysisPass.Description="Unknown, Experimental"
197
-AMF.H264.VBAQ="VBAQ"
198
-AMF.H264.VBAQ.Description="Unknown, Experimental"
199
-AMF.H264.GOPSize="GOP Size"
200
-AMF.H264.GOPSize.Description="Unknown, Experimental"
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Source/amf-capabilities.cpp -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Source/amf-capabilities.cpp
Changed
201
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
SOFTWARE.
12
*/
13
14
-#pragma once
15
-
16
-//////////////////////////////////////////////////////////////////////////
17
-// Includes
18
-//////////////////////////////////////////////////////////////////////////
19
-#include <string>
20
-#include <sstream>
21
-
22
-#ifdef _WIN32
23
-#include <windows.h>
24
-#include <VersionHelpers.h>
25
-#endif
26
-
27
#include "amf-capabilities.h"
28
-#include "api-d3d11.h"
29
-#include "api-d3d9.h"
30
-#include "misc-util.cpp"
31
-
32
-//////////////////////////////////////////////////////////////////////////
33
-// Code
34
-//////////////////////////////////////////////////////////////////////////
35
-
36
-Plugin::AMD::VCEDeviceCapabilities::VCEDeviceCapabilities() {
37
- acceleration_type = amf::AMF_ACCEL_NOT_SUPPORTED;
38
- maxProfile =
39
- maxProfileLevel =
40
- maxBitrate =
41
- minReferenceFrames =
42
- maxReferenceFrames =
43
- maxTemporalLayers =
44
- maxNumOfStreams =
45
- maxNumOfHwInstances =
46
- input.minWidth =
47
- input.maxWidth =
48
- input.minHeight =
49
- input.maxHeight =
50
- input.verticalAlignment =
51
- output.minWidth =
52
- output.maxWidth =
53
- output.minHeight =
54
- output.maxHeight =
55
- output.verticalAlignment = 0;
56
- supportsBFrames =
57
- supportsFixedSliceMode =
58
- input.supportsInterlaced =
59
- output.supportsInterlaced = false;
60
- input.formats.clear();
61
- input.memoryTypes.clear();
62
- output.formats.clear();
63
- output.memoryTypes.clear();
64
+#include "utility.h"
65
+
66
+//#ifdef _WIN32
67
+//#include <windows.h>
68
+//#include <VersionHelpers.h>
69
+//#endif
70
+
71
+using namespace Plugin;
72
+using namespace Plugin::AMD;
73
+
74
+#pragma region Singleton
75
+static CapabilityManager* __instance;
76
+static std::mutex __instance_mutex;
77
+void Plugin::AMD::CapabilityManager::Initialize() {
78
+ const std::lock_guard<std::mutex> lock(__instance_mutex);
79
+ if (!__instance)
80
+ __instance = new CapabilityManager();
81
}
82
83
-std::shared_ptr<Plugin::AMD::VCECapabilities> Plugin::AMD::VCECapabilities::GetInstance() {
84
- static std::shared_ptr<VCECapabilities> __instance = std::make_shared<VCECapabilities>();
85
- static std::mutex __mutex;
86
-
87
- const std::lock_guard<std::mutex> lock(__mutex);
88
+CapabilityManager* Plugin::AMD::CapabilityManager::Instance() {
89
+ const std::lock_guard<std::mutex> lock(__instance_mutex);
90
return __instance;
91
}
92
93
-void Plugin::AMD::VCECapabilities::ReportCapabilities(std::shared_ptr<Plugin::API::Base> api) {
94
- auto inst = GetInstance();
95
- auto adapters = api->EnumerateAdapters();
96
- for (auto adapter : adapters) {
97
- ReportAdapterCapabilities(api, adapter);
98
- }
99
-}
100
-
101
-void Plugin::AMD::VCECapabilities::ReportAdapterCapabilities(std::shared_ptr<Plugin::API::Base> api, Plugin::API::Adapter adapter) {
102
- auto inst = GetInstance();
103
- H264EncoderType types[] = {
104
- H264EncoderType::AVC,
105
- H264EncoderType::SVC,
106
- };
107
-
108
- AMF_LOG_INFO("Capabilities for %s adapter '%s':",
109
- api->GetName().c_str(),
110
- adapter.Name.c_str());
111
-
112
- for (auto type : types) {
113
- ReportAdapterTypeCapabilities(api, adapter, type);
114
- }
115
-}
116
-
117
-void Plugin::AMD::VCECapabilities::ReportAdapterTypeCapabilities(std::shared_ptr<Plugin::API::Base> api, Plugin::API::Adapter adapter, H264EncoderType type) {
118
- auto inst = GetInstance();
119
- auto caps = inst->GetAdapterCapabilities(api, adapter, type);
120
-
121
- AMF_LOG_INFO(" %s (Acceleration: %s)",
122
- (type == H264EncoderType::AVC ? "AVC" : (type == H264EncoderType::SVC ? "SVC" : "Unknown")),
123
- (caps.acceleration_type == amf::AMF_ACCEL_SOFTWARE ? "Software" : (caps.acceleration_type == amf::AMF_ACCEL_GPU ? "GPU" : (caps.acceleration_type == amf::AMF_ACCEL_HARDWARE ? "Hardware" : "None")))
124
- );
125
-
126
- if (caps.acceleration_type == amf::AMF_ACCEL_NOT_SUPPORTED)
127
- return;
128
-
129
- AMF_LOG_INFO(" Limits");
130
- AMF_LOG_INFO(" Profile: %s", Plugin::Utility::ProfileAsString((H264Profile)caps.maxProfile));
131
- AMF_LOG_INFO(" Profile Level: %ld.%ld", caps.maxProfileLevel / 10, caps.maxProfileLevel % 10);
132
- AMF_LOG_INFO(" Bitrate: %ld", caps.maxBitrate);
133
- AMF_LOG_INFO(" Reference Frames: %ld (min) - %ld (max)", caps.minReferenceFrames, caps.maxReferenceFrames);
134
- if (type == H264EncoderType::SVC)
135
- AMF_LOG_INFO(" Temporal Layers: %ld", caps.maxTemporalLayers);
136
- AMF_LOG_INFO(" Features");
137
- AMF_LOG_INFO(" B-Frames: %s", caps.supportsBFrames ? "Supported" : "Not Supported");
138
- AMF_LOG_INFO(" Fixed Slice Mode: %s", caps.supportsFixedSliceMode ? "Supported" : "Not Supported");
139
- AMF_LOG_INFO(" Instancing");
140
- AMF_LOG_INFO(" # of Streams: %ld", caps.maxNumOfStreams);
141
- AMF_LOG_INFO(" # of Instances: %ld", caps.maxNumOfHwInstances);
142
- AMF_LOG_INFO(" Input");
143
- ReportAdapterTypeIOCapabilities(api, adapter, type, false);
144
- AMF_LOG_INFO(" Output");
145
- ReportAdapterTypeIOCapabilities(api, adapter, type, true);
146
-}
147
-
148
-void Plugin::AMD::VCECapabilities::ReportAdapterTypeIOCapabilities(std::shared_ptr<Plugin::API::Base> api, Plugin::API::Adapter adapter, H264EncoderType type, bool output) {
149
- auto amf = Plugin::AMD::AMF::GetInstance();
150
-
151
- auto inst = GetInstance();
152
- VCEDeviceCapabilities::IOCaps ioCaps = output
153
- ? inst->GetAdapterCapabilities(api, adapter, type).output
154
- : inst->GetAdapterCapabilities(api, adapter, type).input;
155
- AMF_LOG_INFO(" Resolution: %ldx%ld - %ldx%ld",
156
- ioCaps.minWidth, ioCaps.minHeight,
157
- ioCaps.maxWidth, ioCaps.maxHeight);
158
- AMF_LOG_INFO(" Vertical Alignment: %ld", ioCaps.verticalAlignment);
159
- AMF_LOG_INFO(" Interlaced: %s", ioCaps.supportsInterlaced ? "Supported" : "Not Supported");
160
- std::stringstream formatstr;
161
- for (auto format : ioCaps.formats) {
162
- std::vector<char> buf(1024);
163
- wcstombs(buf.data(), amf->GetTrace()->SurfaceGetFormatName(format.first), 1024);
164
- formatstr
165
- << buf.data()
166
- << (format.second ? " (Native)" : "")
167
- << ", ";
168
- }
169
- AMF_LOG_INFO(" Formats: %s", formatstr.str().c_str());
170
- std::stringstream memorystr;
171
- for (auto memory : ioCaps.memoryTypes) {
172
- std::vector<char> buf(1024);
173
- wcstombs(buf.data(), amf->GetTrace()->GetMemoryTypeName(memory.first), 1024);
174
- memorystr
175
- << buf.data()
176
- << (memory.second ? " (Native)" : "")
177
- << ", ";
178
- }
179
- AMF_LOG_INFO(" Memory Types: %s", memorystr.str().c_str());
180
-}
181
-
182
-Plugin::AMD::VCECapabilities::VCECapabilities() {
183
- this->Refresh();
184
-}
185
-
186
-Plugin::AMD::VCECapabilities::~VCECapabilities() {}
187
-
188
-static AMF_RESULT GetIOCapability(bool output, amf::AMFCapsPtr amfCaps, Plugin::AMD::VCEDeviceCapabilities::IOCaps* caps) {
189
- AMF_RESULT res = AMF_OK;
190
- amf::AMFIOCapsPtr amfIOCaps;
191
- if (output)
192
- res = amfCaps->GetOutputCaps(&amfIOCaps);
193
- else
194
- res = amfCaps->GetInputCaps(&amfIOCaps);
195
- if (res != AMF_OK)
196
- return res;
197
-
198
- amfIOCaps->GetWidthRange(&(caps->minWidth), &(caps->maxWidth));
199
- amfIOCaps->GetHeightRange(&(caps->minHeight), &(caps->maxHeight));
200
- caps->supportsInterlaced = amfIOCaps->IsInterlacedSupported();
201
obs-studio-18.0.2.tar.xz/plugins/enc-amf/Source/amf-encoder-h264.cpp
Added
201
1
2
+/*
3
+MIT License
4
+
5
+Copyright (c) 2016-2017
6
+
7
+Permission is hereby granted, free of charge, to any person obtaining a copy
8
+of this software and associated documentation files (the "Software"), to deal
9
+in the Software without restriction, including without limitation the rights
10
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+copies of the Software, and to permit persons to whom the Software is
12
+furnished to do so, subject to the following conditions:
13
+
14
+The above copyright notice and this permission notice shall be included in all
15
+copies or substantial portions of the Software.
16
+
17
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+SOFTWARE.
24
+*/
25
+
26
+#include "amf-encoder-h264.h"
27
+#include "utility.h"
28
+#include <inttypes.h>
29
+
30
+#define QUICK_THROW_ERROR(format, ...) {\
31
+ QUICK_FORMAT_MESSAGE(errMsg, __FUNCTION_NAME__ format, \
32
+ m_UniqueId, ##__VA_ARGS__, \
33
+ m_AMF->GetTrace()->GetResultText(res), res); \
34
+ throw std::exception(errMsg.c_str()); \
35
+}
36
+
37
+#define PREFIX "[H264]<Id: %lld> "
38
+
39
+using namespace Plugin;
40
+using namespace Plugin::AMD;
41
+using namespace Utility;
42
+
43
+Plugin::AMD::EncoderH264::EncoderH264(
44
+ std::shared_ptr<API::IAPI> videoAPI, API::Adapter videoAdapter,
45
+ bool useOpenCLSubmission, bool useOpenCLConversion,
46
+ ColorFormat colorFormat, ColorSpace colorSpace, bool fullRangeColor,
47
+ bool useAsyncQueue, size_t asyncQueueSize)
48
+ : Encoder(Codec::AVC,
49
+ videoAPI, videoAdapter,
50
+ useOpenCLSubmission, useOpenCLConversion,
51
+ colorFormat, colorSpace, fullRangeColor,
52
+ useAsyncQueue, asyncQueueSize) {
53
+ AMFTRACECALL;
54
+
55
+ AMF_RESULT res = AMF_UNEXPECTED;
56
+
57
+ /// Full Range Color Stuff
58
+ static const wchar_t* fullColorParams[] = {
59
+ L"FullRangeColor",
60
+ L"NominalRange",
61
+ };
62
+ for (const wchar_t* par : fullColorParams) {
63
+ res = m_AMFConverter->SetProperty(par, m_FullColorRange);
64
+ res = m_AMFEncoder->SetProperty(par, m_FullColorRange);
65
+ if (res == AMF_OK)
66
+ break;
67
+ }
68
+ if (res != AMF_OK) {
69
+ QUICK_FORMAT_MESSAGE(errMsg,
70
+ PREFIX "Failed to set encoder color range, error %ls (code %d)",
71
+ m_UniqueId,
72
+ m_AMF->GetTrace()->GetResultText(res), res);
73
+ throw std::exception(errMsg.c_str());
74
+ }
75
+}
76
+
77
+Plugin::AMD::EncoderH264::~EncoderH264() {
78
+ AMFTRACECALL;
79
+}
80
+
81
+// Properties - Initialization
82
+std::vector<Usage> Plugin::AMD::EncoderH264::CapsUsage() {
83
+ AMFTRACECALL;
84
+
85
+ const amf::AMFPropertyInfo* var;
86
+ AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_USAGE, &var);
87
+ if (res != AMF_OK) {
88
+ QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
89
+ m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
90
+ throw std::exception(errMsg.c_str());
91
+ }
92
+
93
+ std::vector<Usage> ret;
94
+ for (const amf::AMFEnumDescriptionEntry* enm = var->pEnumDescription; enm->name != nullptr; enm++) {
95
+ ret.push_back(Utility::UsageFromAMFH264((AMF_VIDEO_ENCODER_USAGE_ENUM)enm->value));
96
+ }
97
+ return ret;
98
+}
99
+
100
+void Plugin::AMD::EncoderH264::SetUsage(Usage v) {
101
+ AMFTRACECALL;
102
+
103
+ AMF_RESULT res = m_AMFEncoder->SetProperty(AMF_VIDEO_ENCODER_USAGE, Utility::UsageToAMFH264(v));
104
+ if (res != AMF_OK) {
105
+ QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to set to %s, error %ls (code %d)",
106
+ m_UniqueId, Utility::UsageToString(v), m_AMF->GetTrace()->GetResultText(res), res);
107
+ throw std::exception(errMsg.c_str());
108
+ }
109
+}
110
+
111
+Plugin::AMD::Usage Plugin::AMD::EncoderH264::GetUsage() {
112
+ AMFTRACECALL;
113
+
114
+ int64_t e;
115
+
116
+ AMF_RESULT res = m_AMFEncoder->GetProperty(AMF_VIDEO_ENCODER_USAGE, &e);
117
+ if (res != AMF_OK) {
118
+ QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)",
119
+ m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
120
+ throw std::exception(errMsg.c_str());
121
+ }
122
+ return Utility::UsageFromAMFH264((AMF_VIDEO_ENCODER_USAGE_ENUM)e);
123
+}
124
+
125
+// Properties - Static
126
+std::vector<QualityPreset> Plugin::AMD::EncoderH264::CapsQualityPreset() {
127
+ AMFTRACECALL;
128
+
129
+ const amf::AMFPropertyInfo* var;
130
+ AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_QUALITY_PRESET, &var);
131
+ if (res != AMF_OK) {
132
+ QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
133
+ m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
134
+ throw std::exception(errMsg.c_str());
135
+ }
136
+
137
+ std::vector<QualityPreset> ret;
138
+ for (const amf::AMFEnumDescriptionEntry* enm = var->pEnumDescription; enm->name != nullptr; enm++) {
139
+ ret.push_back(Utility::QualityPresetFromAMFH264((AMF_VIDEO_ENCODER_QUALITY_PRESET_ENUM)enm->value));
140
+ }
141
+ return ret;
142
+}
143
+
144
+void Plugin::AMD::EncoderH264::SetQualityPreset(QualityPreset v) {
145
+ AMFTRACECALL;
146
+
147
+ AMF_RESULT res = m_AMFEncoder->SetProperty(AMF_VIDEO_ENCODER_QUALITY_PRESET,
148
+ Utility::QualityPresetToAMFH264(v));
149
+ if (res != AMF_OK) {
150
+ QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to set to %s, error %ls (code %d)",
151
+ m_UniqueId, Utility::QualityPresetToString(v), m_AMF->GetTrace()->GetResultText(res), res);
152
+ throw std::exception(errMsg.c_str());
153
+ }
154
+}
155
+
156
+Plugin::AMD::QualityPreset Plugin::AMD::EncoderH264::GetQualityPreset() {
157
+ AMFTRACECALL;
158
+
159
+ int64_t e;
160
+
161
+ AMF_RESULT res = m_AMFEncoder->GetProperty(AMF_VIDEO_ENCODER_QUALITY_PRESET, &e);
162
+ if (res != AMF_OK) {
163
+ QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)",
164
+ m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
165
+ throw std::exception(errMsg.c_str());
166
+ }
167
+ return Utility::QualityPresetFromAMFH264((AMF_VIDEO_ENCODER_QUALITY_PRESET_ENUM)e);
168
+}
169
+
170
+std::vector<Profile> Plugin::AMD::EncoderH264::CapsProfile() {
171
+ AMFTRACECALL;
172
+
173
+ const amf::AMFPropertyInfo* var;
174
+ AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_PROFILE, &var);
175
+ if (res != AMF_OK) {
176
+ QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
177
+ m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
178
+ throw std::exception(errMsg.c_str());
179
+ }
180
+
181
+ std::vector<Profile> ret;
182
+ for (const amf::AMFEnumDescriptionEntry* enm = var->pEnumDescription; enm->name != nullptr; enm++) {
183
+ ret.push_back(Utility::ProfileFromAMFH264((AMF_VIDEO_ENCODER_PROFILE_ENUM)enm->value));
184
+ }
185
+ return ret;
186
+}
187
+
188
+void Plugin::AMD::EncoderH264::SetProfile(Profile v) {
189
+ AMFTRACECALL;
190
+
191
+ AMF_RESULT res = m_AMFEncoder->SetProperty(AMF_VIDEO_ENCODER_PROFILE,
192
+ Utility::ProfileToAMFH264(v));
193
+ if (res != AMF_OK) {
194
+ QUICK_FORMAT_MESSAGE(errMsg, PREFIX "<" __FUNCTION_NAME__ "> Failed to set to %s, error %ls (code %d)",
195
+ m_UniqueId, Utility::ProfileToString(v), m_AMF->GetTrace()->GetResultText(res), res);
196
+ throw std::exception(errMsg.c_str());
197
+ }
198
+}
199
+
200
+Plugin::AMD::Profile Plugin::AMD::EncoderH264::GetProfile() {
201
obs-studio-18.0.2.tar.xz/plugins/enc-amf/Source/amf-encoder-h265.cpp
Added
201
1
2
+/*
3
+MIT License
4
+
5
+Copyright (c) 2016-2017
6
+
7
+Permission is hereby granted, free of charge, to any person obtaining a copy
8
+of this software and associated documentation files (the "Software"), to deal
9
+in the Software without restriction, including without limitation the rights
10
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+copies of the Software, and to permit persons to whom the Software is
12
+furnished to do so, subject to the following conditions:
13
+
14
+The above copyright notice and this permission notice shall be included in all
15
+copies or substantial portions of the Software.
16
+
17
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+SOFTWARE.
24
+*/
25
+
26
+#include "amf-encoder-h265.h"
27
+#include "utility.h"
28
+#include <inttypes.h>
29
+
30
+#define QUICK_THROW_ERROR(format, ...) {\
31
+ QUICK_FORMAT_MESSAGE(errMsg, __FUNCTION_NAME__ format, \
32
+ m_UniqueId, ##__VA_ARGS__, \
33
+ m_AMF->GetTrace()->GetResultText(res), res); \
34
+ throw std::exception(errMsg.c_str()); \
35
+}
36
+#define PREFIX "[H265]<Id: %lld> "
37
+
38
+using namespace Plugin;
39
+using namespace Plugin::AMD;
40
+using namespace Utility;
41
+
42
+Plugin::AMD::EncoderH265::EncoderH265(
43
+ std::shared_ptr<API::IAPI> videoAPI, API::Adapter videoAdapter,
44
+ bool useOpenCLSubmission, bool useOpenCLConversion,
45
+ ColorFormat colorFormat, ColorSpace colorSpace, bool fullRangeColor,
46
+ bool useAsyncQueue, size_t asyncQueueSize)
47
+ : Encoder(Codec::HEVC,
48
+ videoAPI, videoAdapter,
49
+ useOpenCLSubmission, useOpenCLConversion,
50
+ colorFormat, colorSpace, fullRangeColor,
51
+ useAsyncQueue, asyncQueueSize) {
52
+ AMFTRACECALL;
53
+}
54
+
55
+
56
+Plugin::AMD::EncoderH265::~EncoderH265() {
57
+ AMFTRACECALL;
58
+}
59
+
60
+// Initialization
61
+std::vector<Usage> Plugin::AMD::EncoderH265::CapsUsage() {
62
+ AMFTRACECALL;
63
+
64
+ const amf::AMFPropertyInfo* var;
65
+ AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_HEVC_USAGE, &var);
66
+ if (res != AMF_OK) {
67
+ QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
68
+ m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
69
+ throw std::exception(errMsg.c_str());
70
+ }
71
+
72
+ std::vector<Usage> ret;
73
+ for (const amf::AMFEnumDescriptionEntry* enm = var->pEnumDescription; enm->name != nullptr; enm++) {
74
+ ret.push_back(Utility::UsageFromAMFH265((AMF_VIDEO_ENCODER_HEVC_USAGE_ENUM)enm->value));
75
+ }
76
+ return ret;
77
+}
78
+
79
+void Plugin::AMD::EncoderH265::SetUsage(Usage v) {
80
+ AMFTRACECALL;
81
+
82
+ AMF_RESULT res = m_AMFEncoder->SetProperty(AMF_VIDEO_ENCODER_HEVC_USAGE, Utility::UsageToAMFH265(v));
83
+ if (res != AMF_OK) {
84
+ QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to set to %s, error %ls (code %d)",
85
+ m_UniqueId, Utility::UsageToString(v), m_AMF->GetTrace()->GetResultText(res), res);
86
+ throw std::exception(errMsg.c_str());
87
+ }
88
+}
89
+
90
+Plugin::AMD::Usage Plugin::AMD::EncoderH265::GetUsage() {
91
+ AMFTRACECALL;
92
+
93
+ int64_t e;
94
+
95
+ AMF_RESULT res = m_AMFEncoder->GetProperty(AMF_VIDEO_ENCODER_HEVC_USAGE, &e);
96
+ if (res != AMF_OK) {
97
+ QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)",
98
+ m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
99
+ throw std::exception(errMsg.c_str());
100
+ }
101
+ return Utility::UsageFromAMFH265((AMF_VIDEO_ENCODER_HEVC_USAGE_ENUM)e);
102
+}
103
+
104
+// Static
105
+std::vector<QualityPreset> Plugin::AMD::EncoderH265::CapsQualityPreset() {
106
+ AMFTRACECALL;
107
+
108
+ const amf::AMFPropertyInfo* var;
109
+ AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET, &var);
110
+ if (res != AMF_OK) {
111
+ QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
112
+ m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
113
+ throw std::exception(errMsg.c_str());
114
+ }
115
+
116
+ std::vector<QualityPreset> ret;
117
+ for (const amf::AMFEnumDescriptionEntry* enm = var->pEnumDescription; enm->name != nullptr; enm++) {
118
+ ret.push_back(Utility::QualityPresetFromAMFH265((AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_ENUM)enm->value));
119
+ }
120
+ return ret;
121
+}
122
+
123
+void Plugin::AMD::EncoderH265::SetQualityPreset(QualityPreset v) {
124
+ AMFTRACECALL;
125
+
126
+ AMF_RESULT res = m_AMFEncoder->SetProperty(AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET, Utility::QualityPresetToAMFH265(v));
127
+ if (res != AMF_OK) {
128
+ QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to set to %s, error %ls (code %d)",
129
+ m_UniqueId, Utility::QualityPresetToString(v), m_AMF->GetTrace()->GetResultText(res), res);
130
+ throw std::exception(errMsg.c_str());
131
+ }
132
+}
133
+
134
+Plugin::AMD::QualityPreset Plugin::AMD::EncoderH265::GetQualityPreset() {
135
+ AMFTRACECALL;
136
+
137
+ int64_t e;
138
+
139
+ AMF_RESULT res = m_AMFEncoder->GetProperty(AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET, &e);
140
+ if (res != AMF_OK) {
141
+ QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)",
142
+ m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
143
+ throw std::exception(errMsg.c_str());
144
+ }
145
+ return Utility::QualityPresetFromAMFH265((AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_ENUM)e);
146
+}
147
+
148
+std::pair<std::pair<uint32_t, uint32_t>, std::pair<uint32_t, uint32_t>> Plugin::AMD::EncoderH265::CapsResolution() {
149
+ AMFTRACECALL;
150
+
151
+ const amf::AMFPropertyInfo* var;
152
+ AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(AMF_VIDEO_ENCODER_HEVC_FRAMESIZE, &var);
153
+ if (res != AMF_OK) {
154
+ QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Querying capabilities failed, error %ls (code %d)",
155
+ m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
156
+ throw std::exception(errMsg.c_str());
157
+ }
158
+
159
+ return std::make_pair(
160
+ std::make_pair(var->minValue.sizeValue.width, var->maxValue.sizeValue.width),
161
+ std::make_pair(var->minValue.sizeValue.height, var->maxValue.sizeValue.height)
162
+ );
163
+}
164
+
165
+void Plugin::AMD::EncoderH265::SetResolution(std::pair<uint32_t, uint32_t> v) {
166
+ AMFTRACECALL;
167
+
168
+ AMF_RESULT res = m_AMFEncoder->SetProperty(AMF_VIDEO_ENCODER_HEVC_FRAMESIZE, ::AMFConstructSize(v.first, v.second));
169
+ if (res != AMF_OK) {
170
+ QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to set to %ldx%ld, error %ls (code %d)",
171
+ m_UniqueId, v.first, v.second, m_AMF->GetTrace()->GetResultText(res), res);
172
+ throw std::exception(errMsg.c_str());
173
+ }
174
+ m_Resolution.first = v.first;
175
+ m_Resolution.second = v.second;
176
+}
177
+
178
+std::pair<uint32_t, uint32_t> Plugin::AMD::EncoderH265::GetResolution() {
179
+ AMFTRACECALL;
180
+
181
+ AMFSize e;
182
+
183
+ AMF_RESULT res = m_AMFEncoder->GetProperty(AMF_VIDEO_ENCODER_HEVC_FRAMESIZE, &e);
184
+ if (res != AMF_OK) {
185
+ QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to retrieve value, error %ls (code %d)",
186
+ m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
187
+ throw std::exception(errMsg.c_str());
188
+ }
189
+ m_Resolution.first = e.width;
190
+ m_Resolution.second = e.height;
191
+ return std::make_pair(e.width, e.height);
192
+}
193
+
194
+void Plugin::AMD::EncoderH265::SetAspectRatio(std::pair<uint32_t, uint32_t> v) {
195
+ AMFTRACECALL;
196
+
197
+ AMF_RESULT res = m_AMFEncoder->SetProperty(AMF_VIDEO_ENCODER_HEVC_ASPECT_RATIO, ::AMFConstructRatio(v.first, v.second));
198
+ if (res != AMF_OK) {
199
+ QUICK_FORMAT_MESSAGE(errMsg, "<Id: %lld> <" __FUNCTION_NAME__ "> Failed to set to %ld:%ld, error %ls (code %d)",
200
+ m_UniqueId, v.first, v.second, m_AMF->GetTrace()->GetResultText(res), res);
201
obs-studio-18.0.2.tar.xz/plugins/enc-amf/Source/amf-encoder.cpp
Added
201
1
2
+/*
3
+MIT License
4
+
5
+Copyright (c) 2016-2017
6
+
7
+Permission is hereby granted, free of charge, to any person obtaining a copy
8
+of this software and associated documentation files (the "Software"), to deal
9
+in the Software without restriction, including without limitation the rights
10
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+copies of the Software, and to permit persons to whom the Software is
12
+furnished to do so, subject to the following conditions:
13
+
14
+The above copyright notice and this permission notice shall be included in all
15
+copies or substantial portions of the Software.
16
+
17
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+SOFTWARE.
24
+*/
25
+
26
+#include "amf-encoder.h"
27
+#include "utility.h"
28
+#include "components/VideoConverter.h"
29
+#ifdef WITH_AVC
30
+#include "components/VideoEncoderVCE.h"
31
+#endif
32
+#ifdef WITH_HEVC
33
+#include "components/VideoEncoderHEVC.h"
34
+#endif
35
+#include <thread>
36
+#include "libobs/util/threading.h"
37
+
38
+using namespace Plugin;
39
+using namespace Plugin::AMD;
40
+
41
+Plugin::AMD::Encoder::Encoder(Codec codec,
42
+ std::shared_ptr<API::IAPI> videoAPI, API::Adapter videoAdapter,
43
+ bool useOpenCLSubmission, bool useOpenCLConversion,
44
+ ColorFormat colorFormat, ColorSpace colorSpace, bool fullRangeColor,
45
+ bool useAsyncQueue, size_t asyncQueueSize) {
46
+ #pragma region Null Values
47
+ m_UniqueId = Utility::GetUniqueIdentifier();
48
+ /// AMF Internals
49
+ m_AMF = nullptr;
50
+ m_AMFFactory = nullptr;
51
+ m_AMFContext = nullptr;
52
+ m_AMFEncoder = nullptr;
53
+ m_AMFConverter = nullptr;
54
+ m_AMFMemoryType = amf::AMF_MEMORY_UNKNOWN;
55
+ m_AMFSurfaceFormat = Utility::ColorFormatToAMF(colorFormat);
56
+ /// API Related
57
+ m_API = nullptr;
58
+ m_APIDevice = nullptr;
59
+ m_OpenCLSubmission = false;
60
+ /// Properties
61
+ m_Codec = codec;
62
+ m_ColorFormat = colorFormat;
63
+ m_ColorSpace = colorSpace;
64
+ m_FullColorRange = fullRangeColor;
65
+ m_Resolution = std::make_pair<uint32_t, uint32_t>(0, 0);
66
+ m_FrameRate = std::make_pair<uint32_t, uint32_t>(0, 0);
67
+ m_TimestampStep = 0;
68
+ m_TimestampStepRounded = 0;
69
+ m_TimestampOffset = 0;
70
+ /// Flags
71
+ m_Initialized = true;
72
+ m_Started = false;
73
+ m_OpenCL = false;
74
+ m_OpenCLSubmission = useOpenCLSubmission;
75
+ m_OpenCLConversion = useOpenCLConversion;
76
+ m_HaveFirstFrame = false;
77
+ m_AsyncQueue = useAsyncQueue;
78
+ m_AsyncQueueSize = asyncQueueSize;
79
+ #pragma endregion Null Values
80
+
81
+ // Initialize selected API on Video Adapter
82
+ m_API = videoAPI;
83
+ m_APIAdapter = videoAdapter;
84
+ m_APIDevice = m_API->CreateInstance(m_APIAdapter);
85
+
86
+ // Initialize Advanced Media Framework
87
+ m_AMF = AMF::Instance();
88
+ /// Retrieve Factory
89
+ m_AMFFactory = m_AMF->GetFactory();
90
+
91
+ // Create Context for Conversion and Encoding
92
+ AMF_RESULT res = m_AMFFactory->CreateContext(&m_AMFContext);
93
+ if (res != AMF_OK) {
94
+ QUICK_FORMAT_MESSAGE(errMsg,
95
+ "<Id: %lld> Creating a AMF Context failed, error %ls (code %d).",
96
+ m_UniqueId, m_AMF->GetTrace()->GetResultText(res), res);
97
+ throw std::exception(errMsg.c_str());
98
+ }
99
+ /// Initialize Context using selected API
100
+ switch (m_API->GetType()) {
101
+ case API::Type::Direct3D11:
102
+ case API::Type::Direct3D9:
103
+ break;
104
+ default:
105
+ m_API = API::GetAPI(0);
106
+ switch (m_API->GetType()) {
107
+ case API::Type::Direct3D9:
108
+ m_APIAdapter = m_API->EnumerateAdapters()[0];
109
+ m_APIDevice = m_API->CreateInstance(m_APIAdapter);
110
+ break;
111
+ case API::Type::Direct3D11:
112
+ m_APIAdapter = m_API->EnumerateAdapters()[0];
113
+ m_APIDevice = m_API->CreateInstance(m_APIAdapter);
114
+ break;
115
+ }
116
+ }
117
+ switch (m_API->GetType()) {
118
+ case API::Type::Direct3D9:
119
+ m_AMFMemoryType = amf::AMF_MEMORY_DX9;
120
+ res = m_AMFContext->InitDX9(m_APIDevice->GetContext());
121
+ break;
122
+ case API::Type::Direct3D11:
123
+ m_AMFMemoryType = amf::AMF_MEMORY_DX11;
124
+ res = m_AMFContext->InitDX11(m_APIDevice->GetContext());
125
+ break;
126
+ }
127
+ if (res != AMF_OK) {
128
+ QUICK_FORMAT_MESSAGE(errMsg,
129
+ "<Id: %lld> Initializing %s API with Adapter '%s' failed, error %ls (code %d).",
130
+ m_UniqueId,
131
+ m_API->GetName().c_str(), m_APIAdapter.Name.c_str(),
132
+ m_AMF->GetTrace()->GetResultText(res), res);
133
+ throw std::exception(errMsg.c_str());
134
+ }
135
+
136
+ // Initialize OpenCL (if possible)
137
+ if (m_OpenCLSubmission || m_OpenCLConversion) {
138
+ res = m_AMFContext->InitOpenCL();
139
+ if (res == AMF_OK) {
140
+ m_OpenCL = true;
141
+
142
+ res = m_AMFContext->GetCompute(amf::AMF_MEMORY_OPENCL, &m_AMFCompute);
143
+ if (res != AMF_OK) {
144
+ m_OpenCLSubmission = false;
145
+ m_OpenCLConversion = false;
146
+
147
+ QUICK_FORMAT_MESSAGE(errMsg,
148
+ "<Id: %lld> Retrieving Compute object failed, error %ls (code %d)",
149
+ m_UniqueId,
150
+ m_AMF->GetTrace()->GetResultText(res), res);
151
+ PLOG_WARNING("%s", errMsg.data());
152
+ }
153
+ } else {
154
+ m_OpenCL = false;
155
+ m_OpenCLSubmission = false;
156
+ m_OpenCLConversion = false;
157
+
158
+ QUICK_FORMAT_MESSAGE(errMsg,
159
+ "<Id: %lld> Initialising OpenCL failed, error %ls (code %d)",
160
+ m_UniqueId,
161
+ m_AMF->GetTrace()->GetResultText(res), res);
162
+ PLOG_WARNING("%s", errMsg.data());
163
+ }
164
+ }
165
+
166
+ // Create Converter
167
+ res = m_AMFFactory->CreateComponent(m_AMFContext, AMFVideoConverter, &m_AMFConverter);
168
+ if (res != AMF_OK) {
169
+ QUICK_FORMAT_MESSAGE(errMsg,
170
+ "<Id: %lld> Creating frame converter component failed, error %ls (code %d)",
171
+ m_UniqueId,
172
+ m_AMF->GetTrace()->GetResultText(res), res);
173
+ throw std::exception(errMsg.c_str());
174
+ }
175
+ res = m_AMFConverter->SetProperty(AMF_VIDEO_CONVERTER_MEMORY_TYPE, amf::AMF_MEMORY_UNKNOWN);
176
+ if (res != AMF_OK) {
177
+ QUICK_FORMAT_MESSAGE(errMsg,
178
+ "<Id: %lld> Unable to set converter memory type, error %ls (code %d)",
179
+ m_UniqueId,
180
+ m_AMF->GetTrace()->GetResultText(res), res);
181
+ throw std::exception(errMsg.c_str());
182
+ }
183
+ res = m_AMFConverter->SetProperty(AMF_VIDEO_CONVERTER_OUTPUT_FORMAT, amf::AMF_SURFACE_NV12);
184
+ if (res != AMF_OK) {
185
+ QUICK_FORMAT_MESSAGE(errMsg,
186
+ "<Id: %lld> Unable to set converter output format, error %ls (code %d)",
187
+ m_UniqueId,
188
+ m_AMF->GetTrace()->GetResultText(res), res);
189
+ throw std::exception(errMsg.c_str());
190
+ }
191
+ res = m_AMFConverter->SetProperty(AMF_VIDEO_CONVERTER_COLOR_PROFILE, Utility::ColorSpaceToAMFConverter(m_ColorSpace));
192
+ if (res != AMF_OK) {
193
+ QUICK_FORMAT_MESSAGE(errMsg,
194
+ "<Id: %lld> Unable to set convertor color profile, error %ls (code %d)",
195
+ m_UniqueId,
196
+ m_AMF->GetTrace()->GetResultText(res), res);
197
+ throw std::exception(errMsg.c_str());
198
+ }
199
+
200
+ // Create Encoder
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Source/amf.cpp -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Source/amf.cpp
Changed
201
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
class CustomWriter : public amf::AMFTraceWriter {
12
public:
13
14
- virtual void Write(const wchar_t* scope, const wchar_t* message) override {
15
+ virtual void __cdecl Write(const wchar_t* scope, const wchar_t* message) override {
16
const wchar_t* realmsg = &(message[(33 + wcslen(scope) + 2)]); // Skip Time & Scope
17
- int msgLen = (int)wcslen(realmsg) - (sizeof(wchar_t));
18
+ size_t msgLen = wcslen(realmsg) - (sizeof(wchar_t));
19
20
- blog(LOG_INFO, "[AMF Encoder] [%.*ls][%ls] %.*ls",
21
+ blog(LOG_DEBUG, "[AMF Runtime] [%.*ls][%ls] %.*ls",
22
12, &(message[11]),
23
scope,
24
msgLen, realmsg);
25
}
26
27
- virtual void Flush() override {}
28
+ virtual void __cdecl Flush() override {}
29
};
30
31
-std::shared_ptr<Plugin::AMD::AMF> Plugin::AMD::AMF::GetInstance() {
32
- static std::shared_ptr<AMF> __instance = std::make_shared<AMF>();
33
- static std::mutex __mutex;
34
+#pragma region Singleton
35
+static AMF* __instance;
36
+static std::mutex __instance_mutex;
37
+void Plugin::AMD::AMF::Initialize() {
38
+ const std::lock_guard<std::mutex> lock(__instance_mutex);
39
+ if (!__instance)
40
+ __instance = new AMF();
41
+}
42
43
- const std::lock_guard<std::mutex> lock(__mutex);
44
+AMF* Plugin::AMD::AMF::Instance() {
45
+ const std::lock_guard<std::mutex> lock(__instance_mutex);
46
return __instance;
47
}
48
49
+void Plugin::AMD::AMF::Finalize() {
50
+ const std::lock_guard<std::mutex> lock(__instance_mutex);
51
+ if (__instance)
52
+ delete __instance;
53
+ __instance = nullptr;
54
+}
55
+#pragma endregion Singleton
56
+
57
Plugin::AMD::AMF::AMF() {
58
AMF_RESULT res = AMF_OK;
59
60
- // Initialize AMF Library
61
- AMF_LOG_DEBUG("<" __FUNCTION_NAME__ "> Initializing...");
62
-
63
#pragma region Null Class Members
64
m_TimerPeriod = 0;
65
- m_AMFVersion_Compiler = 0;
66
+ m_AMFVersion_Plugin = AMF_FULL_VERSION;
67
m_AMFVersion_Runtime = 0;
68
m_AMFModule = 0;
69
70
71
AMFInit = nullptr;
72
#pragma endregion Null Class Members
73
74
- /// Load AMF Runtime into Memory.
75
+ #ifdef _WIN32
76
+ std::vector<char> verbuf;
77
+ void* pProductVersion = nullptr;
78
+ uint32_t lProductVersionSize = 0;
79
+ #endif
80
+
81
+ // Initialize AMF Library
82
+ PLOG_DEBUG("<" __FUNCTION_NAME__ "> Initializing...");
83
+
84
+ // Load AMF Runtime Library
85
m_AMFModule = LoadLibraryW(AMF_DLL_NAME);
86
if (!m_AMFModule) {
87
- DWORD error = GetLastError();
88
- std::vector<char> buf(1024);
89
- sprintf(buf.data(), "Unable to load '%ls', error code %ld.", AMF_DLL_NAME, error);
90
- throw std::exception(buf.data());
91
+ QUICK_FORMAT_MESSAGE(msg, "Unable to load '%ls', error code %ld.",
92
+ AMF_DLL_NAME,
93
+ GetLastError());
94
+ throw std::exception(msg.data());
95
+ } else {
96
+ PLOG_DEBUG("<" __FUNCTION_NAME__ "> Loaded '%ls'.", AMF_DLL_NAME);
97
}
98
- AMF_LOG_DEBUG("<" __FUNCTION_NAME__ "> Loaded '%ls'.", AMF_DLL_NAME);
99
- #ifdef _WIN32 // Windows: Get Product Version
100
- void* pProductVersion = "unknown";
101
- uint32_t lProductVersionSize = 7;
102
- std::vector<char> verbuf(GetFileVersionInfoSizeW(AMF_DLL_NAME, nullptr));
103
- if (GetFileVersionInfoW(AMF_DLL_NAME, 0, (DWORD)verbuf.size(), verbuf.data())) {
104
+
105
+ // Windows: Get Product Version for Driver Matching
106
+ #ifdef _WIN32
107
+ {
108
+ verbuf.resize(GetFileVersionInfoSizeW(AMF_DLL_NAME, nullptr) * 2);
109
+ GetFileVersionInfoW(AMF_DLL_NAME, 0, (DWORD)verbuf.size(), verbuf.data());
110
111
void* pBlock = verbuf.data();
112
113
114
} *lpTranslate;
115
UINT cbTranslate = sizeof(LANGANDCODEPAGE);
116
117
- if (VerQueryValueA(pBlock, "\\VarFileInfo\\Translation", (LPVOID*)&lpTranslate, &cbTranslate)) {
118
+ VerQueryValueA(pBlock, "\\VarFileInfo\\Translation", (LPVOID*)&lpTranslate, &cbTranslate);
119
120
- std::vector<char> buf(1024);
121
- sprintf(buf.data(), "%s%04x%04x%s",
122
- "\\StringFileInfo\\",
123
- lpTranslate[0].wLanguage,
124
- lpTranslate[0].wCodePage,
125
- "\\ProductVersion");
126
-
127
- // Retrieve file description for language and code page "i".
128
- VerQueryValueA(pBlock, buf.data(), &pProductVersion, &lProductVersionSize);
129
- }
130
+ std::vector<char> buf(1024);
131
+ snprintf(buf.data(), buf.size(), "%s%04x%04x%s",
132
+ "\\StringFileInfo\\",
133
+ lpTranslate[0].wLanguage,
134
+ lpTranslate[0].wCodePage,
135
+ "\\ProductVersion");
136
+
137
+ // Retrieve file description for language and code page "i".
138
+ VerQueryValueA(pBlock, buf.data(), &pProductVersion, &lProductVersionSize);
139
}
140
- #endif _WIN32 // Windows: Get Product Version
141
+ #endif _WIN32
142
143
- /// Find Function for Querying AMF Version.
144
- #pragma region Query AMF Runtime Version
145
+ // Query Runtime Version
146
AMFQueryVersion = (AMFQueryVersion_Fn)GetProcAddress(m_AMFModule, AMF_QUERY_VERSION_FUNCTION_NAME);
147
if (!AMFQueryVersion) {
148
- DWORD error = GetLastError();
149
- std::vector<char> buf(1024);
150
- sprintf(buf.data(), "<" __FUNCTION_NAME__ "> Finding Address of Function '%s' failed with error code %ld.", AMF_QUERY_VERSION_FUNCTION_NAME, error);
151
- throw std::exception(buf.data());
152
+ QUICK_FORMAT_MESSAGE(msg, "Incompatible AMF Runtime (could not find '%s'), error code %ld.",
153
+ AMF_QUERY_VERSION_FUNCTION_NAME,
154
+ GetLastError());
155
+ throw std::exception(msg.data());
156
+ } else {
157
+ res = AMFQueryVersion(&m_AMFVersion_Runtime);
158
+ if (res != AMF_OK) {
159
+ QUICK_FORMAT_MESSAGE(msg, "Querying Version failed, error code %ld.",
160
+ res);
161
+ throw std::exception(msg.data());
162
+ }
163
}
164
- /// Query Runtime Version
165
- m_AMFVersion_Compiler = AMF_FULL_VERSION;
166
- res = AMFQueryVersion(&m_AMFVersion_Runtime);
167
- if (res != AMF_OK)
168
- ThrowException("<" __FUNCTION_NAME__ "> Querying Version failed with error code %ld.", res);
169
- #pragma endregion Query AMF Runtime Version
170
-
171
- /// Find Function for Initializing AMF.
172
+
173
+ /// Initialize AMF
174
AMFInit = (AMFInit_Fn)GetProcAddress(m_AMFModule, AMF_INIT_FUNCTION_NAME);
175
if (!AMFInit) {
176
- DWORD error = GetLastError();
177
- std::vector<char> buf(1024);
178
- sprintf(buf.data(), "<" __FUNCTION_NAME__ "> Finding Address of Function '%s' failed with error code %ld.", AMF_INIT_FUNCTION_NAME, error);
179
- throw std::exception(buf.data(), error);
180
+ QUICK_FORMAT_MESSAGE(msg, "Incompatible AMF Runtime (could not find '%s'), error code %ld.",
181
+ AMF_QUERY_VERSION_FUNCTION_NAME,
182
+ GetLastError());
183
+ throw std::exception(msg.data());
184
} else {
185
res = AMFInit(m_AMFVersion_Runtime, &m_AMFFactory);
186
- if (res != AMF_OK)
187
- ThrowException("<" __FUNCTION_NAME__ "> Initializing AMF Library failed with error code %ld.", res);
188
+ if (res != AMF_OK) {
189
+ QUICK_FORMAT_MESSAGE(msg, "Initializing AMF Library failed, error code %ld.",
190
+ res);
191
+ throw std::exception(msg.data());
192
+ }
193
}
194
- AMF_LOG_DEBUG("<" __FUNCTION_NAME__ "> AMF Library initialized.");
195
+ PLOG_DEBUG("<" __FUNCTION_NAME__ "> AMF Library initialized.");
196
197
/// Retrieve Trace Object.
198
res = m_AMFFactory->GetTrace(&m_AMFTrace);
199
if (res != AMF_OK) {
200
- ThrowException("<" __FUNCTION_NAME__ "> Retrieving Trace object failed with error code %ld.", res);
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Source/api-base.cpp -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Source/api-base.cpp
Changed
167
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
*/
12
13
#pragma once
14
-//////////////////////////////////////////////////////////////////////////
15
-// Includes
16
-//////////////////////////////////////////////////////////////////////////
17
#include "api-base.h"
18
-
19
#include "api-d3d9.h"
20
#include "api-d3d11.h"
21
#include "api-host.h"
22
23
#include <VersionHelpers.h>
24
#endif
25
26
-//////////////////////////////////////////////////////////////////////////
27
-// Code
28
-//////////////////////////////////////////////////////////////////////////
29
using namespace Plugin::API;
30
31
+
32
+// An Adapter on an API
33
bool Plugin::API::operator<(const Plugin::API::Adapter & left, const Plugin::API::Adapter & right) {
34
if (left == right)
35
return left.Name < right.Name;
36
37
return !(left == right);
38
}
39
40
-//////////////////////////////////////////////////////////////////////////
41
-// API Index
42
-//////////////////////////////////////////////////////////////////////////
43
-static std::vector<std::shared_ptr<Base>> s_APIInstances;
44
+// Instance of an API Adapter
45
+Plugin::API::Instance::Instance() {}
46
+
47
+Plugin::API::Instance::~Instance() {}
48
+
49
+// API Interface
50
+Plugin::API::IAPI::IAPI() {}
51
+
52
+Plugin::API::IAPI::~IAPI() {}
53
+
54
+Plugin::API::Adapter Plugin::API::IAPI::GetAdapterById(int32_t idLow, int32_t idHigh) {
55
+ for (auto adapter : EnumerateAdapters()) {
56
+ if ((adapter.idLow == idLow) && (adapter.idHigh == idHigh))
57
+ return adapter;
58
+ }
59
+ return *(EnumerateAdapters().begin());
60
+}
61
62
-void Plugin::API::Base::Initialize() {
63
+Plugin::API::Adapter Plugin::API::IAPI::GetAdapterByName(std::string name) {
64
+ for (auto adapter : EnumerateAdapters()) {
65
+ if (adapter.Name == name)
66
+ return adapter;
67
+ }
68
+ return *(EnumerateAdapters().begin());
69
+}
70
+
71
+// Static API Stuff
72
+static std::vector<std::shared_ptr<IAPI>> s_APIInstances;
73
+void Plugin::API::InitializeAPIs() {
74
// DirectX 11
75
#ifdef _WIN32
76
if (IsWindows8OrGreater()) {
77
78
}
79
#endif
80
81
- // OpenGL
82
- {
83
- s_APIInstances.insert(s_APIInstances.end(), std::make_shared<OpenGL>());
84
- }
85
+ // Mikhail says these are for compatibility only, not actually backends.
86
+ //// OpenGL
87
+ //{
88
+ // s_APIInstances.insert(s_APIInstances.end(), std::make_shared<OpenGL>());
89
+ //}
90
91
- // Host
92
- {
93
- s_APIInstances.insert(s_APIInstances.end(), std::make_shared<Host>());
94
- }
95
+ //// Host
96
+ //{
97
+ // s_APIInstances.insert(s_APIInstances.end(), std::make_shared<Host>());
98
+ //}
99
+}
100
+
101
+void Plugin::API::FinalizeAPIs() {
102
+ s_APIInstances.clear();
103
}
104
105
-size_t Plugin::API::Base::GetAPICount() {
106
+size_t Plugin::API::CountAPIs() {
107
return s_APIInstances.size();
108
}
109
110
-std::shared_ptr<Base> Plugin::API::Base::GetAPIInstance(size_t index) {
111
+std::string Plugin::API::GetAPIName(size_t index) {
112
auto indAPI = s_APIInstances.begin();
113
- for (size_t n = 0; n < index; n++)
114
- indAPI++;
115
+ indAPI + index; // Advanced by x elements.
116
117
if (indAPI == s_APIInstances.end())
118
throw std::exception("Invalid API Index");
119
120
- return *indAPI;
121
+ return indAPI->get()->GetName();
122
}
123
124
-std::string Plugin::API::Base::GetAPIName(size_t index) {
125
+std::shared_ptr<IAPI> Plugin::API::GetAPI(size_t index) {
126
auto indAPI = s_APIInstances.begin();
127
indAPI + index; // Advanced by x elements.
128
129
if (indAPI == s_APIInstances.end())
130
throw std::exception("Invalid API Index");
131
132
- return indAPI->get()->GetName();
133
+ return *indAPI;
134
}
135
136
-
137
-std::shared_ptr<Base> Plugin::API::Base::GetAPIByName(std::string name) {
138
+std::shared_ptr<IAPI> Plugin::API::GetAPI(std::string name) {
139
for (auto api : s_APIInstances) {
140
if (name == api->GetName()) {
141
return api;
142
143
return *s_APIInstances.begin();
144
}
145
146
-std::vector<std::shared_ptr<Base>> Plugin::API::Base::EnumerateAPIs() {
147
- return std::vector<std::shared_ptr<Base>>(s_APIInstances);
148
+std::shared_ptr<IAPI> Plugin::API::GetAPI(Type type) {
149
+ for (auto api : s_APIInstances) {
150
+ if (type == api->GetType()) {
151
+ return api;
152
+ }
153
+ }
154
+ // If none was found, return the first one.
155
+ return *s_APIInstances.begin();
156
+}
157
+
158
+std::vector<std::shared_ptr<IAPI>> Plugin::API::EnumerateAPIs() {
159
+ return std::vector<std::shared_ptr<IAPI>>(s_APIInstances);
160
}
161
162
-std::vector<std::string> Plugin::API::Base::EnumerateAPINames() {
163
+std::vector<std::string> Plugin::API::EnumerateAPINames() {
164
std::vector<std::string> names;
165
for (auto api : s_APIInstances) {
166
names.push_back(api->GetName());
167
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Source/api-d3d11.cpp -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Source/api-d3d11.cpp
Changed
201
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
SOFTWARE.
12
*/
13
14
-//////////////////////////////////////////////////////////////////////////
15
-// Includes
16
-//////////////////////////////////////////////////////////////////////////
17
#include "api-d3d11.h"
18
-
19
-#include <vector>
20
-#include <string>
21
#include <sstream>
22
#include <stdlib.h>
23
#include <mutex>
24
25
-#include <dxgi.h>
26
-#include <d3d11.h>
27
-#include <atlutil.h>
28
-
29
-//////////////////////////////////////////////////////////////////////////
30
-// Code
31
-//////////////////////////////////////////////////////////////////////////
32
using namespace Plugin::API;
33
34
class SingletonDXGI {
35
36
HMODULE hModule;
37
};
38
39
-std::string Plugin::API::Direct3D11::GetName() {
40
- return std::string("Direct3D 11");
41
-}
42
-
43
-std::vector<Adapter> Plugin::API::Direct3D11::EnumerateAdapters() {
44
+Plugin::API::Direct3D11::Direct3D11() {
45
auto dxgiInst = SingletonDXGI::GetInstance();
46
-
47
- ATL::CComPtr<IDXGIFactory1> dxgiFactory;
48
- HRESULT hr = dxgiInst->CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&dxgiFactory);
49
+ HRESULT hr = dxgiInst->CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&m_DXGIFactory);
50
if (FAILED(hr))
51
- throw std::exception("<" __FUNCTION_NAME__ "> Failed to enumerate adapters, error code %X.", hr);
52
+ throw std::exception("<" __FUNCTION_NAME__ "> Unable to create DXGI, error code %X.", hr);
53
54
- std::vector<Adapter> adapters;
55
+ // Enumerate Adapters
56
IDXGIAdapter1* dxgiAdapter = nullptr;
57
for (size_t adapterIndex = 0;
58
- !FAILED(dxgiFactory->EnumAdapters1((UINT)adapterIndex, &dxgiAdapter));
59
+ !FAILED(m_DXGIFactory->EnumAdapters1((UINT)adapterIndex, &dxgiAdapter));
60
adapterIndex++) {
61
DXGI_ADAPTER_DESC1 desc = DXGI_ADAPTER_DESC1();
62
dxgiAdapter->GetDesc1(&desc);
63
64
if (desc.VendorId != 0x1002 /* AMD */)
65
continue;
66
67
- std::vector<char> descBuf(256);
68
- wcstombs(descBuf.data(), desc.Description, descBuf.size());
69
- adapters.push_back(Adapter(
70
+ std::vector<char> buf(1024);
71
+ snprintf(buf.data(), buf.size(), "%ls (VEN_%04x/DEV_%04x/SUB_%04x/REV_%04x)",
72
+ desc.Description,
73
+ desc.VendorId,
74
+ desc.DeviceId,
75
+ desc.SubSysId,
76
+ desc.Revision);
77
+
78
+ m_AdapterList.emplace_back(
79
desc.AdapterLuid.LowPart,
80
desc.AdapterLuid.HighPart,
81
- std::string(descBuf.data())
82
- ));
83
+ std::string(buf.data())
84
+ );
85
}
86
+}
87
88
- return adapters;
89
+Plugin::API::Direct3D11::~Direct3D11() {
90
}
91
92
-Plugin::API::Adapter Plugin::API::Direct3D11::GetAdapterById(uint32_t idLow, uint32_t idHigh) {
93
- for (auto adapter : EnumerateAdapters()) {
94
- if ((adapter.idLow == idLow) && (adapter.idHigh == idHigh))
95
- return adapter;
96
- }
97
- return *(EnumerateAdapters().begin());
98
+std::string Plugin::API::Direct3D11::GetName() {
99
+ return std::string("Direct3D 11");
100
}
101
102
-Plugin::API::Adapter Plugin::API::Direct3D11::GetAdapterByName(std::string name) {
103
- for (auto adapter : EnumerateAdapters()) {
104
- if (adapter.Name == name)
105
- return adapter;
106
- }
107
- return *(EnumerateAdapters().begin());
108
+std::vector<Adapter> Plugin::API::Direct3D11::EnumerateAdapters() {
109
+ // We shouldn't expect HW to change during Runtime, at least not in a normal System.
110
+ return m_AdapterList;
111
}
112
113
-struct Direct3D11Instance {
114
- ATL::CComPtr<IDXGIFactory1> factory;
115
- ATL::CComPtr<ID3D11Device> device;
116
- ATL::CComPtr<ID3D11DeviceContext> context;
117
-};
118
+std::shared_ptr<Instance> Plugin::API::Direct3D11::CreateInstance(Adapter adapter) {
119
+ //std::lock_guard<std::mutex> lock(m_InstanceMapMutex);
120
+ //std::pair<int32_t, int32_t> key = std::make_pair(adapter.idLow, adapter.idHigh);
121
+ //auto inst = m_InstanceMap.find(key);
122
+ //if (inst != m_InstanceMap.end())
123
+ // return inst->second;
124
125
-void* Plugin::API::Direct3D11::CreateInstanceOnAdapter(Adapter adapter) {
126
- HRESULT hr;
127
+ auto inst2 = std::make_shared<Direct3D11Instance>(this, adapter);
128
+ //m_InstanceMap.insert_or_assign(key, inst2);
129
+ return inst2;
130
+}
131
132
- auto dxgiInst = SingletonDXGI::GetInstance();
133
+Plugin::API::Type Plugin::API::Direct3D11::GetType() {
134
+ return Type::Direct3D11;
135
+}
136
137
- ATL::CComPtr<IDXGIFactory1> dxgiFactory;
138
- hr = dxgiInst->CreateDXGIFactory1(__uuidof(IDXGIFactory1), (void**)&dxgiFactory);
139
- if (FAILED(hr)) {
140
- std::vector<char> buf(1024);
141
- std::sprintf(buf.data(), "<" __FUNCTION_NAME__ "> Failed to enumerate adapters, error code %X.", hr);
142
- throw std::exception(buf.data());
143
- }
144
+Plugin::API::Direct3D11Instance::Direct3D11Instance(Direct3D11* api, Adapter adapter) {
145
+ m_API = api;
146
+ m_Adapter = adapter;
147
+ m_Device = nullptr;
148
+ m_DeviceContext = nullptr;
149
150
LUID adapterLUID;
151
adapterLUID.LowPart = adapter.idLow;
152
adapterLUID.HighPart = adapter.idHigh;
153
154
+ HRESULT hr = E_FAIL;
155
ATL::CComPtr<IDXGIAdapter> dxgiAdapter;
156
for (size_t adapterIndex = 0;
157
- !FAILED(dxgiFactory->EnumAdapters((UINT)adapterIndex, &dxgiAdapter));
158
+ !FAILED(api->m_DXGIFactory->EnumAdapters((UINT)adapterIndex, &dxgiAdapter));
159
adapterIndex++) {
160
DXGI_ADAPTER_DESC desc = DXGI_ADAPTER_DESC();
161
dxgiAdapter->GetDesc(&desc);
162
163
D3D_FEATURE_LEVEL_11_1,
164
D3D_FEATURE_LEVEL_11_0
165
};
166
- ID3D11Device* d3dDevice;
167
- ID3D11DeviceContext* d3dContext;
168
for (size_t c = 0; c < 3; c++) {
169
uint32_t flags = 0;
170
171
172
flags,
173
featureLevels + 1, _countof(featureLevels) - 1,
174
D3D11_SDK_VERSION,
175
- &d3dDevice,
176
+ &m_Device,
177
NULL,
178
- &d3dContext);
179
+ &m_DeviceContext);
180
if (SUCCEEDED(hr)) {
181
break;
182
} else {
183
- AMF_LOG_WARNING("<" __FUNCTION_NAME__ "> Unable to create D3D11 device, error code %X (mode %Iu).", hr, c);
184
+ PLOG_WARNING("<" __FUNCTION_NAME__ "> Unable to create D3D11 device, error code %X (mode %d).", hr, c);
185
}
186
}
187
if (FAILED(hr)) {
188
std::vector<char> buf(1024);
189
- std::sprintf(buf.data(), "<" __FUNCTION_NAME__ "> Unable to create D3D11 device, error code %X.", hr);
190
- throw std::exception(buf.data());
191
- }
192
-
193
- Direct3D11Instance* instance = new Direct3D11Instance();
194
- instance->factory = dxgiFactory;
195
- instance->device = d3dDevice;
196
- instance->context = d3dContext;
197
- return instance;
198
-}
199
-
200
-Plugin::API::Adapter Plugin::API::Direct3D11::GetAdapterForInstance(void* pInstance) {
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Source/api-d3d9.cpp -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Source/api-d3d9.cpp
Changed
201
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
SOFTWARE.
12
*/
13
14
-//////////////////////////////////////////////////////////////////////////
15
-// Includes
16
-//////////////////////////////////////////////////////////////////////////
17
#include "api-d3d9.h"
18
-
19
#include <mutex>
20
#include <list>
21
22
-#ifdef _DEBUG
23
-#define D3D_DEBUG_INFO
24
-#endif
25
-#pragma comment(lib, "d3d9.lib")
26
-#include <d3d9.h>
27
-#include <atlutil.h>
28
-
29
-//////////////////////////////////////////////////////////////////////////
30
-// Code
31
-//////////////////////////////////////////////////////////////////////////
32
using namespace Plugin::API;
33
34
-std::string Plugin::API::Direct3D9::GetName() {
35
- return std::string("Direct3D 9");
36
-}
37
-
38
-std::vector<Adapter> Plugin::API::Direct3D9::EnumerateAdapters() {
39
- ATL::CComPtr<IDirect3D9Ex> pD3DEx;
40
- HRESULT hr = Direct3DCreate9Ex(D3D_SDK_VERSION, &pD3DEx);
41
+Plugin::API::Direct3D9::Direct3D9() {
42
+ HRESULT hr = Direct3DCreate9Ex(D3D_SDK_VERSION, &m_Direct3D9Ex);
43
if (FAILED(hr))
44
- throw std::exception("<" __FUNCTION_NAME__ "> Failed to enumerate adapters, error code %X.", hr);
45
-
46
- std::vector<Adapter> adapters;
47
+ throw std::exception("<" __FUNCTION_NAME__ "> Failed to create D3D9Ex, error code %X.", hr);
48
+
49
std::list<LUID> enumeratedLUIDs;
50
D3DADAPTER_IDENTIFIER9 adapterIdentifier;
51
for (size_t adapterIndex = 0;
52
- !FAILED(pD3DEx->GetAdapterIdentifier((UINT)adapterIndex, 0, &adapterIdentifier));
53
+ !FAILED(m_Direct3D9Ex->GetAdapterIdentifier((UINT)adapterIndex, 0, &adapterIdentifier));
54
adapterIndex++) {
55
56
if (adapterIdentifier.VendorId != 0x1002 /* AMD */)
57
continue;
58
59
LUID adapterLUID;
60
- if (FAILED(pD3DEx->GetAdapterLUID((UINT)adapterIndex, &adapterLUID)))
61
+ if (FAILED(m_Direct3D9Ex->GetAdapterLUID((UINT)adapterIndex, &adapterLUID)))
62
continue;
63
64
bool enumerated = false;
65
66
else
67
enumeratedLUIDs.push_back(adapterLUID);
68
69
- adapters.emplace_back(
70
+ std::vector<char> buf(1024);
71
+ snprintf(buf.data(), buf.size(), "%s [%s] (VEN_%04x/DEV_%04x/SUB_%04x/REV_%04x)",
72
+ adapterIdentifier.Description,
73
+ adapterIdentifier.DeviceName,
74
+
75
+ adapterIdentifier.VendorId,
76
+ adapterIdentifier.DeviceId,
77
+ adapterIdentifier.SubSysId,
78
+ adapterIdentifier.Revision);
79
+
80
+ m_Adapters.emplace_back(
81
Adapter(adapterLUID.LowPart, adapterLUID.HighPart,
82
- std::string(adapterIdentifier.Description)));
83
+ std::string(buf.data())));
84
}
85
+}
86
87
- return adapters;
88
+Plugin::API::Direct3D9::~Direct3D9() {
89
+ //m_InstanceMap.clear(); // Need to destroy IDirect3D9Device9Ex before IDirect3D9Ex.
90
+ m_Direct3D9Ex->Release();
91
}
92
93
-Plugin::API::Adapter Plugin::API::Direct3D9::GetAdapterById(uint32_t idLow, uint32_t idHigh) {
94
- for (auto adapter : EnumerateAdapters()) {
95
- if ((adapter.idLow == idLow) && (adapter.idHigh == idHigh))
96
- return adapter;
97
- }
98
- return *(EnumerateAdapters().begin());
99
+std::string Plugin::API::Direct3D9::GetName() {
100
+ return std::string("Direct3D 9");
101
}
102
103
-Plugin::API::Adapter Plugin::API::Direct3D9::GetAdapterByName(std::string name) {
104
- for (auto adapter : EnumerateAdapters()) {
105
- if (adapter.Name == name)
106
- return adapter;
107
- }
108
- return *(EnumerateAdapters().begin());
109
+Plugin::API::Type Plugin::API::Direct3D9::GetType() {
110
+ return Type::Direct3D9;
111
+}
112
+
113
+std::vector<Adapter> Plugin::API::Direct3D9::EnumerateAdapters() {
114
+ return m_Adapters;
115
}
116
117
-struct Direct3D9Instance {
118
- ATL::CComPtr<IDirect3D9Ex> d3d;
119
- ATL::CComPtr<IDirect3DDevice9Ex> device;
120
-};
121
+std::shared_ptr<Instance> Plugin::API::Direct3D9::CreateInstance(Adapter adapter) {
122
+ //std::pair<int32_t, int32_t> key = std::make_pair(adapter.idLow, adapter.idHigh);
123
+ //auto inst = m_InstanceMap.find(key);
124
+ //if (inst != m_InstanceMap.end())
125
+ // return inst->second;
126
127
-void* Plugin::API::Direct3D9::CreateInstanceOnAdapter(Adapter adapter) {
128
- ATL::CComPtr<IDirect3D9Ex> pD3DEx;
129
- HRESULT hr = Direct3DCreate9Ex(D3D_SDK_VERSION, &pD3DEx);
130
- if (FAILED(hr)) {
131
- std::vector<char> buf(1024);
132
- std::sprintf(buf.data(), "<" __FUNCTION_NAME__ "> Unable to create Direct3D 9 instance, error code %X.", hr);
133
- throw std::exception(buf.data());
134
- }
135
+ auto inst2 = std::make_shared<Direct3D9Instance>(this, adapter);
136
+ //m_InstanceMap.insert_or_assign(key, inst2);
137
+ return inst2;
138
+}
139
+
140
+Plugin::API::Direct3D9Instance::Direct3D9Instance(Direct3D9* api, Adapter adapter) {
141
+ this->m_API = api;
142
+ this->m_Adapter = adapter;
143
144
size_t adapterNum = (size_t)-1;
145
D3DADAPTER_IDENTIFIER9 adapterIdentifier;
146
for (size_t adapterIndex = 0;
147
- !FAILED(pD3DEx->GetAdapterIdentifier((UINT)adapterIndex, 0, &adapterIdentifier));
148
+ !FAILED(api->m_Direct3D9Ex->GetAdapterIdentifier((UINT)adapterIndex, 0, &adapterIdentifier));
149
adapterIndex++) {
150
151
if (adapterIdentifier.VendorId != 0x1002 /* AMD */)
152
continue;
153
154
LUID adapterLUID;
155
- if (FAILED(pD3DEx->GetAdapterLUID((UINT)adapterIndex, &adapterLUID)))
156
+ if (FAILED(api->m_Direct3D9Ex->GetAdapterLUID((UINT)adapterIndex, &adapterLUID)))
157
continue;
158
159
- if ((adapterLUID.LowPart == adapter.idLow)
160
- && (adapterLUID.HighPart == adapter.idHigh)) {
161
+ if ((static_cast<int32_t>(adapterLUID.LowPart) == adapter.idLow)
162
+ && (static_cast<int32_t>(adapterLUID.HighPart) == adapter.idHigh)) {
163
adapterNum = adapterIndex;
164
break;
165
}
166
}
167
if (adapterNum == -1)
168
throw std::invalid_argument("adapter");
169
-
170
+
171
D3DPRESENT_PARAMETERS presentParameters;
172
std::memset(&presentParameters, 0, sizeof(D3DPRESENT_PARAMETERS));
173
presentParameters.BackBufferWidth = 0;
174
175
176
D3DCAPS9 ddCaps;
177
std::memset(&ddCaps, 0, sizeof(ddCaps));
178
- hr = pD3DEx->GetDeviceCaps((UINT)adapterNum, D3DDEVTYPE_HAL, &ddCaps);
179
+ HRESULT hr = api->m_Direct3D9Ex->GetDeviceCaps((UINT)adapterNum, D3DDEVTYPE_HAL, &ddCaps);
180
if (FAILED(hr)) {
181
std::vector<char> buf(1024);
182
- std::sprintf(buf.data(), "<" __FUNCTION_NAME__ "> Unable to query capabilities for D3D9 adapter, error code %X.", hr);
183
+ snprintf(buf.data(), buf.size(), "<" __FUNCTION_NAME__ "> Unable to query capabilities for D3D9 adapter, error code %X.", hr);
184
throw std::exception(buf.data());
185
}
186
187
188
vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
189
}
190
191
- ATL::CComPtr<IDirect3DDevice9Ex> pD3DDeviceEx;
192
- hr = pD3DEx->CreateDeviceEx(
193
+ hr = api->m_Direct3D9Ex->CreateDeviceEx(
194
(UINT)adapterNum,
195
D3DDEVTYPE_HAL,
196
presentParameters.hDeviceWindow,
197
vp | D3DCREATE_NOWINDOWCHANGES | D3DCREATE_MULTITHREADED,
198
&presentParameters,
199
NULL,
200
- &pD3DDeviceEx
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Source/api-host.cpp -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Source/api-host.cpp
Changed
60
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
SOFTWARE.
12
*/
13
14
-//////////////////////////////////////////////////////////////////////////
15
-// Includes
16
-//////////////////////////////////////////////////////////////////////////
17
#include "api-host.h"
18
19
-//////////////////////////////////////////////////////////////////////////
20
-// Code
21
-//////////////////////////////////////////////////////////////////////////
22
using namespace Plugin::API;
23
24
std::string Plugin::API::Host::GetName() {
25
26
27
std::vector<Adapter> Plugin::API::Host::EnumerateAdapters() {
28
std::vector<Adapter> list;
29
- list.push_back(Adapter(0, 0, TEXT_T(AMF_UTIL_DEFAULT)));
30
+ list.push_back(Adapter(0, 0, "Default"));
31
return list;
32
}
33
34
-Plugin::API::Adapter Plugin::API::Host::GetAdapterById(uint32_t idLow, uint32_t idHigh) {
35
- return Adapter(0, 0, TEXT_T(AMF_UTIL_DEFAULT));
36
+std::shared_ptr<Instance> Plugin::API::Host::CreateInstance(Adapter adapter) {
37
+ return std::make_unique<HostInstance>();
38
}
39
40
-Plugin::API::Adapter Plugin::API::Host::GetAdapterByName(std::string name) {
41
- return Adapter(0, 0, TEXT_T(AMF_UTIL_DEFAULT));
42
+Plugin::API::Adapter Plugin::API::HostInstance::GetAdapter() {
43
+ return Adapter(0, 0, "Default");
44
}
45
46
-void* Plugin::API::Host::CreateInstanceOnAdapter(Adapter adapter) {
47
+void* Plugin::API::HostInstance::GetContext() {
48
return nullptr;
49
}
50
-
51
-Plugin::API::Adapter Plugin::API::Host::GetAdapterForInstance(void* pInstance) {
52
- return Adapter(0, 0, TEXT_T(AMF_UTIL_DEFAULT));
53
-}
54
-
55
-void* Plugin::API::Host::GetContextFromInstance(void* pInstance) {
56
- throw std::exception("Host API does not have a Context.");
57
-}
58
-
59
-void Plugin::API::Host::DestroyInstance(void* pInstance) {}
60
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Source/api-opengl.cpp -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Source/api-opengl.cpp
Changed
99
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
SOFTWARE.
12
*/
13
14
-//////////////////////////////////////////////////////////////////////////
15
-// Includes
16
-//////////////////////////////////////////////////////////////////////////
17
#include "api-opengl.h"
18
-
19
#include <vector>
20
21
-#ifdef _WIN32
22
-#include <windows.h>
23
-#endif
24
-#include <gl/GL.h>
25
-
26
-//////////////////////////////////////////////////////////////////////////
27
-// Code
28
-//////////////////////////////////////////////////////////////////////////
29
using namespace Plugin::API;
30
31
+Plugin::API::OpenGL::OpenGL() {
32
+ // ToDo: Adapter enumeration needs to go by Display/Desktop.
33
+ // - Nvidia is the only one that has GPU Affinity extension.
34
+ // - Intel perhaps too since they used Nvidia technology. (Until recently at least)
35
+}
36
+
37
+Plugin::API::OpenGL::~OpenGL() {
38
+
39
+}
40
+
41
std::string Plugin::API::OpenGL::GetName() {
42
return std::string("OpenGL");
43
}
44
45
+Plugin::API::Type Plugin::API::OpenGL::GetType() {
46
+ return Type::OpenGL;
47
+}
48
+
49
std::vector<Adapter> Plugin::API::OpenGL::EnumerateAdapters() {
50
std::vector<Adapter> adapters;
51
adapters.push_back(Adapter(0, 0, "Default"));
52
return adapters;
53
}
54
55
-Plugin::API::Adapter Plugin::API::OpenGL::GetAdapterById(uint32_t idLow, uint32_t idHigh) {
56
- for (auto adapter : EnumerateAdapters()) {
57
- if ((adapter.idLow == idLow) && (adapter.idHigh == idHigh))
58
- return adapter;
59
- }
60
- return *(EnumerateAdapters().begin());
61
+std::shared_ptr<Instance> Plugin::API::OpenGL::CreateInstance(Adapter adapter) {
62
+ // ToDo: Actually create a hidden window and OpenGL context. Not that it is going to be useful.
63
+ return std::make_unique<OpenGLInstance>();
64
}
65
66
-Plugin::API::Adapter Plugin::API::OpenGL::GetAdapterByName(std::string name) {
67
- for (auto adapter : EnumerateAdapters()) {
68
- if (adapter.Name == name)
69
- return adapter;
70
- }
71
- return *(EnumerateAdapters().begin());
72
-}
73
+Plugin::API::OpenGLInstance::OpenGLInstance() {
74
75
-void* Plugin::API::OpenGL::CreateInstanceOnAdapter(Adapter adapter) {
76
- return nullptr;
77
}
78
79
-void Plugin::API::OpenGL::DestroyInstance(void* instance) {
80
- return;
81
-}
82
+Plugin::API::OpenGLInstance::~OpenGLInstance() {
83
84
-Plugin::API::Adapter Plugin::API::OpenGL::GetAdapterForInstance(void* instance) {
85
- return *(EnumerateAdapters().begin());
86
}
87
88
-void* Plugin::API::OpenGL::GetContextFromInstance(void* instance) {
89
- return nullptr;
90
+Plugin::API::Adapter Plugin::API::OpenGLInstance::GetAdapter() {
91
+ return Adapter(0, 0, "Default");
92
}
93
94
-Plugin::API::Type Plugin::API::OpenGL::GetType() {
95
- return Type::OpenGL;
96
+void* Plugin::API::OpenGLInstance::GetContext() {
97
+ return nullptr;
98
}
99
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Source/enc-h264.cpp -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Source/enc-h264.cpp
Changed
201
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
SOFTWARE.
12
*/
13
14
-#pragma once
15
-
16
//////////////////////////////////////////////////////////////////////////
17
-// Includes
18
+// New UI Design
19
//////////////////////////////////////////////////////////////////////////
20
-#include "enc-h264.h"
21
-#include "misc-util.cpp"
22
+// All: Preset
23
+// ----------- Static Section
24
+// Mas: Usage
25
+// All: Quality Preset
26
+// Adv: Profile
27
+// Adv: Profile Level
28
+// Mas: Aspect Ratio
29
+// Exp: Coding Type
30
+// Exp: Maximum Reference Frames
31
+// ----------- Rate Control Section
32
+// All: Rate Control Method
33
+// Adv: Pre-Pass Encoding (if supported)
34
+// All, CBR&VBR: Target Bitrate
35
+// All, VBR: Peak Bitrate
36
+// All, CQP: QP I/P/B
37
+// Adv, CBR&VBR: Min/Max QP
38
+// CBR: Filler Data
39
+// Adv: Frame Skipping
40
+// Exp: VBAQ
41
+// Exp: Enforce HRD
42
+// ----------- VBV Buffer
43
+// Adv: VBV Buffer Size
44
+// Exp: VBV Buffer Initial Fullness
45
+// ----------- Picture Control
46
+// All: Keyframe Interval (Float)
47
+// Mas: IDR Period (Overrides Keyframe Interval if non-zero)
48
+// Adv: B-Frames (if supported)
49
+// Adv: B-Frame Delta QP (if supported, not CQP)
50
+// Adv: B-Frame Reference (if supported and B-Frames enabled)
51
+// Adv: B-Frame Reference Delta QP (if supported, not CQP)
52
+// Exp: Deblocking Filter
53
+// Exp: Motion Estimation (Dropdown)
54
+// ----------- Intra-Refresh
55
+// ToDo: Master Mode only?
56
+// ----------- System
57
+// Adv: API
58
+// Adv: Adapter
59
+// Exp: OpenCL
60
+// All: View
61
62
-#ifdef _WIN32
63
-#include <VersionHelpers.h>
64
+#include "enc-h264.h"
65
+#include "amf-encoder-h264.h"
66
+#include "amf-capabilities.h"
67
+#include "strings.h"
68
+#include "utility.h"
69
70
-#include "api-d3d9.h"
71
-#include "api-d3d11.h"
72
-#endif
73
+#define PREFIX "[H264/AVC]"
74
75
-//////////////////////////////////////////////////////////////////////////
76
-// Code
77
-//////////////////////////////////////////////////////////////////////////
78
using namespace Plugin;
79
using namespace Plugin::AMD;
80
using namespace Plugin::Interface;
81
-
82
-enum class Presets : int8_t {
83
- None = -1,
84
- ResetToDefaults = 0,
85
- Recording,
86
- HighQuality,
87
- Indistinguishable,
88
- Lossless,
89
- Twitch,
90
- YouTube,
91
-};
92
-enum class ViewMode :uint8_t {
93
- Basic,
94
- Advanced,
95
- Expert,
96
- Master
97
-};
98
+using namespace Utility;
99
100
void Plugin::Interface::H264Interface::encoder_register() {
101
- // Ensure that there is a supported AMD GPU.
102
- bool haveAVCsupport = false;
103
- for (auto api : Plugin::API::Base::EnumerateAPIs()) {
104
- for (auto adapter : api->EnumerateAdapters()) {
105
- auto caps = VCECapabilities::GetInstance()->GetAdapterCapabilities(api, adapter, H264EncoderType::AVC);
106
- if (caps.acceleration_type != amf::AMF_ACCEL_NOT_SUPPORTED)
107
- haveAVCsupport = true;
108
- }
109
- }
110
- if (!haveAVCsupport) {
111
- AMF_LOG_WARNING("No detected GPU supports H264 encoding.");
112
+ // Test if we actually have AVC support.
113
+ if (!AMD::CapabilityManager::Instance()->IsCodecSupported(Codec::AVC)) {
114
+ PLOG_WARNING(PREFIX " Not supported by any GPU, disabling...");
115
return;
116
}
117
118
119
encoder_info->get_extra_data = &get_extra_data;
120
121
obs_register_encoder(encoder_info.get());
122
+ PLOG_DEBUG(PREFIX " Registered.");
123
}
124
125
const char* Plugin::Interface::H264Interface::get_name(void*) {
126
- static const char* name = "H264 Encoder (AMD Advanced Media Framework)";
127
+ static const char* name = "H264/AVC Encoder (" PLUGIN_NAME ")";
128
return name;
129
}
130
131
void* Plugin::Interface::H264Interface::create(obs_data_t* settings, obs_encoder_t* encoder) {
132
- Plugin::Interface::H264Interface* enc = nullptr;
133
try {
134
- AMF_LOG_INFO("Starting up...");
135
- enc = new Plugin::Interface::H264Interface(settings, encoder);
136
- return enc;
137
+ return new Plugin::Interface::H264Interface(settings, encoder);
138
} catch (std::exception e) {
139
- AMF_LOG_ERROR("%s", e.what());
140
- } catch (std::exception* e) {
141
- AMF_LOG_ERROR("%s", e->what());
142
- delete e;
143
- } catch (...) {
144
- AMF_LOG_ERROR("Unknown Exception.");
145
+ PLOG_ERROR("%s", e.what());
146
}
147
- if (enc)
148
- delete enc;
149
- return NULL;
150
+ return nullptr;
151
}
152
153
void Plugin::Interface::H264Interface::destroy(void* data) {
154
- try {
155
- AMF_LOG_INFO("Shutting down...");
156
- Plugin::Interface::H264Interface* enc = static_cast<Plugin::Interface::H264Interface*>(data);
157
- delete enc;
158
- } catch (std::exception e) {
159
- AMF_LOG_ERROR("%s", e.what());
160
- } catch (std::exception* e) {
161
- AMF_LOG_ERROR("%s", e->what());
162
- delete e;
163
- } catch (...) {
164
- AMF_LOG_ERROR("Unknown Exception.");
165
- }
166
- data = nullptr;
167
+ if (data)
168
+ delete static_cast<Plugin::Interface::H264Interface*>(data);
169
}
170
171
bool Plugin::Interface::H264Interface::encode(void *data, struct encoder_frame *frame, struct encoder_packet *packet, bool *received_packet) {
172
try {
173
- return static_cast<Plugin::Interface::H264Interface*>(data)->encode(frame, packet, received_packet);
174
+ if (data)
175
+ return static_cast<Plugin::Interface::H264Interface*>(data)->encode(frame, packet, received_packet);
176
} catch (std::exception e) {
177
- AMF_LOG_ERROR("%s", e.what());
178
- } catch (std::exception* e) {
179
- AMF_LOG_ERROR("%s", e->what());
180
- delete e;
181
- } catch (...) {
182
- AMF_LOG_ERROR("Unknown Exception.");
183
- throw;
184
+ PLOG_ERROR("%s", e.what());
185
}
186
return false;
187
}
188
189
obs_data_set_default_string(data, "rate_control", "");
190
obs_data_set_default_string(data, "profile", "");
191
obs_data_set_default_string(data, "preset", "");
192
- obs_data_set_int(data, "bitrate", -1);
193
- obs_data_set_int(data, "keyint_sec", -1);
194
- obs_data_set_string(data, "rate_control", "");
195
- obs_data_set_string(data, "profile", "");
196
- obs_data_set_string(data, "preset", "");
197
#pragma endregion OBS - Enforce Streaming Service Restrictions
198
199
// Preset
200
- obs_data_set_default_int(data, AMF_H264_PRESET, static_cast<int32_t>(Presets::None));
201
obs-studio-18.0.2.tar.xz/plugins/enc-amf/Source/enc-h265.cpp
Added
201
1
2
+/*
3
+MIT License
4
+
5
+Copyright (c) 2016-2017
6
+
7
+Permission is hereby granted, free of charge, to any person obtaining a copy
8
+of this software and associated documentation files (the "Software"), to deal
9
+in the Software without restriction, including without limitation the rights
10
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+copies of the Software, and to permit persons to whom the Software is
12
+furnished to do so, subject to the following conditions:
13
+
14
+The above copyright notice and this permission notice shall be included in all
15
+copies or substantial portions of the Software.
16
+
17
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+SOFTWARE.
24
+*/
25
+
26
+
27
+//////////////////////////////////////////////////////////////////////////
28
+// New UI Design
29
+//////////////////////////////////////////////////////////////////////////
30
+// All: Preset
31
+// ----------- Static Section
32
+// Mas: Usage
33
+// All: Quality Preset
34
+// Adv: Profile
35
+// Adv: Profile Level
36
+// Adv: Tier
37
+// Mas: Aspect Ratio
38
+// Exp: Coding Type
39
+// Exp: Maximum Reference Frames
40
+// ----------- Rate Control Section
41
+// All: Rate Control Method
42
+// Adv: Pre-Pass Encoding (if supported)
43
+// All, CBR&VBR: Target Bitrate
44
+// All, VBR: Peak Bitrate
45
+// All, CQP: QP I/P
46
+// Adv, CBR&VBR: Min/Max I/P-Frame QP
47
+// CBR: Filler Data
48
+// Adv: Frame Skipping
49
+// Exp: VBAQ
50
+// Exp: Enforce HRD
51
+// ----------- VBV Buffer
52
+// Adv: VBV Buffer Size
53
+// Exp: VBV Buffer Initial Fullness
54
+// ----------- Picture Control
55
+// All: Keyframe Interval (Float, uses GOP Size Fixed/Min/Max)
56
+// Mas: IDR Period (in GOPs)
57
+// Exp: GOP Type
58
+// Exp: GOP Size
59
+// Exp: GOP Size Min/Max
60
+// Exp: Deblocking Filter
61
+// Exp: Motion Estimation (Dropdown)
62
+// ----------- Intra-Refresh
63
+// ToDo: Master Mode only?
64
+// ----------- System
65
+// Adv: API
66
+// Adv: Adapter
67
+// Exp: OpenCL
68
+// All: View
69
+
70
+#include "enc-h265.h"
71
+#include "amf-capabilities.h"
72
+#include "amf-encoder.h"
73
+#include "amf-encoder-h265.h"
74
+#include "strings.h"
75
+#include "utility.h"
76
+
77
+#define PREFIX "[H265/HEVC]"
78
+
79
+using namespace Plugin::AMD;
80
+
81
+void Plugin::Interface::H265Interface::encoder_register() {
82
+ // Test if we actually have AVC support.
83
+ if (!AMD::CapabilityManager::Instance()->IsCodecSupported(Codec::HEVC)) {
84
+ PLOG_WARNING(PREFIX " Not supported by any GPU, disabling...");
85
+ return;
86
+ }
87
+
88
+ // Create structure
89
+ static std::unique_ptr<obs_encoder_info> encoder_info = std::make_unique<obs_encoder_info>();
90
+ std::memset(encoder_info.get(), 0, sizeof(obs_encoder_info));
91
+
92
+ // Initialize Structure
93
+ encoder_info->type = obs_encoder_type::OBS_ENCODER_VIDEO;
94
+ static const char* encoder_name = "amd_amf_h265";
95
+ encoder_info->id = encoder_name;
96
+ static const char* encoder_codec = "hevc";
97
+ encoder_info->codec = encoder_codec;
98
+
99
+ // Functions
100
+ encoder_info->get_name = &get_name;
101
+ encoder_info->get_defaults = &get_defaults;
102
+ encoder_info->get_properties = &get_properties;
103
+ encoder_info->create = &create;
104
+ encoder_info->destroy = &destroy;
105
+ encoder_info->encode = &encode;
106
+ encoder_info->update = &update;
107
+ encoder_info->get_video_info = &get_video_info;
108
+ encoder_info->get_extra_data = &get_extra_data;
109
+
110
+ obs_register_encoder(encoder_info.get());
111
+ PLOG_DEBUG(PREFIX " Registered.");
112
+}
113
+
114
+const char* Plugin::Interface::H265Interface::get_name(void*) {
115
+ static const char* name = "H265/HEVC Encoder (" PLUGIN_NAME ")";
116
+ return name;
117
+}
118
+
119
+void Plugin::Interface::H265Interface::get_defaults(obs_data_t *data) {
120
+ #pragma region OBS - Enforce Streaming Service Restrictions
121
+ obs_data_set_default_int(data, "bitrate", -1);
122
+ obs_data_set_default_int(data, "keyint_sec", -1);
123
+ obs_data_set_default_string(data, "rate_control", "");
124
+ obs_data_set_default_string(data, "profile", "");
125
+ obs_data_set_default_string(data, "preset", "");
126
+ obs_data_set_int(data, "bitrate", -1);
127
+ obs_data_set_int(data, "keyint_sec", -1);
128
+ obs_data_set_string(data, "rate_control", "");
129
+ obs_data_set_string(data, "profile", "");
130
+ obs_data_set_string(data, "preset", "");
131
+ #pragma endregion OBS - Enforce Streaming Service Restrictions
132
+
133
+ // Static
134
+ //obs_data_set_default_int(data, P_USAGE, static_cast<int64_t>(Usage::Transcoding));
135
+ obs_data_set_default_int(data, P_QUALITYPRESET, static_cast<int64_t>(QualityPreset::Balanced));
136
+ obs_data_set_default_int(data, P_PROFILE, static_cast<int64_t>(Profile::Main));
137
+ obs_data_set_default_int(data, P_PROFILELEVEL, static_cast<int64_t>(ProfileLevel::Automatic));
138
+ obs_data_set_default_int(data, P_TIER, static_cast<int64_t>(H265::Tier::Main));
139
+ //obs_data_set_default_frames_per_second(data, P_ASPECTRATIO, media_frames_per_second{ 1, 1 }, "");
140
+ obs_data_set_default_int(data, P_CODINGTYPE, static_cast<int64_t>(CodingType::Automatic));
141
+ obs_data_set_default_int(data, P_MAXIMUMREFERENCEFRAMES, 1);
142
+
143
+ // Rate Control
144
+ obs_data_set_int(data, ("last" P_RATECONTROLMETHOD), -1);
145
+ obs_data_set_default_int(data, ("last" P_RATECONTROLMETHOD), -1);
146
+ obs_data_set_default_int(data, P_RATECONTROLMETHOD, static_cast<int64_t>(RateControlMethod::ConstantBitrate));
147
+ obs_data_set_default_int(data, P_PREPASSMODE, static_cast<int64_t>(PrePassMode::Disabled));
148
+ obs_data_set_default_int(data, P_BITRATE_TARGET, 3500);
149
+ obs_data_set_default_int(data, P_BITRATE_PEAK, 9000);
150
+ obs_data_set_default_int(data, P_QP_IFRAME, 22);
151
+ obs_data_set_default_int(data, P_QP_PFRAME, 22);
152
+ obs_data_set_default_int(data, P_QP_BFRAME, 22);
153
+ obs_data_set_default_int(data, P_QP_IFRAME_MINIMUM, 18);
154
+ obs_data_set_default_int(data, P_QP_IFRAME_MAXIMUM, 51);
155
+ obs_data_set_default_int(data, P_QP_PFRAME_MINIMUM, 18);
156
+ obs_data_set_default_int(data, P_QP_PFRAME_MAXIMUM, 51);
157
+ obs_data_set_default_int(data, P_FILLERDATA, 1);
158
+ obs_data_set_default_int(data, P_FRAMESKIPPING, 0);
159
+ obs_data_set_default_int(data, P_VBAQ, 1);
160
+ obs_data_set_default_int(data, P_ENFORCEHRD, 0);
161
+
162
+ // VBV Buffer
163
+ obs_data_set_int(data, ("last" P_VBVBUFFER), -1);
164
+ obs_data_set_default_int(data, ("last" P_VBVBUFFER), -1);
165
+ obs_data_set_default_int(data, P_VBVBUFFER, 0);
166
+ obs_data_set_default_int(data, P_VBVBUFFER_SIZE, 3500);
167
+ obs_data_set_default_double(data, P_VBVBUFFER_STRICTNESS, 50);
168
+ obs_data_set_default_double(data, P_VBVBUFFER_INITIALFULLNESS, 100);
169
+
170
+ // Picture Control
171
+ obs_data_set_default_double(data, P_INTERVAL_KEYFRAME, 2.0);
172
+ obs_data_set_default_int(data, P_PERIOD_IDR_H265, 0);
173
+ obs_data_set_default_double(data, P_INTERVAL_IFRAME, 0.0);
174
+ obs_data_set_default_int(data, P_PERIOD_IFRAME, 0);
175
+ obs_data_set_default_double(data, P_INTERVAL_PFRAME, 0.0);
176
+ obs_data_set_default_int(data, P_PERIOD_PFRAME, 0);
177
+ obs_data_set_default_int(data, P_FRAMESKIPPING_PERIOD, 0);
178
+ obs_data_set_default_int(data, P_FRAMESKIPPING_BEHAVIOUR, 0);
179
+ obs_data_set_default_int(data, P_GOP_TYPE, static_cast<int64_t>(H265::GOPType::Fixed));
180
+ obs_data_set_default_int(data, P_GOP_SIZE, 60);
181
+ obs_data_set_default_int(data, P_GOP_SIZE_MINIMUM, 1);
182
+ obs_data_set_default_int(data, P_GOP_SIZE_MAXIMUM, 16);
183
+ obs_data_set_default_int(data, P_DEBLOCKINGFILTER, 1);
184
+ obs_data_set_default_int(data, P_MOTIONESTIMATION, 3);
185
+
186
+ // System Properties
187
+ obs_data_set_string(data, ("last" P_VIDEO_API), "");
188
+ obs_data_set_default_string(data, ("last" P_VIDEO_API), "");
189
+ obs_data_set_default_string(data, P_VIDEO_API, "");
190
+ obs_data_set_int(data, ("last" P_VIDEO_ADAPTER), 0);
191
+ obs_data_set_default_int(data, ("last" P_VIDEO_ADAPTER), 0);
192
+ obs_data_set_default_int(data, P_VIDEO_ADAPTER, 0);
193
+ obs_data_set_default_int(data, P_OPENCL_TRANSFER, 0);
194
+ obs_data_set_default_int(data, P_OPENCL_CONVERSION, 0);
195
+ obs_data_set_default_int(data, P_ASYNCHRONOUSQUEUE, 0);
196
+ obs_data_set_default_int(data, P_ASYNCHRONOUSQUEUE_SIZE, 4);
197
+ obs_data_set_int(data, ("last" P_VIEW), -1);
198
+ obs_data_set_default_int(data, ("last" P_VIEW), -1);
199
+ obs_data_set_default_int(data, P_VIEW, static_cast<int64_t>(ViewMode::Basic));
200
+ obs_data_set_default_bool(data, P_DEBUG, false);
201
obs-studio-18.0.1.tar.xz/plugins/enc-amf/Source/plugin.cpp -> obs-studio-18.0.2.tar.xz/plugins/enc-amf/Source/plugin.cpp
Changed
201
1
2
/*
3
MIT License
4
5
-Copyright (c) 2016 Michael Fabian Dirks
6
+Copyright (c) 2016-2017
7
8
Permission is hereby granted, free of charge, to any person obtaining a copy
9
of this software and associated documentation files (the "Software"), to deal
10
11
*/
12
13
#pragma once
14
-//////////////////////////////////////////////////////////////////////////
15
-// Includes
16
-//////////////////////////////////////////////////////////////////////////
17
-#include <windows.h>
18
-#include <sstream>
19
-#include <map>
20
-
21
-// Plugin
22
#include "plugin.h"
23
#include "api-base.h"
24
#include "amf.h"
25
#include "amf-capabilities.h"
26
+#include <sstream>
27
+
28
+#ifdef WITH_AVC
29
#include "enc-h264.h"
30
+#endif
31
+#ifdef WITH_HEVC
32
+#include "enc-h265.h"
33
+#endif
34
+#ifdef _WIN32
35
+#include <windows.h>
36
+#endif
37
+
38
+using namespace Plugin;
39
+using namespace Plugin::AMD;
40
41
//////////////////////////////////////////////////////////////////////////
42
// Code
43
44
OBS_MODULE_AUTHOR("Michael Fabian Dirks");
45
OBS_MODULE_USE_DEFAULT_LOCALE("enc-amf", "en-US");
46
47
+#ifdef _DEBUG
48
+#include "components/VideoEncoderVCE.h"
49
+#include "components/VideoEncoderHEVC.h"
50
+
51
+static std::string fastPrintVariant(const char* text, amf::AMFVariantStruct variant) {
52
+ std::vector<char> buf(1024);
53
+ switch (variant.type) {
54
+ case amf::AMF_VARIANT_EMPTY:
55
+ snprintf(buf.data(), buf.size(), "%s%s", text, "Empty");
56
+ break;
57
+ case amf::AMF_VARIANT_BOOL:
58
+ snprintf(buf.data(), buf.size(), "%s%s", text, variant.boolValue ? "true" : "false");
59
+ break;
60
+ case amf::AMF_VARIANT_INT64:
61
+ snprintf(buf.data(), buf.size(), "%s%lld", text, variant.int64Value);
62
+ break;
63
+ case amf::AMF_VARIANT_DOUBLE:
64
+ snprintf(buf.data(), buf.size(), "%s%f", text, variant.doubleValue);
65
+ break;
66
+ case amf::AMF_VARIANT_RECT:
67
+ snprintf(buf.data(), buf.size(), "%s[%ld,%ld,%ld,%ld]", text,
68
+ variant.rectValue.top, variant.rectValue.left,
69
+ variant.rectValue.bottom, variant.rectValue.right);
70
+ break;
71
+ case amf::AMF_VARIANT_SIZE:
72
+ snprintf(buf.data(), buf.size(), "%s%ldx%ld", text,
73
+ variant.sizeValue.width, variant.sizeValue.height);
74
+ break;
75
+ case amf::AMF_VARIANT_POINT:
76
+ snprintf(buf.data(), buf.size(), "%s[%ld,%ld]", text,
77
+ variant.pointValue.x, variant.pointValue.y);
78
+ break;
79
+ case amf::AMF_VARIANT_RATE:
80
+ snprintf(buf.data(), buf.size(), "%s%ld/%ld", text,
81
+ variant.rateValue.num, variant.rateValue.den);
82
+ break;
83
+ case amf::AMF_VARIANT_RATIO:
84
+ snprintf(buf.data(), buf.size(), "%s%ld:%ld", text,
85
+ variant.ratioValue.num, variant.ratioValue.den);
86
+ break;
87
+ case amf::AMF_VARIANT_COLOR:
88
+ snprintf(buf.data(), buf.size(), "%s(%d,%d,%d,%d)", text,
89
+ variant.colorValue.r,
90
+ variant.colorValue.g,
91
+ variant.colorValue.b,
92
+ variant.colorValue.a);
93
+ break;
94
+ case amf::AMF_VARIANT_STRING:
95
+ snprintf(buf.data(), buf.size(), "%s'%s'", text,
96
+ variant.stringValue);
97
+ break;
98
+ case amf::AMF_VARIANT_WSTRING:
99
+ snprintf(buf.data(), buf.size(), "%s'%ls'", text,
100
+ variant.wstringValue);
101
+ break;
102
+ }
103
+ return std::string(buf.data());
104
+};
105
+
106
+static void printDebugInfo(amf::AMFComponentPtr m_AMFEncoder) {
107
+ amf::AMFPropertyInfo* pInfo;
108
+ size_t propCount = m_AMFEncoder->GetPropertyCount();
109
+ PLOG_INFO("-- Internal AMF Encoder Properties --");
110
+ for (size_t propIndex = 0; propIndex < propCount; propIndex++) {
111
+ static const char* typeToString[] = {
112
+ "Empty",
113
+ "Boolean",
114
+ "Int64",
115
+ "Double",
116
+ "Rect",
117
+ "Size",
118
+ "Point",
119
+ "Rate",
120
+ "Ratio",
121
+ "Color",
122
+ "String",
123
+ "WString",
124
+ "Interface"
125
+ };
126
+
127
+ AMF_RESULT res = m_AMFEncoder->GetPropertyInfo(propIndex, (const amf::AMFPropertyInfo**) &pInfo);
128
+ if (res != AMF_OK)
129
+ continue;
130
+
131
+ amf::AMFVariantStruct curStruct = amf::AMFVariantStruct();
132
+ m_AMFEncoder->GetProperty(pInfo->name, &curStruct);
133
+
134
+ auto vcur = fastPrintVariant("Current: ", curStruct);
135
+ auto vdef = fastPrintVariant("Default: ", pInfo->defaultValue);
136
+ auto vmin = fastPrintVariant("Minimum: ", pInfo->minValue);
137
+ auto vmax = fastPrintVariant("Maximum: ", pInfo->maxValue);
138
+ std::stringstream venum;
139
+ if (pInfo->pEnumDescription) {
140
+ const amf::AMFEnumDescriptionEntry* pEnumEntry = pInfo->pEnumDescription;
141
+ while (pEnumEntry->name != nullptr) {
142
+ QUICK_FORMAT_MESSAGE(tmp, "%ls[%ld]", pEnumEntry->name, pEnumEntry->value);
143
+ venum << tmp.c_str() << "; ";
144
+ pEnumEntry++;
145
+ }
146
+ }
147
+
148
+ PLOG_INFO("%ls(Description: %ls, Type: %s, Index %d, Content Type: %d, Access: %s%s%s, Values: {%s, %s, %s, %s%s%s})",
149
+ pInfo->name,
150
+ pInfo->desc,
151
+ typeToString[pInfo->type],
152
+ propIndex,
153
+ pInfo->contentType,
154
+ (pInfo->accessType & amf::AMF_PROPERTY_ACCESS_READ) ? "R" : "",
155
+ (pInfo->accessType & amf::AMF_PROPERTY_ACCESS_WRITE) ? "W" : "",
156
+ (pInfo->accessType & amf::AMF_PROPERTY_ACCESS_WRITE_RUNTIME) ? "X" : "",
157
+ vcur.c_str(), vdef.c_str(), vmin.c_str(), vmax.c_str(),
158
+ (venum.str().length() > 0) ? ", Enum: " : "", venum.str().c_str()
159
+ );
160
+ }
161
+}
162
+#endif
163
+
164
/**
165
* Required: Called when the module is loaded. Use this function to load all
166
* the sources/encoders/outputs/services for your module, or anything else that
167
168
* false to indicate failure and unload the module
169
*/
170
MODULE_EXPORT bool obs_module_load(void) {
171
- AMF_LOG_DEBUG("<" __FUNCTION_NAME__ "> Loading...");
172
+ PLOG_DEBUG("<" __FUNCTION_NAME__ "> Loading...");
173
174
- // Attempt to load AMF Runtime
175
+ // AMF
176
try {
177
- Plugin::AMD::AMF::GetInstance();
178
- } catch (std::exception& e) {
179
- AMF_LOG_ERROR("%s", e.what());
180
- return true;
181
- } catch (std::exception* e) {
182
- AMF_LOG_ERROR("%s", e->what());
183
- delete e;
184
- return true;
185
+ Plugin::AMD::AMF::Initialize();
186
+ } catch (const std::exception& e) {
187
+ PLOG_ERROR("Encountered Exception during AMF initialization: %s", e.what());
188
+ return false;
189
} catch (...) {
190
- AMF_LOG_ERROR("Unknown Exception.");
191
- return true;
192
+ PLOG_ERROR("Unexpected Exception during AMF initialization.");
193
+ return false;
194
}
195
196
// Initialize Graphics APIs
197
+ Plugin::API::InitializeAPIs();
198
+
199
+ // AMF Capabilities
200
try {
201
obs-studio-18.0.2.tar.xz/plugins/enc-amf/Source/utility.cpp
Added
201
1
2
+/*
3
+MIT License
4
+
5
+Copyright (c) 2016-2017
6
+
7
+Permission is hereby granted, free of charge, to any person obtaining a copy
8
+of this software and associated documentation files (the "Software"), to deal
9
+in the Software without restriction, including without limitation the rights
10
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11
+copies of the Software, and to permit persons to whom the Software is
12
+furnished to do so, subject to the following conditions:
13
+
14
+The above copyright notice and this permission notice shall be included in all
15
+copies or substantial portions of the Software.
16
+
17
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
+SOFTWARE.
24
+*/
25
+
26
+#pragma once
27
+
28
+// Plugin
29
+#include "utility.h"
30
+#include "amf.h"
31
+#include "amf-encoder.h"
32
+#include "components/VideoConverter.h"
33
+#ifdef WITH_AVC
34
+#include "amf-encoder-h264.h"
35
+#include "components/VideoEncoderVCE.h"
36
+#endif
37
+#ifdef WITH_HEVC
38
+#include "amf-encoder-h265.h"
39
+#include "components/VideoEncoderHEVC.h"
40
+#endif
41
+
42
+#include <map>
43
+#include <sstream>
44
+
45
+using namespace Plugin::AMD;
46
+
47
+uint64_t Utility::GetUniqueIdentifier() {
48
+ static std::mutex __mutex;
49
+ static uint64_t __curId;
50
+
51
+ const std::lock_guard<std::mutex> lock(__mutex);
52
+ return ++__curId;
53
+}
54
+
55
+static std::map<std::string, std::string> translatedMap;
56
+const char* Utility::obs_module_text_multi(const char *key, uint8_t depth) {
57
+ // Check if it already was translated.
58
+ if (!translatedMap.count(std::string(key))) { // If not, translate it now.
59
+ const char* out = obs_module_text(key);
60
+
61
+ // Allow for nested translations using \@...\@ sequences.
62
+ if (depth > 0) {
63
+ // I'm pretty sure this can be optimized a ton if necessary.
64
+
65
+ size_t seqStart = 0,
66
+ seqEnd = 0;
67
+ bool haveSequence = false;
68
+
69
+ std::stringstream fout;
70
+
71
+ // Walk the given string.
72
+ std::string walkable = std::string(out);
73
+
74
+ for (size_t pos = 0; pos <= walkable.length(); pos++) {
75
+ std::string walked = walkable.substr(pos, 2);
76
+
77
+ if (walked == "\\@") { // Sequence Start/End
78
+ if (haveSequence) {
79
+ seqEnd = pos;
80
+
81
+ std::string sequence = walkable.substr(seqStart, seqEnd - seqStart);
82
+ fout << obs_module_text_multi(sequence.c_str(), depth--);
83
+ } else {
84
+ seqStart = pos + 2;
85
+ }
86
+ haveSequence = !haveSequence;
87
+ pos = pos + 1;
88
+ } else if (!haveSequence) {
89
+ fout << walked.substr(0, 1); // Append the left character.
90
+ }
91
+ }
92
+
93
+ std::pair<std::string, std::string> kv = std::pair<std::string, std::string>(std::string(key), fout.str());
94
+ translatedMap.insert(kv);
95
+ } else {
96
+ return out;
97
+ }
98
+ }
99
+
100
+ auto value = translatedMap.find(std::string(key));
101
+ return value->second.c_str();
102
+}
103
+
104
+
105
+// Codec
106
+const char* Utility::CodecToString(Plugin::AMD::Codec v) {
107
+ switch (v) {
108
+ #ifdef WITH_AVC
109
+ case Codec::AVC:
110
+ return "H264/AVC";
111
+ case Codec::SVC:
112
+ return "H264/SVC";
113
+ #endif
114
+ #ifdef WITH_HEVC
115
+ case Codec::HEVC:
116
+ return "H265/HEVC";
117
+ #endif
118
+ }
119
+ throw std::runtime_error("Invalid Parameter");
120
+}
121
+const wchar_t* Utility::CodecToAMF(Plugin::AMD::Codec v) {
122
+ switch (v) {
123
+ #ifdef WITH_AVC
124
+ case Codec::AVC:
125
+ return AMFVideoEncoderVCE_AVC;
126
+ case Codec::SVC:
127
+ return AMFVideoEncoderVCE_SVC;
128
+ #endif
129
+ #ifdef WITH_HEVC
130
+ case Codec::HEVC:
131
+ return AMFVideoEncoder_HEVC;
132
+ #endif
133
+ }
134
+ throw std::runtime_error("Invalid Parameter");
135
+}
136
+
137
+// Color Format
138
+const char* Utility::ColorFormatToString(Plugin::AMD::ColorFormat v) {
139
+ switch (v) {
140
+ case ColorFormat::I420:
141
+ return "YUV 4:2:0";
142
+ case ColorFormat::NV12:
143
+ return "NV12";
144
+ case ColorFormat::YUY2:
145
+ return "YUY2";
146
+ case ColorFormat::BGRA:
147
+ return "BGRA";
148
+ case ColorFormat::RGBA:
149
+ return "RGBA";
150
+ case ColorFormat::GRAY:
151
+ return "GRAY";
152
+ }
153
+ throw std::runtime_error("Invalid Parameter");
154
+}
155
+amf::AMF_SURFACE_FORMAT Utility::ColorFormatToAMF(Plugin::AMD::ColorFormat v) {
156
+ switch (v) {
157
+ case ColorFormat::I420:
158
+ return amf::AMF_SURFACE_YUV420P;
159
+ case ColorFormat::NV12:
160
+ return amf::AMF_SURFACE_NV12;
161
+ case ColorFormat::YUY2:
162
+ return amf::AMF_SURFACE_YUY2;
163
+ case ColorFormat::BGRA:
164
+ return amf::AMF_SURFACE_BGRA;
165
+ case ColorFormat::RGBA:
166
+ return amf::AMF_SURFACE_RGBA;
167
+ case ColorFormat::GRAY:
168
+ return amf::AMF_SURFACE_GRAY8;
169
+ }
170
+ throw std::runtime_error("Invalid Parameter");
171
+}
172
+
173
+// Color Space
174
+const char* Utility::ColorSpaceToString(Plugin::AMD::ColorSpace v) {
175
+ switch (v) {
176
+ case ColorSpace::BT601:
177
+ return "601";
178
+ case ColorSpace::BT709:
179
+ return "709";
180
+ case ColorSpace::BT2020:
181
+ return "2020";
182
+ }
183
+ throw std::runtime_error("Invalid Parameter");
184
+}
185
+AMF_VIDEO_CONVERTER_COLOR_PROFILE_ENUM Utility::ColorSpaceToAMFConverter(Plugin::AMD::ColorSpace v) {
186
+ switch (v) {
187
+ case ColorSpace::BT601:
188
+ return AMF_VIDEO_CONVERTER_COLOR_PROFILE_601;
189
+ case ColorSpace::BT709:
190
+ return AMF_VIDEO_CONVERTER_COLOR_PROFILE_709;
191
+ case ColorSpace::BT2020:
192
+ return AMF_VIDEO_CONVERTER_COLOR_PROFILE_2020;
193
+ }
194
+ throw std::runtime_error("Invalid Parameter");
195
+}
196
+
197
+// Usage
198
+const char* Utility::UsageToString(Plugin::AMD::Usage v) {
199
+ switch (v) {
200
+ case Usage::Transcoding:
201
obs-studio-18.0.1.tar.xz/plugins/image-source/image-source.c -> obs-studio-18.0.2.tar.xz/plugins/image-source/image-source.c
Changed
37
1
2
struct image_source *context = data;
3
uint64_t frame_time = obs_get_video_frame_time();
4
5
+ context->update_time_elapsed += seconds;
6
+
7
+ if (context->update_time_elapsed >= 1.0f) {
8
+ time_t t = get_modified_timestamp(context->file);
9
+ context->update_time_elapsed = 0.0f;
10
+
11
+ if (context->file_timestamp != t) {
12
+ image_source_load(context);
13
+ }
14
+ }
15
+
16
if (obs_source_active(context->source)) {
17
if (!context->active) {
18
if (context->image.is_animated_gif)
19
20
}
21
22
context->last_time = frame_time;
23
-
24
- context->update_time_elapsed += seconds;
25
-
26
- if (context->update_time_elapsed >= 1.0f) {
27
- time_t t = get_modified_timestamp(context->file);
28
- context->update_time_elapsed = 0.0f;
29
-
30
- if (context->file_timestamp != t) {
31
- image_source_load(context);
32
- }
33
- }
34
}
35
36
37
obs-studio-18.0.1.tar.xz/plugins/linux-pulseaudio/pulse-input.c -> obs-studio-18.0.2.tar.xz/plugins/linux-pulseaudio/pulse-input.c
Changed
10
1
2
.type = OBS_SOURCE_TYPE_INPUT,
3
.output_flags = OBS_SOURCE_AUDIO |
4
OBS_SOURCE_DO_NOT_DUPLICATE |
5
- OBS_SOURCE_DO_NOT_MONITOR,
6
+ OBS_SOURCE_DO_NOT_SELF_MONITOR,
7
.get_name = pulse_output_getname,
8
.create = pulse_create,
9
.destroy = pulse_destroy,
10
obs-studio-18.0.1.tar.xz/plugins/mac-avcapture/CMakeLists.txt -> obs-studio-18.0.2.tar.xz/plugins/mac-avcapture/CMakeLists.txt
Changed
24
1
2
find_library(COREMEDIA CoreMedia)
3
find_library(COREVIDEO CoreVideo)
4
find_library(COCOA Cocoa)
5
+find_library(COREMEDIAIO CoreMediaIO)
6
7
include_directories(${AVFOUNDATION}
8
${COCOA}
9
${COREFOUNDATION}
10
${COREMEDIA}
11
${COREVIDEO}
12
+ ${COREMEDIAIO}
13
${COCOA})
14
15
set(mac-avcapture_HEADERS
16
17
${COREFOUNDATION}
18
${COREMEDIA}
19
${COREVIDEO}
20
+ ${COREMEDIAIO}
21
${COCOA})
22
23
install_obs_plugin_with_data(mac-avcapture data)
24
obs-studio-18.0.1.tar.xz/plugins/mac-avcapture/av-capture.mm -> obs-studio-18.0.2.tar.xz/plugins/mac-avcapture/av-capture.mm
Changed
76
1
2
#import <CoreFoundation/CoreFoundation.h>
3
#import <CoreMedia/CoreMedia.h>
4
#import <CoreVideo/CoreVideo.h>
5
+#import <CoreMediaIO/CMIOHardware.h>
6
7
#include <obs-module.h>
8
#include <obs.hpp>
9
10
CMMediaType mtype = CMFormatDescriptionGetMediaType(
11
format.formatDescription);
12
// TODO: support other media types
13
- if (mtype != kCMMediaType_Video) {
14
+ if (mtype != kCMMediaType_Video && mtype != kCMMediaType_Muxed) {
15
AVLOG(LOG_ERROR, "CMMediaType '%s' is unsupported",
16
AV_FOURCC_STR(mtype));
17
return false;
18
19
AVCaptureSessionPreset640x480,
20
AVCaptureSessionPreset352x288,
21
AVCaptureSessionPreset320x240,
22
- //AVCaptureSessionPresetHigh,
23
+ AVCaptureSessionPresetHigh,
24
//AVCaptureSessionPresetMedium,
25
//AVCaptureSessionPresetLow,
26
//AVCaptureSessionPresetPhoto,
27
28
AVCaptureSessionPreset640x480:@"640x480",
29
AVCaptureSessionPreset960x540:@"960x540",
30
AVCaptureSessionPreset1280x720:@"1280x720",
31
+ AVCaptureSessionPresetHigh:@"High",
32
};
33
NSString *name = preset_names[preset];
34
if (name)
35
36
TEXT_DEVICE, OBS_COMBO_TYPE_LIST,
37
OBS_COMBO_FORMAT_STRING);
38
obs_property_list_add_string(dev_list, "", "");
39
+
40
for (AVCaptureDevice *dev in [AVCaptureDevice
41
- devicesWithMediaType:AVMediaTypeVideo]) {
42
- obs_property_list_add_string(dev_list,
43
- dev.localizedName.UTF8String,
44
- dev.uniqueID.UTF8String);
45
+ devices]) {
46
+ if ([dev hasMediaType: AVMediaTypeVideo] ||
47
+ [dev hasMediaType: AVMediaTypeMuxed]) {
48
+ obs_property_list_add_string(dev_list,
49
+ dev.localizedName.UTF8String,
50
+ dev.uniqueID.UTF8String);
51
+ }
52
}
53
54
obs_property_set_modified_callback(dev_list,
55
56
57
bool obs_module_load(void)
58
{
59
+#ifdef __MAC_10_10
60
+ // Enable iOS device to show up as AVCapture devices
61
+ // From WWDC video 2014 #508 at 5:34
62
+ // https://developer.apple.com/videos/wwdc/2014/#508
63
+ CMIOObjectPropertyAddress prop = {
64
+ kCMIOHardwarePropertyAllowScreenCaptureDevices,
65
+ kCMIOObjectPropertyScopeGlobal,
66
+ kCMIOObjectPropertyElementMaster
67
+ };
68
+ UInt32 allow = 1;
69
+ CMIOObjectSetPropertyData(kCMIOObjectSystemObject, &prop, 0, NULL,
70
+ sizeof(allow), &allow);
71
+#endif
72
+
73
obs_source_info av_capture_info = {
74
.id = "av_capture_input",
75
.type = OBS_SOURCE_TYPE_INPUT,
76
obs-studio-18.0.1.tar.xz/plugins/mac-capture/mac-audio.c -> obs-studio-18.0.2.tar.xz/plugins/mac-capture/mac-audio.c
Changed
10
1
2
.type = OBS_SOURCE_TYPE_INPUT,
3
.output_flags = OBS_SOURCE_AUDIO |
4
OBS_SOURCE_DO_NOT_DUPLICATE |
5
- OBS_SOURCE_DO_NOT_MONITOR,
6
+ OBS_SOURCE_DO_NOT_SELF_MONITOR,
7
.get_name = coreaudio_output_getname,
8
.create = coreaudio_create_output_capture,
9
.destroy = coreaudio_destroy,
10
obs-studio-18.0.1.tar.xz/plugins/obs-ffmpeg/CMakeLists.txt -> obs-studio-18.0.2.tar.xz/plugins/obs-ffmpeg/CMakeLists.txt
Changed
10
1
2
${obs-ffmpeg_SOURCES})
3
target_link_libraries(obs-ffmpeg
4
libobs
5
- libff
6
+ media-playback
7
${obs-ffmpeg_PLATFORM_DEPS}
8
${FFMPEG_LIBRARIES})
9
10
obs-studio-18.0.1.tar.xz/plugins/obs-ffmpeg/data/locale/en-US.ini -> obs-studio-18.0.2.tar.xz/plugins/obs-ffmpeg/data/locale/en-US.ini
Changed
25
1
2
Looping="Loop"
3
Input="Input"
4
InputFormat="Input Format"
5
-ForceFormat="Force format conversion"
6
HardwareDecode="Use hardware decoding when available"
7
ClearOnMediaEnd="Hide source when playback ends"
8
Advanced="Advanced"
9
-AudioBufferSize="Audio Buffer Size (frames)"
10
-VideoBufferSize="Video Buffer Size (frames)"
11
-FrameDropping="Frame Dropping Level"
12
-DiscardNone="None"
13
-DiscardDefault="Default (Invalid Packets)"
14
-DiscardNonRef="Non-Reference Frames"
15
-DiscardBiDir="Bi-Directional Frames"
16
-DiscardNonIntra="Non-Intra Frames"
17
-DiscardNonKey="Non-Key Frames"
18
-DiscardAll="All Frames (Careful!)"
19
RestartWhenActivated="Restart playback when source becomes active"
20
+CloseFileWhenInactive="Close file when inactive"
21
+CloseFileWhenInactive.ToolTip="Closes the file when the source is not being displayed on the stream or\nrecording. This allows the file to be changed when the source isn't active,\nbut there may be some startup delay when the source reactivates."
22
ColorRange="YUV Color Range"
23
ColorRange.Auto="Auto"
24
ColorRange.Partial="Partial"
25
obs-studio-18.0.1.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c -> obs-studio-18.0.2.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-nvenc.c
Changed
29
1
2
rc = "CBR";
3
}
4
5
+ /* The "default" preset has been deprecated */
6
+ if (preset && astrcmpi(preset, "default") == 0)
7
+ preset = "hq";
8
+
9
info.format = voi->format;
10
info.colorspace = voi->colorspace;
11
info.range = voi->range;
12
13
obs_data_set_default_int(settings, "keyint_sec", 0);
14
obs_data_set_default_int(settings, "cqp", 23);
15
obs_data_set_default_string(settings, "rate_control", "CBR");
16
- obs_data_set_default_string(settings, "preset", "default");
17
+ obs_data_set_default_string(settings, "preset", "hq");
18
obs_data_set_default_string(settings, "profile", "main");
19
obs_data_set_default_string(settings, "level", "auto");
20
obs_data_set_default_bool(settings, "2pass", true);
21
22
#define add_preset(val) \
23
obs_property_list_add_string(p, obs_module_text("NVENC.Preset." val), \
24
val)
25
- add_preset("default");
26
add_preset("hq");
27
add_preset("hp");
28
add_preset("bd");
29
obs-studio-18.0.1.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-source.c -> obs-studio-18.0.2.tar.xz/plugins/obs-ffmpeg/obs-ffmpeg-source.c
Changed
201
1
2
#include "obs-ffmpeg-compat.h"
3
#include "obs-ffmpeg-formats.h"
4
5
-#include <libff/ff-demuxer.h>
6
-
7
-#include <libswscale/swscale.h>
8
+#include <media-playback/media.h>
9
10
#define FF_LOG(level, format, ...) \
11
blog(level, "[Media Source]: " format, ##__VA_ARGS__)
12
13
static bool video_format(AVCodecContext *codec_context, void *opaque);
14
15
struct ffmpeg_source {
16
- struct ff_demuxer *demuxer;
17
+ mp_media_t media;
18
+ bool media_valid;
19
+ bool destroy_media;
20
+
21
struct SwsContext *sws_ctx;
22
int sws_width;
23
int sws_height;
24
enum AVPixelFormat sws_format;
25
uint8_t *sws_data;
26
int sws_linesize;
27
+ enum video_range_type range;
28
obs_source_t *source;
29
30
char *input;
31
char *input_format;
32
- enum AVDiscard frame_drop;
33
- enum video_range_type range;
34
- int audio_buffer_size;
35
- int video_buffer_size;
36
- bool is_advanced;
37
bool is_looping;
38
- bool is_forcing_scale;
39
bool is_hw_decoding;
40
bool is_clear_on_media_end;
41
bool restart_on_activate;
42
+ bool close_when_inactive;
43
};
44
45
-static bool set_obs_frame_colorprops(struct ff_frame *frame,
46
- struct ffmpeg_source *s, struct obs_source_frame *obs_frame)
47
-{
48
- enum AVColorSpace frame_cs = av_frame_get_colorspace(frame->frame);
49
- enum video_colorspace obs_cs;
50
-
51
- switch(frame_cs) {
52
- case AVCOL_SPC_BT709: obs_cs = VIDEO_CS_709; break;
53
- case AVCOL_SPC_SMPTE170M:
54
- case AVCOL_SPC_BT470BG: obs_cs = VIDEO_CS_601; break;
55
- case AVCOL_SPC_UNSPECIFIED: obs_cs = VIDEO_CS_DEFAULT; break;
56
- default:
57
- FF_BLOG(LOG_WARNING, "frame using an unsupported colorspace %d",
58
- frame_cs);
59
- obs_cs = VIDEO_CS_DEFAULT;
60
- }
61
-
62
- enum video_range_type range;
63
- obs_frame->format = ffmpeg_to_obs_video_format(frame->frame->format);
64
- obs_frame->full_range =
65
- frame->frame->color_range == AVCOL_RANGE_JPEG;
66
-
67
- if (s->range != VIDEO_RANGE_DEFAULT)
68
- obs_frame->full_range = s->range == VIDEO_RANGE_FULL;
69
-
70
- range = obs_frame->full_range ? VIDEO_RANGE_FULL : VIDEO_RANGE_PARTIAL;
71
-
72
- if (!video_format_get_parameters(obs_cs,
73
- range, obs_frame->color_matrix,
74
- obs_frame->color_range_min,
75
- obs_frame->color_range_max)) {
76
- FF_BLOG(LOG_ERROR, "Failed to get video format "
77
- "parameters for video format %u",
78
- obs_cs);
79
- return false;
80
- }
81
-
82
- return true;
83
-}
84
-
85
-bool update_sws_context(struct ffmpeg_source *s, AVFrame *frame)
86
-{
87
- if (frame->width != s->sws_width
88
- || frame->height != s->sws_height
89
- || frame->format != s->sws_format) {
90
- if (s->sws_ctx != NULL)
91
- sws_freeContext(s->sws_ctx);
92
-
93
- if (frame->width <= 0 || frame->height <= 0) {
94
- FF_BLOG(LOG_ERROR, "unable to create a sws "
95
- "context that has a width(%d) or "
96
- "height(%d) of zero.", frame->width,
97
- frame->height);
98
- goto fail;
99
- }
100
-
101
- s->sws_ctx = sws_getContext(
102
- frame->width,
103
- frame->height,
104
- frame->format,
105
- frame->width,
106
- frame->height,
107
- AV_PIX_FMT_BGRA,
108
- SWS_BILINEAR,
109
- NULL, NULL, NULL);
110
-
111
- if (s->sws_ctx == NULL) {
112
- FF_BLOG(LOG_ERROR, "unable to create sws "
113
- "context with src{w:%d,h:%d,f:%d}->"
114
- "dst{w:%d,h:%d,f:%d}",
115
- frame->width, frame->height,
116
- frame->format, frame->width,
117
- frame->height, AV_PIX_FMT_BGRA);
118
- goto fail;
119
-
120
- }
121
-
122
- if (s->sws_data != NULL)
123
- bfree(s->sws_data);
124
- s->sws_data = bzalloc(frame->width * frame->height * 4);
125
- if (s->sws_data == NULL) {
126
- FF_BLOG(LOG_ERROR, "unable to allocate sws "
127
- "pixel data with size %d",
128
- frame->width * frame->height * 4);
129
- goto fail;
130
- }
131
-
132
- s->sws_linesize = frame->width * 4;
133
- s->sws_width = frame->width;
134
- s->sws_height = frame->height;
135
- s->sws_format = frame->format;
136
- }
137
-
138
- return true;
139
-
140
-fail:
141
- if (s->sws_ctx != NULL)
142
- sws_freeContext(s->sws_ctx);
143
- s->sws_ctx = NULL;
144
-
145
- if (s->sws_data)
146
- bfree(s->sws_data);
147
- s->sws_data = NULL;
148
-
149
- s->sws_linesize = 0;
150
- s->sws_width = 0;
151
- s->sws_height = 0;
152
- s->sws_format = 0;
153
-
154
- return false;
155
-}
156
-
157
-static bool video_frame_scale(struct ff_frame *frame,
158
- struct ffmpeg_source *s, struct obs_source_frame *obs_frame)
159
-{
160
- if (!update_sws_context(s, frame->frame))
161
- return false;
162
-
163
- sws_scale(
164
- s->sws_ctx,
165
- (uint8_t const *const *)frame->frame->data,
166
- frame->frame->linesize,
167
- 0,
168
- frame->frame->height,
169
- &s->sws_data,
170
- &s->sws_linesize
171
- );
172
-
173
- obs_frame->data[0] = s->sws_data;
174
- obs_frame->linesize[0] = s->sws_linesize;
175
- obs_frame->format = VIDEO_FORMAT_BGRA;
176
-
177
- obs_source_output_video(s->source, obs_frame);
178
-
179
- return true;
180
-}
181
-
182
-static bool video_frame_hwaccel(struct ff_frame *frame,
183
- struct ffmpeg_source *s, struct obs_source_frame *obs_frame)
184
-{
185
- // 4th plane is pixelbuf reference for mac
186
- for (int i = 0; i < 3; i++) {
187
- obs_frame->data[i] = frame->frame->data[i];
188
- obs_frame->linesize[i] = frame->frame->linesize[i];
189
- }
190
-
191
- if (!set_obs_frame_colorprops(frame, s, obs_frame))
192
- return false;
193
-
194
- obs_source_output_video(s->source, obs_frame);
195
- return true;
196
-}
197
-
198
-static bool video_frame_direct(struct ff_frame *frame,
199
- struct ffmpeg_source *s, struct obs_source_frame *obs_frame)
200
-{
201
obs-studio-18.0.1.tar.xz/plugins/obs-outputs/flv-mux.c -> obs-studio-18.0.2.tar.xz/plugins/obs-outputs/flv-mux.c
Changed
19
1
2
s_wb24(s, get_ms_time(packet, offset));
3
s_write(s, packet->data, packet->size);
4
5
- /* write tag size (starting byte doesnt count) */
6
+ /* write tag size (starting byte doesn't count) */
7
s_wb32(s, (uint32_t)serializer_get_pos(s) + 4 - 1);
8
}
9
10
11
s_w8(s, is_header ? 0 : 1);
12
s_write(s, packet->data, packet->size);
13
14
- /* write tag size (starting byte doesnt count) */
15
+ /* write tag size (starting byte doesn't count) */
16
s_wb32(s, (uint32_t)serializer_get_pos(s) + 4 - 1);
17
}
18
19
obs-studio-18.0.1.tar.xz/plugins/obs-outputs/rtmp-stream.c -> obs-studio-18.0.2.tar.xz/plugins/obs-outputs/rtmp-stream.c
Changed
10
1
2
3
info("Connecting to RTMP URL %s...", stream->path.array);
4
5
- memset(&stream->rtmp.Link, 0, sizeof(stream->rtmp.Link));
6
+ RTMP_Init(&stream->rtmp);
7
if (!RTMP_SetupURL(&stream->rtmp, stream->path.array))
8
return OBS_OUTPUT_BAD_PATH;
9
10
obs-studio-18.0.1.tar.xz/plugins/obs-qsv11/QSV_Encoder.cpp -> obs-studio-18.0.2.tar.xz/plugins/obs-qsv11/QSV_Encoder.cpp
Changed
9
1
2
return QSV_CPU_PLATFORM_HSW;
3
}
4
5
- //assume newer revisions are at least as capable as haswell
6
+ //assume newer revisions are at least as capable as Haswell
7
return QSV_CPU_PLATFORM_INTEL;
8
}
9
obs-studio-18.0.1.tar.xz/plugins/obs-qsv11/QSV_Encoder_Internal.cpp -> obs-studio-18.0.2.tar.xz/plugins/obs-qsv11/QSV_Encoder_Internal.cpp
Changed
10
1
2
}
3
4
for (;;) {
5
- // Encode a frame asychronously (returns immediately)
6
+ // Encode a frame asynchronously (returns immediately)
7
sts = m_pmfxENC->EncodeFrameAsync(NULL, pSurface,
8
&m_pTaskPool[nTaskIdx].mfxBS,
9
&m_pTaskPool[nTaskIdx].syncp);
10
obs-studio-18.0.1.tar.xz/plugins/obs-qsv11/common_directx11.cpp -> obs-studio-18.0.2.tar.xz/plugins/obs-qsv11/common_directx11.cpp
Changed
10
1
2
} else {
3
pSurface->GetDesc(&desc);
4
5
- // copy data only in case of user wants o read from stored surface
6
+ // copy data only in case of user wants to read from stored surface
7
if (memId->rw & WILL_READ)
8
g_pD3D11Ctx->CopySubresourceRegion(pStage, 0, 0, 0, 0, pSurface, 0, NULL);
9
10
obs-studio-18.0.1.tar.xz/plugins/obs-qsv11/common_directx9.h -> obs-studio-18.0.2.tar.xz/plugins/obs-qsv11/common_directx9.h
Changed
10
1
2
class IGFXS3DControl;
3
4
/** Direct3D 9 device implementation.
5
-@note Can be initilized for only 1 or two 2 views. Handle to
6
+@note Can be initialized for only 1 or two 2 views. Handle to
7
MFX_HANDLE_GFXS3DCONTROL must be set prior if initializing for 2 views.
8
9
@note Device always set D3DPRESENT_PARAMETERS::Windowed to TRUE.
10
obs-studio-18.0.1.tar.xz/plugins/obs-qsv11/common_utils.h -> obs-studio-18.0.2.tar.xz/plugins/obs-qsv11/common_utils.h
Changed
10
1
2
void PrintErrString(int err,const char* filestr,int line);
3
4
// LoadRawFrame: Reads raw frame from YUV file (YV12) into NV12 surface
5
-// - YV12 is a more common format for for YUV files than NV12 (therefore the conversion during read and write)
6
+// - YV12 is a more common format for YUV files than NV12 (therefore the conversion during read and write)
7
// - For the simulation case (fSource = NULL), the surface is filled with default image data
8
// LoadRawRGBFrame: Reads raw RGB32 frames from file into RGB32 surface
9
// - For the simulation case (fSource = NULL), the surface is filled with default image data
10
obs-studio-18.0.1.tar.xz/plugins/obs-qsv11/device_directx9.cpp -> obs-studio-18.0.2.tar.xz/plugins/obs-qsv11/device_directx9.cpp
Changed
10
1
2
3
#if defined(WIN32) || defined(WIN64)
4
5
-//prefast singnature used in combaseapi.h
6
+//prefast signature used in combaseapi.h
7
#ifndef _PREFAST_
8
#pragma warning(disable:4068)
9
#endif
10
obs-studio-18.0.1.tar.xz/plugins/obs-qsv11/device_directx9.h -> obs-studio-18.0.2.tar.xz/plugins/obs-qsv11/device_directx9.h
Changed
10
1
2
}; //mfxHandleType
3
4
/** Direct3D 9 device implementation.
5
-@note Can be initilized for only 1 or two 2 views. Handle to
6
+@note Can be initialized for only 1 or two 2 views. Handle to
7
MFX_HANDLE_GFXS3DCONTROL must be set prior if initializing for 2 views.
8
9
@note Device always set D3DPRESENT_PARAMETERS::Windowed to TRUE.
10
obs-studio-18.0.1.tar.xz/plugins/obs-qsv11/obs-qsv11.c -> obs-studio-18.0.2.tar.xz/plugins/obs-qsv11/obs-qsv11.c
Changed
10
1
2
//int iType = iFrame ? 0 : (bFrame ? 1 : (pFrame ? 2 : -1));
3
//int64_t interval = obsqsv->params.nbFrames + 1;
4
5
- // In case MSDK does't support automatic DecodeTimeStamp, do manual
6
+ // In case MSDK doesn't support automatic DecodeTimeStamp, do manual
7
// calculation
8
if (g_pts2dtsShift >= 0)
9
{
10
obs-studio-18.0.1.tar.xz/plugins/rtmp-services/data/package.json -> obs-studio-18.0.2.tar.xz/plugins/rtmp-services/data/package.json
Changed
14
1
2
{
3
"url": "https://obsproject.com/obs2_update/rtmp-services",
4
- "version": 52,
5
+ "version": 56,
6
"files": [
7
{
8
"name": "services.json",
9
- "version": 52
10
+ "version": 56
11
}
12
]
13
}
14
obs-studio-18.0.1.tar.xz/plugins/rtmp-services/data/services.json -> obs-studio-18.0.2.tar.xz/plugins/rtmp-services/data/services.json
Changed
48
1
2
],
3
"recommended": {
4
"keyint": 2,
5
- "max video bitrate": 3500,
6
+ "max video bitrate": 6000,
7
"max audio bitrate": 160,
8
"x264opts": "scenecut=0"
9
}
10
11
"url": "rtmp://singapore.restream.io/live"
12
},
13
{
14
+ "name": "Asia (Seoul, South Korea)",
15
+ "url": "rtmp://seoul.restream.io/live"
16
+ },
17
+ {
18
"name": "Australia (Sydney)",
19
"url": "rtmp://au.restream.io/live"
20
}
21
22
"recommended": {
23
"keyint": 2,
24
"profile": "main",
25
- "max video bitrate": 2000,
26
- "max audio bitrate": 160
27
+ "max video bitrate": 3500,
28
+ "max audio bitrate": 128
29
}
30
},
31
{
32
33
"url": "rtmp://plive.pandora.tv:80/mediaHub"
34
}
35
]
36
+ },
37
+ {
38
+ "name": "LiveStream",
39
+ "servers": [
40
+ {
41
+ "name": "Primary",
42
+ "url": "rtmp://rtmpin.livestreamingest.com/rtmpin"
43
+ }
44
+ ]
45
}
46
]
47
}
48
obs-studio-18.0.1.tar.xz/plugins/win-capture/data/locale/en-US.ini -> obs-studio-18.0.2.tar.xz/plugins/win-capture/data/locale/en-US.ini
Changed
14
1
2
WindowCapture="Window Capture"
3
WindowCapture.Window="Window"
4
WindowCapture.Priority="Window Match Priority"
5
-WindowCapture.Priority.Title="Window Title"
6
-WindowCapture.Priority.Class="Window Class"
7
-WindowCapture.Priority.Exe="Executable Name"
8
+WindowCapture.Priority.Title="Window title must match"
9
+WindowCapture.Priority.Class="Match title, otherwise find window of same type"
10
+WindowCapture.Priority.Exe="Match title, otherwise find window of same executable"
11
CaptureCursor="Capture Cursor"
12
Compatibility="Multi-adapter Compatibility"
13
AllowTransparency="Allow Transparency"
14
obs-studio-18.0.1.tar.xz/plugins/win-capture/game-capture.c -> obs-studio-18.0.2.tar.xz/plugins/win-capture/game-capture.c
Changed
18
1
2
reset_frame_interval(gc);
3
4
obs_enter_graphics();
5
- if (!gs_shared_texture_available())
6
- gc->global_hook_info->force_shmem = true;
7
- obs_leave_graphics();
8
-
9
- obs_enter_graphics();
10
- if (!gs_shared_texture_available())
11
+ if (!gs_shared_texture_available()) {
12
+ warn("init_hook_info: shared texture capture unavailable");
13
gc->global_hook_info->force_shmem = true;
14
+ }
15
obs_leave_graphics();
16
17
return true;
18
obs-studio-18.0.1.tar.xz/plugins/win-capture/get-graphics-offsets/d3d9-offsets.cpp -> obs-studio-18.0.2.tar.xz/plugins/win-capture/get-graphics-offsets/d3d9-offsets.cpp
Changed
183
1
2
3
#ifdef _WIN64
4
5
-#define CMP_SIZE 21
6
-
7
-static const uint8_t mask[CMP_SIZE] =
8
-{0xF8, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00,
9
- 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00,
10
- 0xFF, 0x00,
11
- 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00};
12
-
13
-static const uint8_t mask_cmp[CMP_SIZE] =
14
-{0x48, 0x8B, 0x80, 0x00, 0x00, 0x00, 0x00,
15
- 0x39, 0x80, 0x00, 0x00, 0x00, 0x00,
16
- 0x75, 0x00,
17
- 0x40, 0xB8, 0x00, 0x00, 0x00, 0x00};
18
+#define MAX_CMP_SIZE 22
19
+
20
+static const uint8_t mask[][MAX_CMP_SIZE] = {
21
+ {
22
+ 0xF8, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00,
23
+ 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
24
+ 0xFF, 0x00,
25
+ 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00
26
+ },
27
+ {
28
+ 0xF8, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00,
29
+ 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00,
30
+ 0xFF, 0x00,
31
+ 0xF8, 0xF8, 0x00, 0x00, 0x00, 0x00
32
+ }
33
+};
34
+
35
+static const uint8_t mask_cmp[][MAX_CMP_SIZE] = {
36
+ /*
37
+ * Windows 7
38
+ * 48 8B 83 B8 3D 00 00 mov rax, [rbx+3DB8h]
39
+ * 44 39 B8 68 50 00 00 cmp [rax+5068h], r15d
40
+ * 75 12 jnz short loc_7FF7AA90530
41
+ * 41 B8 F9 19 00 00 mov r8d, 19F9h
42
+ */
43
+ {
44
+ 0x48, 0x8B, 0x80, 0x00, 0x00, 0x00, 0x00,
45
+ 0x44, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00,
46
+ 0x75, 0x00,
47
+ 0x40, 0xB8, 0x00, 0x00, 0x00, 0x00
48
+ },
49
+ /*
50
+ * Windows ???+
51
+ * 49 8B 87 78 41 00 00 mov rax, [r15+4178h]
52
+ * 39 98 E0 51 00 00 cmp [rax+51E0h], ebx
53
+ * 75 12 jnz short loc_1800AEC9C
54
+ * 41 B9 C3 1A 00 00 mov r9d, 1AC3h
55
+ */
56
+ {
57
+ 0x48, 0x8B, 0x80, 0x00, 0x00, 0x00, 0x00,
58
+ 0x39, 0x80, 0x00, 0x00, 0x00, 0x00,
59
+ 0x75, 0x00,
60
+ 0x40, 0xB8, 0x00, 0x00, 0x00, 0x00
61
+ }
62
+};
63
+
64
+// Offset into the code for the numbers we're interested in
65
+static const uint32_t code_offsets[][2] = {
66
+ {3, 10},
67
+ {3, 9},
68
+};
69
#else
70
71
-#define CMP_SIZE 19
72
+#define MAX_CMP_SIZE 20
73
+
74
+static const uint8_t mask[][MAX_CMP_SIZE] = {
75
+ {
76
+ 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00,
77
+ 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00,
78
+ 0xFF, 0x00,
79
+ 0xFF, 0x00, 0x00, 0x00, 0x00
80
+ },
81
+ {
82
+ 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00,
83
+ 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0xFF,
84
+ 0xFF, 0x00,
85
+ 0xFF, 0x00, 0x00, 0x00, 0x00
86
+ }
87
+};
88
89
-static const uint8_t mask[CMP_SIZE] =
90
-{0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00,
91
- 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00,
92
- 0xFF, 0x00,
93
- 0xFF, 0x00, 0x00, 0x00, 0x00};
94
+static const uint8_t mask_cmp[][MAX_CMP_SIZE] = {
95
+ /*
96
+ * Windows 7+
97
+ * 8B 83 E8 29 00 00 mov eax, [ebx+29E8h]
98
+ * 39 B0 80 4B 00 00 cmp [eax+4B80h], esi
99
+ * 75 14 jnz short loc_754CD9E1
100
+ * 68 F9 19 00 00 push 19F9h
101
+ */
102
+ {
103
+ 0x8B, 0x80, 0x00, 0x00, 0x00, 0x00,
104
+ 0x39, 0x80, 0x00, 0x00, 0x00, 0x00,
105
+ 0x75, 0x00,
106
+ 0x68, 0x00, 0x00, 0x00, 0x00
107
+ },
108
+
109
+ /* Windows 10 Creator's Update+
110
+ * 8B 86 F8 2B 00 00 mov eax, [esi+2BF8h]
111
+ * 83 B8 00 4D 00 00 00 cmp dword ptr [eax+4D00h], 0
112
+ * 75 0F jnz short loc_100D793C
113
+ * 68 C3 1A 00 00 push 1AC3h
114
+ */
115
+ {
116
+ 0x8B, 0x80, 0x00, 0x00, 0x00, 0x00,
117
+ 0x83, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
118
+ 0x75, 0x00,
119
+ 0x68, 0x00, 0x00, 0x00, 0x00
120
+ }
121
+};
122
123
-static const uint8_t mask_cmp[CMP_SIZE] =
124
-{0x8B, 0x80, 0x00, 0x00, 0x00, 0x00,
125
- 0x39, 0x80, 0x00, 0x00, 0x00, 0x00,
126
- 0x75, 0x00,
127
- 0x68, 0x00, 0x00, 0x00, 0x00};
128
+// Offset into the code for the numbers we're interested in
129
+static const uint32_t code_offsets[][2] = {
130
+ {2, 8},
131
+ {2, 8},
132
+};
133
#endif
134
135
#define MAX_FUNC_SCAN_BYTES 200
136
137
-static inline bool pattern_matches(uint8_t *byte)
138
+static inline bool pattern_matches(uint8_t *byte, uint32_t *offset1,
139
+ uint32_t *offset2)
140
{
141
- for (size_t i = 0; i < CMP_SIZE; i++) {
142
- if ((byte[i] & mask[i]) != mask_cmp[i])
143
- return false;
144
+ for (size_t j = 0; j < sizeof(mask) / sizeof(mask[0]); j++) {
145
+ for (size_t i = 0; i < MAX_CMP_SIZE; i++) {
146
+ if ((byte[i] & mask[j][i]) != mask_cmp[j][i])
147
+ goto next_signature;
148
+ }
149
+
150
+ *offset1 = code_offsets[j][0];
151
+ *offset2 = code_offsets[j][1];
152
+
153
+ return true;
154
+next_signature:;
155
}
156
157
- return true;
158
+ return false;
159
}
160
161
void get_d3d9_offsets(struct d3d9_offsets *offsets)
162
163
offsets->present_swap = vtable_offset(info.module, info.swap,
164
3);
165
166
+ uint32_t offset1, offset2;
167
for (size_t i = 0; i < MAX_FUNC_SCAN_BYTES; i++) {
168
- if (pattern_matches(&crr[i])) {
169
+ if (pattern_matches(&crr[i], &offset1, &offset2)) {
170
#define get_offset(x) *(uint32_t*)&crr[i + x]
171
-#ifdef _WIN64
172
- uint32_t off1 = get_offset(3);
173
- uint32_t off2 = get_offset(9);
174
-#else
175
- uint32_t off1 = get_offset(2);
176
- uint32_t off2 = get_offset(8);
177
-#endif
178
+ uint32_t off1 = get_offset(offset1);
179
+ uint32_t off2 = get_offset(offset2);
180
181
/* check to make sure offsets are within
182
* expected values */
183
obs-studio-18.0.1.tar.xz/plugins/win-capture/graphics-hook/d3d8-capture.cpp -> obs-studio-18.0.2.tar.xz/plugins/win-capture/graphics-hook/d3d8-capture.cpp
Changed
10
1
2
return false;
3
}
4
5
- hlog("d3d8 memory capture successfull");
6
+ hlog("d3d8 memory capture successful");
7
return true;
8
}
9
10
obs-studio-18.0.1.tar.xz/plugins/win-capture/window-helpers.c -> obs-studio-18.0.2.tar.xz/plugins/win-capture/window-helpers.c
Changed
87
1
2
struct dstr cur_class = {0};
3
struct dstr cur_title = {0};
4
struct dstr cur_exe = {0};
5
- int class_val = 1;
6
- int title_val = 1;
7
- int exe_val = 0;
8
- int total = 0;
9
+ int val = 0x7FFFFFFF;
10
11
if (!get_window_exe(&cur_exe, window))
12
- return 0;
13
+ return 0x7FFFFFFF;
14
get_window_title(&cur_title, window);
15
get_window_class(&cur_class, window);
16
17
- if (priority == WINDOW_PRIORITY_CLASS)
18
- class_val += 3;
19
- else if (priority == WINDOW_PRIORITY_TITLE)
20
- title_val += 3;
21
- else
22
- exe_val += 3;
23
+ bool class_matches = dstr_cmpi(&cur_class, class) == 0;
24
+ bool exe_matches = dstr_cmpi(&cur_exe, exe) == 0;
25
+ int title_val = abs(dstr_cmpi(&cur_title, title));
26
27
+ /* always match by name with UWP windows */
28
if (uwp_window) {
29
- if (dstr_cmpi(&cur_title, title) == 0 &&
30
- dstr_cmpi(&cur_exe, exe) == 0)
31
- total += exe_val + title_val + class_val;
32
- } else {
33
- if (dstr_cmpi(&cur_class, class) == 0)
34
- total += class_val;
35
- if (dstr_cmpi(&cur_title, title) == 0)
36
- total += title_val;
37
- if (dstr_cmpi(&cur_exe, exe) == 0)
38
- total += exe_val;
39
+ if (priority == WINDOW_PRIORITY_EXE && !exe_matches)
40
+ val = 0x7FFFFFFF;
41
+ else
42
+ val = title_val == 0 ? 0 : 0x7FFFFFFF;
43
+
44
+ } else if (priority == WINDOW_PRIORITY_CLASS) {
45
+ val = class_matches ? title_val : 0x7FFFFFFF;
46
+ if (val != 0x7FFFFFFF && !exe_matches)
47
+ val += 0x1000;
48
+
49
+ } else if (priority == WINDOW_PRIORITY_TITLE) {
50
+ val = title_val == 0 ? 0 : 0x7FFFFFFF;
51
+
52
+ } else if (priority == WINDOW_PRIORITY_EXE) {
53
+ val = exe_matches ? title_val : 0x7FFFFFFF;
54
}
55
56
dstr_free(&cur_class);
57
dstr_free(&cur_title);
58
dstr_free(&cur_exe);
59
60
- return total;
61
+ return val;
62
}
63
64
HWND find_window(enum window_search_mode mode,
65
66
67
HWND window = first_window(mode, &parent, &use_findwindowex);
68
HWND best_window = NULL;
69
- int best_rating = 0;
70
+ int best_rating = 0x7FFFFFFF;
71
72
if (!class)
73
return NULL;
74
75
while (window) {
76
int rating = window_rating(window, priority, class, title, exe,
77
uwp_window);
78
- if (rating > best_rating) {
79
+ if (rating < best_rating) {
80
best_rating = rating;
81
best_window = window;
82
+ if (rating == 0)
83
+ break;
84
}
85
86
window = next_window(window, mode, &parent, use_findwindowex);
87
obs-studio-18.0.1.tar.xz/plugins/win-dshow/ffmpeg-decode.c -> obs-studio-18.0.2.tar.xz/plugins/win-dshow/ffmpeg-decode.c
Changed
9
1
2
if (decode->packet_size < new_size) {
3
decode->packet_buffer = brealloc(decode->packet_buffer,
4
new_size);
5
+ decode->packet_size = new_size;
6
}
7
8
memset(decode->packet_buffer + size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
9
obs-studio-18.0.2.tar.xz/plugins/win-dshow/libdshowcapture/.gitattributes
Added
11
1
2
+* text=auto
3
+
4
+*.sln text eol=crlf
5
+*.vcproj text eol=crlf
6
+*.vcxproj text eol=crlf
7
+*.vcxproj text eol=crlf
8
+*.vcxproj.filters text eol=crlf
9
+
10
+cmake/ALL_BUILD.vcxproj.user.in text eol=crlf
11
obs-studio-18.0.1.tar.xz/plugins/win-dshow/win-dshow.cpp -> obs-studio-18.0.2.tar.xz/plugins/win-dshow/win-dshow.cpp
Changed
17
1
2
if (!thread)
3
throw "Failed to create thread";
4
5
+ deactivateWhenNotShowing =
6
+ obs_data_get_bool(settings, DEACTIVATE_WNS);
7
+
8
if (obs_data_get_bool(settings, "active")) {
9
- QueueAction(Action::Activate);
10
+ bool showing = obs_source_showing(source);
11
+ if (!deactivateWhenNotShowing || showing)
12
+ QueueAction(Action::Activate);
13
+
14
active = true;
15
}
16
}
17
obs-studio-18.0.1.tar.xz/plugins/win-ivcam/realsense.cpp -> obs-studio-18.0.2.tar.xz/plugins/win-ivcam/realsense.cpp
Changed
14
1
2
void IVCamSource::CamThread()
3
{
4
pSegServer = SegServer::CreateServer();
5
+
6
+ if (!pSegServer) {
7
+ warn("SegServer::CreateServer failed\n");
8
+ return;
9
+ }
10
+
11
SegServer::ServiceStatus status = pSegServer->Init();
12
13
if (status != SegServer::ServiceStatus::SERVICE_NO_ERROR) {
14
obs-studio-18.0.1.tar.xz/plugins/win-wasapi/win-wasapi.cpp -> obs-studio-18.0.2.tar.xz/plugins/win-wasapi/win-wasapi.cpp
Changed
19
1
2
3
if (!reconnectThread.Valid())
4
blog(LOG_WARNING, "[WASAPISource::Reconnect] "
5
- "Failed to intiialize reconnect thread: %lu",
6
+ "Failed to initialize reconnect thread: %lu",
7
GetLastError());
8
}
9
10
11
info.type = OBS_SOURCE_TYPE_INPUT;
12
info.output_flags = OBS_SOURCE_AUDIO |
13
OBS_SOURCE_DO_NOT_DUPLICATE |
14
- OBS_SOURCE_DO_NOT_MONITOR;
15
+ OBS_SOURCE_DO_NOT_SELF_MONITOR;
16
info.get_name = GetWASAPIOutputName;
17
info.create = CreateWASAPIOutput;
18
info.destroy = DestroyWASAPISource;
19